1、什么是远程代码执行漏洞
远程代码执行:remote code execute
远程命令执行:remote command execute
它允许攻击者在未经授权的情况下远程执行代码,这通常是因为应用程序或服务器在处理输入时没有进行适当的过滤和验证,从而导致恶意输入被执行。攻击者可以通过发送特殊的请求或注入恶意代码来实现这一目标。一旦成功利用了远程代码执行漏洞,攻击者能够获得对目标的完全访问权,从而可能窃取敏感信息、篡改数据或破坏系统。
全是RCE;
2、漏洞危害:
获取服务器权限
获取敏感数据文件
写入恶意文件getshell
植入木马病毒勒索软件等
3、php语言中可能会出现RCE漏洞的函数
(1)命令command注入涉及的函数
函数 | 作用 |
---|---|
system() | 执行外部程序,并且显示输出 |
exec()/shell_exec() | 通过shell环境执行命令,并且将完整的输出以字符串的方式返回 |
pcntl_exec() | 在当前进程空间执行指定程序 |
passthru() | 执行外部程序并且显示原始输出 |
popen() | 打开进程文件指针 |
proc_open() | 执行一个命令,并且打开用来输入/输出的文件指针 |
(2)代码code注入涉及函数
函数 | 作用 |
---|---|
eval() | 把字符串 code 作为PHP代码执行 |
assert() | 检查一个断言是否为 false |
preg_replace() | 执行一个正则表达式的搜索和替换 |
create_function() | 创建一个匿名函数并且返回函数名称 |
call_user_func()/call_user_func_array() | 把第一个参数作为回调函数调用 |
usort()/uasort() | 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 |
4、RCE漏洞防御
开源框架要升级到最新版本;
尽量不要使用命令执行的函数;
如果必须使用命令执行的函数,必须要做白名单;
用正则表达式对用户输入的内容进行处理;
使用WAF
5、一些基础知识
(1)Windows命令拼接符号
符号 | 含义 | 示例 |
---|---|---|
& | 简单的拼接符号 | ping 127.0.0.1&echo 'hello' |
&& | 左边命令执行成功后,右边的才执行 | ping 127.0.0.1 && echo 'hello' |
| | 上一条命令的输出,作为下一条命令的参数 | netstat -ano|findstr 3306 |
|| | 左边命令执行失败,右边的才执行 | ping baidu.com || ping baidu.net |
(2)Linux命令拼接符号
符号 | 含义 | 示例 |
---|---|---|
; | 没有任何逻辑关系的连接符 | |
&& | 左边命令执行成功后,右边的才执行 | cp 1.txt 2.txt && cat 2.txt |
| | 上一条命令的输出,作为下一条命令的参数 | netstat -an|grep 3306 |
|| | 左边命令执行失败,右边的才执行 | cat 3.txt ||cat2.txt |
& | 任务后台执行,与nohup命令功能差不多 | java -jar test.jar > log.txt & |
6、防御手段的绕过
linux命令中
当过滤cat的时候:
可以替换的命令: cat :由第一行开始显示内容,并将所有内容输出 tac :从最后一行倒序显示内容,并将所有内容输出 more :根据窗口大小,一页一页的现实文件内容 less :和more类似,但其优点可以往前翻页,而且进行可以搜索字符 head :只显示头几行 tail :只显示最后几行 nl :类似于cat -n,显示时输出行号 tailf :类似于tail -f
当过滤空格时:
可以替换的命令:使用IFS$9、%09、<、>、<>、{,}、%20、${IFS}、${IFS}来代替空格
当过滤目录分隔符(/ \)时:
可以替换的命令:使用;或者%0a代替目录分隔符/
当过滤运特定名称时:
例如:屏蔽flag 此时我们可以用f***来代替flag。