PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一,国内著名的Web开发框架thinkPHP;Web应用程序Discuz!、DedeCMS、PHPcms、帝国cms等都曾经存在过该类型高危漏洞。
0x2.1 实验1:不安全的功能实现方式
这里这个和DVWA的远程命令执行差不多 我们看看源码
<?php // IP(域名) $host = isset($_GET['url']) ? $_GET['url'] : ''; // 判断$host是否为空 if(empty($host)){ $result = ''; $target = ''; } else { // 获取$host值 $target = $host; // 判断当前系统类型,执行对应函数 if( stristr( php_uname( 's' ), 'Windows NT' ) ) { // Windows系统 $cmd = shell_exec( 'ping ' . $target ); // 未过滤函数 // $cmd = shell_exec('ping '. escapeshellcmd($target)); // escapshellcmd过滤 } else { // *nix系统 $cmd = shell_exec( 'ping -c 4 ' . $target ); // 未过滤函数 // $cmd = shell_exec('ping -c 4 '. escapeshellcmd($target)); // escapshellcmd过滤 } // 格式化输出结果,将$cmd字符串中的“ ”替换为“<br>” $result = str_replace(" ","<br>",$cmd); } ?>
可以看见 ping功能直接使用了shell_exec来执行 且未对输入参数进行任何的过滤,那么远程代码执行就这样产生了
我们执行看看 (这里要注意 cmd的分隔符 那些是第一个执行成功第二个执行 ,第一个执行失败第二个也执行)
|ls
证实,只要是Linux的shell命令,都可以通过该payload的构造出想要去执行的shell命令,等同于给你一台可以操作的Linux服务器,你想怎么操作就怎么操作!这就是远程函数执行命令的高危漏洞
0x2.2 漏洞产生与攻击原理分析
漏洞的产生:
1、需求开发时候使用了shell_exec()危险函数来快速实现功能;
2、即使使用了危险函数也没有做过滤处理;
3、没有绕开危险函数来实现业务需求相同的功能。
攻击的原理:
shell_exec()
通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。也就是说, PHP先运行一个shell环境, 然后让shell进程运行你的命令, 并且把所有输出已字符串形式返回, 如果程序执行有错误或者程序没有任何输出, 则返回null。
//函数用法 shell_exec ( string $cmd ) : string
命令执行顺序:
payload 顺序执行
baidu.com|ls|di
|
命令链接符的执行顺序命令1、命令2、命令3;所以最终显示最后执行的命令3dir
payload 批量执行
baidu.com;ls;di
;
命令链接符是命令1、命令2、命令3依次一起执行,所以显示了全部命令的执行结果。
0x2.3 总结
为什么构造payload时候用到|
和;
字符呢?|
和;
是命令的链接符,同时&
可以用做命令链接符,但&
与别的链接符不同的是,它不能直接放在url上访问执行,只能通过提交get/post表单;如果需要直接放在url上访问,那么需要有url编码%26
,不然会被当成参数分隔符;
另外&&
和ll
也可以使用,但他们运行原理又不是很相近。
所有的命令分割符如何构造payload呢?
在实验过程中我们我们得知在url链接上可以使用|
和;
进行构造payload;其实他们也可以和&
一样,用url编码进行访问。另外当我们在get表单提交数据的时候,提交的参数会被转成url编码。|
url编码 %7C
;
url编码 %3B
&
url编码 %26
空格
url编码 %20
符号与url编码在构建payload时候很重要,建议大家在实际实验过程中去理解。