0x01 Command Injection 简介
命令执行是指攻击者通过浏览器或者其他客户端软件提交一些cmd命令(或者bash命令)至服务器程序,服务器程序通过system、eval、exec等函数直接或者间接地调用cmd.exe执行攻击者提交的命令。
0x02 Windows下逻辑符号简介
我们这篇文章上面需要的逻辑符号都在下面那个链接上,想要深入了解的同学可以参考一下这位同学的文章,写的很详细,这里我们就不多说了!
0x03 LOW
直接看代码吧,LOW级别的代码很简单,没什么防护机制
if( isset($_POST['Submit'] ) ) {
// Get input
$target=$_REQUEST['ip'];
// Determine OS and execute the ping command.
if(stristr(php_uname('s'),'Windows NT') ) {
// Windows
$cmd=shell_exec('ping '.$target);
}
else {
// *nix
$cmd=shell_exec('ping -c 4 '.$target);
}
// Feedback for the end user
echo"
{$cmd}";
}
?>
LOW级别的代码是在获取用户POST提交上来的值之后,在不为空的情况下,就直接调用shell_exec函数执行系统的ping命令。我们可以利用这个shell_exec函数在加上windows下的一些逻辑符,让其执行其他的系统命令
&逻辑符号:127.0.0.1 & net user
| 逻辑符号:127.0.0.1 | net user
&&逻辑符号:127.0.0.1&&net user
||逻辑符号: || net user
low级别的很简单,如果各位师傅有什么好的姿势,也可以在评论区留言,虽然知道看的人比较少,哈哈哈!
0x03 Medium
我们直接看代码吧,Medium级别的代码也挺简单的,简洁明了,这个命令注入的代码都好简单。
if( isset($_POST['Submit'] ) ) {
// Get input
$target=$_REQUEST['ip'];
// Set blacklist
$substitutions= array(
'&&'=>'',
';'=>'',
);
// Remove any of the charactars in the array (blacklist).
$target=str_replace(array_keys($substitutions),$substitutions,$target);
// Determine OS and execute the ping command.
if(stristr(php_uname('s'),'Windows NT') ) {
// Windows
$cmd=shell_exec('ping '.$target);
}
else {
// *nix
$cmd=shell_exec('ping -c 4 '.$target);
}
// Feedback for the end user
echo"
{$cmd}"; }?>
Medium级别的代码主要是新建了一个黑名单数组$substitutions,对用户输入的内容中的‘&&’与分号‘;’,用PHP的str_replace进行过滤,将他们转化为空格,以达到过滤用户输入,防止命令注入的目的,代码片段如下:
$substitutions= array(
'&&'=>'',
';'=>'',
);
// Remove any of the charactars in the array (blacklist).
$target=str_replace(array_keys($substitutions),$substitutions,$target);
绕过这个防护就很简单了,他只过滤了&&符号,和分号,那我们可以用其他的逻辑符号,比如&,||,|等。这里的具体效果跟Low级别的一样,我就不再重复截图了。下面我们直接看High级别的代码。
0x03 High
个人来说High级别的代码也很简单,只是在Medium的基础上加了更多的黑名单符号,我们来看下具体的代码。
if( isset($_POST['Submit'] ) ) {
// Get input
$target=trim($_REQUEST['ip']);
// Set blacklist
$substitutions= array(
'&'=>'',
';'=>'',
'| '=>'',
'-'=>'',
'$'=>'',
'('=>'',
')'=>'',
'`'=>'',
'||'=>'',
);
// Remove any of the charactars in the array (blacklist).
$target=str_replace(array_keys($substitutions),$substitutions,$target);
// Determine OS and execute the ping command.
if(stristr(php_uname('s'),'Windows NT') ) {
// Windows
$cmd=shell_exec('ping '.$target); }
else {
// *nix
$cmd=shell_exec('ping -c 4 '.$target);
}
// Feedback for the end user
echo"
{$cmd}";
}
?>
好家伙,这货几乎把所有window下的逻辑功能符都禁了,但看认真看代码,你会发现,这代码没有把&&给禁掉,只是把&给进了黑名单。
$substitutions= array(
'&'=>'',
';'=>'',
'| '=>'',
'-'=>'',
'$'=>'',
'('=>'',
')'=>'',
'`'=>'',
'||'=>'',
);
一直以为他过滤的是‘|’符号,没想到他过滤的是‘| ’,记住是‘|’后面加空格,问了好久,要是不团队老哥的提醒还有CTF群里pcat师傅的提醒,我都没注意到。真的是。。。。。,既然他过滤的是‘|’后面加空格,那我们直接构造个命令:
command1|command2.就可以直接绕过了。
0x04 总结
代码审计要细心,自己还是太浮躁了,真的,人一浮躁什么事都干不了。
平常心,平常心!
领取专属 10元无门槛券
私享最新 技术干货