Command Injection:命令注入,在PHP文件中存在执行命令的模块,例如在常见的使用ping工具时,通过
&
、||
等符号进行拼接,构造恶意的命令,以达到获取用户信息的目的。PHP命令注入是常见的一种形式,好多CMS都曾出现过这种漏洞
low level
查看代码:
<?php
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 "<pre>{$cmd}</pre>";
}
?>
代码分析:
stristr()函数:搜索字符串在另一字符串中的第一次出现,并且返回字符串的剩余部分;
php_uname(mode)函数:返回运行php系统的相关信息描述;
mode 是单个字符,用于定义要返回什么信息:
‘a’:此为默认。包含序列 “s n r v m” 里的所有模式。
’s’:操作系统名称。例如: FreeBSD。
‘n’:主机名。例如: localhost.example.com。
‘r’:版本名称,例如: 5.1.2-RELEASE。
‘v’:版本信息。操作系统之间有很大的不同。
‘m’:机器类型。例如:i386。
可以看到,源码中对ping功能 模块没有任何限制,可以直接进行测试:
windows和linux都可以用&&
进行命令拼接:
e.g:127.0.0.1 && whoami
执行效果:
当然,这里还可以用其他命令,例如ipconfig
、net user
等等
若是系统在linux下,甚至可以用127.0.0.1 && cat /etc/shadow
读取信息,该漏洞危害巨大…
medium level
查看源码:
这里可以看到,源码对字符&&
和;
进行了删除过滤,但是这只是限制了一部分,还可以用&
、&&&
等等来进行拼接:
这里&&
被删除了,最终执行的是127.0.0.1 & whoami
这里有一点需要注意:
命令1&&
命令2 :表示 命令1执行成功才会执行命令2
命令1&
命令2 :表示 命令1无论是否成功都会执行命令2
两者的区别:
这里有好多方式绕过源码限制:还可以&
和;
合并使用:&;&;
这里是因为;
被过滤删除,最终执行的是127.0.0.1 && whoami
,这个可以自己挖掘,只要可以绕过都可以执行~
high level
分析源码:
这里过滤了好多字符,不过先用之前的测试一下~
用之前的命令测试了一遍都不可以,但是在观察过滤时发现过滤|
时后边有个空格
这里可以直接用127.0.0.1 |whoami
绕过,在敲命令时,我们会习惯性一个命令一个空格,因此这里可以绕过:
命令1
|
命令2
|
是管道符,表示将命令1的输出作为命令2的输入,并且只打印命令2执行的结果。
这个只是黑名单的“漏网之鱼”,所以我们在实战中要仔细认真分析源码,往往会有意外惊喜~
impossible level
分析源码:
函数分析:
stripslashes()
:函数会删除字符串string中的反斜杠,返回已剥离反斜杠的字符串。
explode(separator,string,limit)
:把字符串打散为数组,返回字符串的数组。参数separator
规定在哪里分割字符串,参数string
是要分割的字符串,可选参数limit
规定所返回的数组元素的数目,这里没用这个限制参数。
is_numeric(string)
:检测string
是否为数字或数字字符串,如果是返回TRUE
,否则返回FALSE
。
可以看到,Impossible level的代码对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。
<小白初试,请大佬多多指教>