PHP的命令执行漏洞学习
首先我们来了解基础
基础知识来源于:<web安全攻防>徐焱
命令执行漏洞
应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system、exec、shell_exec、passthru、popen、proc_popen等函数可以执行系统命令。当黑客能控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行漏洞,这就是命令执行漏洞。
先了解下这些知识
Windows管道符
“|”:直接执行后面的语句。如:ping 127.0.0.1|whoami
“||”:如果前面执行的语句出错泽执行后面的语句,前面的语句智能为假 如:ping 2 || whoami
“&”:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假 如 ping 127.0.0.1&whoami
“&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真。例如:ping 127.0.0.1&&whoami
Linux管道符
“;”:执行完前面的语句再执行后面的 例如:ping 127.0.0.1;whoami
“|”:显示后面语句的执行结果 例如:ping 127.0.0.1|whoami
“||”:当前面的语句只能怪出错时,执行后面的语句,例如:ping 1||whoami
“&”:如果当前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如:ping 127.0.0.1&whoami
“&&”:如果前面的语句为假则直接出错,也不执行后面的,前面的语句只能为真 例如:ping 127.0.0.1&&whoami
测试学习我们可以写一个简单的PHP
1 <?php 2 3 echo system(“pint -n 2 ”.$_GET[‘IP’]); 4 5 ?>
搭建好我们可以进行简单漏洞攻击 如图我们执行了查看系统当前用户命令
DVWA靶场的命令执行漏洞
LOW
Low Command Injection Source
先分析代码!
1. <?php 2. 3. if( isset( $_POST[ 'Submit' ] ) ) { 4. // Get input 5. $target = $_REQUEST[ 'ip' ]; 6. 7. // Determine OS and execute the ping command. 8. if( stristr( php_uname( 's' ), 'Windows NT' ) ) { 9. // Windows 10. $cmd = shell_exec( 'ping ' . $target ); 11. } 12. else { 13. // *nix 14. $cmd = shell_exec( 'ping -c 4 ' . $target ); 15. } 16. // Feedback for the end user 17. echo "<pre>{$cmd}</pre>"; 18. } 19. 20. ?>
我们分析这个靶场的代码可以看到$_REQUEST接受用户传过来的值 我们并没有看到有什么过滤机制的代码所以 可以输入任何东西。
测试执行ping127.0.0.1没问题 我们利用管道命令来 再加命令语句
我这边环境时本地windows我们选用windows的管道符 来执行 OK
Medium
Medium Command Injection Source
继续先分析代码
1. <?php 2. if( isset( $_POST[ 'Submit' ] ) ) { 3. // Get input 4. $target = $_REQUEST[ 'ip' ]; 5. // Set blacklist 6. $substitutions = array( 7. '&&' => '', 8. ';' => '', 9. ); 10. // Remove any of the charactars in the array (blacklist). 11. $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); 12. // Determine OS and execute the ping command. 13. if( stristr( php_uname( 's' ), 'Windows NT' ) ) { 14. // Windows 15. $cmd = shell_exec( 'ping ' . $target ); 16. } 17. else { 18. // *nix 19. $cmd = shell_exec( 'ping -c 4 ' . $target ); 20. } 21. // Feedback for the end user 22. echo "<pre>{$cmd}</pre>"; 23. }
我们注意6-9行 这里是个黑名单过滤 我们可以想办法绕过 这里虽然把&&和分号;加入了黑名单,但是我们还可以用逻辑或(||)、管道符(|)或(&)来命令执行 绕过