章节1:远程代码执行渗透与防御
01 什么是远程代码执行?
远程代码执行(RCE漏洞)
远程代码执行:Remote Code Execute
远程命令执行(命令注入漏洞):Remote Command Execute
定义: 在我们的程序里,由于要达到实现某些业务的目的,我们预留了一些去执行命令或代码的接口,我们还把接口提供给外部用户去使用,最后这个接口又被黑客所利用,造成了一些后果。
rce远程代码执行漏洞是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器,防火墙,入侵检测设备的web管理界面,一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该ip地址进行一次ping测试,并返回测试结果。而,如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者从该接口提交“意想不到”的命令,从而让后台执行,从而控制整个后台服务器
漏洞危害
- 获取服务器权限
- 获取敏感数据文件
- 写入恶意文件getshell
- 植入木马病毒勒索软件等
https://mp.weixin.qq.com/s/d8citoIBpMQKsVf931PLFw
实际漏洞
-
CVE-2021-3177 Python RCE漏洞
-
CVE-2021-21972 VMWare RCE漏洞
-
CVE-2021-25646 Apache Druid RCE漏洞
-
CNVD-2020-46552 深信服EDR
-
CNVD-2021-30101 网康下一代防火墙
-
http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=RCE
02 PHP RCE涉及函数
(没必要记忆,有大概印象即可)
命令command注入
函数 | 作用 |
---|---|
system() | 执行外部程序,并且显示输出 |
exec()/shell_exec() | 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回 |
pcntl_exec() | 在当前进程空间执行指定程序 |
passthru() | 执行外部程序并且显示原始输出 |
popen() | 打开进程文件指针 |
proc_open() | 执行一个命令,并且打开用来输入/输出的文件指针 |
代码code注入
函数 | 作用 |
---|---|
eval() | 把字符串 code 作为PHP代码执行 |
assert() | 检查一个断言是否为false |
preg_replace() | 执行一个正则表达式的搜索和替换 |
create_function() | 创建一个匿名函数并且返回函数名称 |
call_user_func()/call_user_func_array() | 把第一个参数作为回调函数调用 |
usort()/uasort() | 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 |
03 靶场案例
Windows命令拼接符号
符号 | 含义 | 示例 |
---|---|---|
&& | 左边的命令执行成功,右边的才执行 | ping 127.0.0.1 && echo ‘hello’ |
& | 简单的拼接 | ping 1111 & echo ‘hello’ |
| | 上一条命令的输出,作为下一条命令参数 | netstat -ano | findstr 3306 |
|| | 左边的命令执行失败,右边的才执行 | ping baidu.com || ping baidu.net |
Linux命令拼接符号
符号 | 含义 | 示例 |
---|---|---|
; | 没有任何逻辑关系的连接符 | |
&& | 左边的命令执行成功,右边的才执行 | cp 1.txt 2.txt && cat 2.txt |
| | 上一条命令的输出,作为下一条命令参数 | netstat -an | grep 3306 |
|| | 左边的命令执行失败,右边的才执行 | cat 3.txt ||cat 2.txt |
& | 任务后台执行,与nohup命令功能差不多 | java -jar test.jar > log.txt & |
pikachu
ping payload
127.0.0.1 & ipconfig
127.0.0.1 & whoami
eval payload phpinfo();
POST请求,参数为txt,可以用中国蚁剑连接
DVWA
payload
127.0.0.1 & ipconfig
127.0.0.1 & net user hacker /add
05 RCE防御
防御
- 开源框架,升级到最新版本
- 尽量不要使用命令执行的函数
- 如果必须使用,需要做白名单处理
- 用正则表达式对用户输入的内容进行处理
- 使用WAF