任意命令执行漏洞浅析

0x00概念

是指攻击者可以随意执行系统命令


0x01成因

部分web应用程序在调用系统命令时,未对用户输入的指令进行过滤。


0x02漏洞分类

①代码层过滤不严格

②系统自身的漏洞-->bash破壳漏洞(CVE-2014-6271)

③第三方组件存在漏洞

WordPress:ImageMagick漏洞

Java:Struts2漏洞


0x03漏洞利用(以代码层为例)

--sysem($data)--

可控点直接是待执行的程序,我们如果能直接控制它,就能执行任意命令。


--sysem("/bin/prog $data")--

可控点是传入程序的整个参数,我们可以直接利用&&或|等等,利用管道命令来执行其它命令。

如果$data被escapeshellcmd(除去字符串中的特殊符号)函数处理了,我们可以看看这个程序自身是否有“执行外部命令”的参数或功能,比如Linux下的sendmail命令自带读写文件的功能,我们可以用来写webshell。


--sysem("/bin/prog -p $data")--

可控点是传入程序的某个参数值,同样可以使用前者的方法进行绕过。


--sysem("/bin/prog -p '$data' ")--

可控点是传入程序的某个参数值并用单引号包裹,我们要先闭合单引号才可以执行命令。如:system("/bin/prog -p 'aaa' | id ")


--sysem("/bin/prog -p \"$data\" ")--

可控点是传入程序的某个参数值并用双引号包裹。分两种情况绕过:

①引号未转义,我们可以先闭合引号再用管道命令进行绕过。

②引号被使用addslashes函数转义,这种情况下我们可以在双引号内利用反引号(键盘上的波浪线按键)执行任意命令。


0x04修复方案

尽量少使用执行命令的函数,并在php.ini中的disable_functions中禁止相关函数。

对于可控点是程序整个参数的情况,使用escapeshellcmd函数进行过滤。

对于可控点是程序某个参数值的情况,使用escapeshellarg(给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号)函数进行过滤。

参数值尽量使用引号包裹,并调用addslashes(在引号前面添加反斜杠)函数进行转义。

你可能感兴趣的:(渗透学习笔记)