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行 这里是个黑名单过滤 我们可以想办法绕过    这里虽然把&&和分号;加入了黑名单,但是我们还可以用逻辑或(||)、管道符(|)或(&)来命令执行  绕过

 

 

posted @ 2019-05-15 17:14  笑花大王  阅读(2848)  评论(0编辑  收藏  举报