SQL注入课程体系:
1.数据库注入 - access mysql mssql oracle mongodb postgresql等
2.数据类型注入 - 数字型 字符型 搜索型 加密型(base64 json)等
3.提交方式注入 - get post cookie http头等
4.查询方式注入 - 查询 增加 删除 更新 堆叠等
当对网站进行渗透的时候,会遇到很多不同类型的参数提交方式,参数格式,参数表现形式,都是可能存在注入点的。
如 普通的数字型 ?id=1 与 ?id=MQ== 只是经过一次简单的base64加密在传递参数,并不是就不会存在注入点了,需要我们对注入的思维拓宽,才能找到更多的sql注入。
[ ] 数字型,就是经常遇到的 ?id=1 这种类型。一般开发人员也不会对数字型进行闭合,可以直接后跟注入语句即可 ?id=1 and 1=2 union select database()–+
正常sql语句
s
q
l
=
"
s
e
l
e
c
t
∗
f
r
o
m
s
y
g
u
e
s
t
b
o
o
k
w
h
e
r
e
g
T
p
l
=
′
sql="select * from sy_guestbook where gTpl='
sql="select∗fromsyguestbookwheregTpl=′g’";
注入语句:simple’ order by 16–+
当代入其中:$sql=“select * from sy_guestbook where gTpl=‘simple’ order by 16–+'”;正好将后面的一个单引号注释掉,也就是–+的作用是将后面的一个单引号注释掉
搜索型:,往往有搜索框的地方也是可能存在注入的,因为很多内容都是存储在数据库中,想要完成搜索,就需要与数据库进行数据交互,如果没有做到安全的过滤或其他的防护手段往往也是会存在SQL注入的。常规的搜索处后台SQL语句是 select value from test where value like “%$_GET[‘value’]%” ,这个时候我们想要对其进行注入,就需要考虑到闭合双引号及通配符的问题了。
select from sy_guestbook where gName like ‘%$s%’
演示%'UNION+ALL+SELECT+1,datab,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 and ‘%’=
selectfrom sy guestbook where gName like ‘%演示%’ UNION+ALL+SELECT+1,database0).3,4.5,6,7,8,9,10,11,12,13,14,15,16,17 and ‘%’=’
加密/编码型,有时候会遇到 id=MQ这种传输id值时,值为加密的base64或是其他,我们想要对其进行测试时,就需要将我们构造的payload进行base64加密后在进行测试【注意:在加密的过程中必须要做到统一,不能MQ and 1=2这种强行转换,而是将MQ== 解码后再和and 1=2一起转换】
Json格式,有时候会有 {“id”:1}这种格式的参数传递时,我们注入就需要考虑到json的特殊格式。在进行构造payload
SQLmap的进阶利用
sqlmap 的tamper利用
当我们测试的注入点是 base64加密,或者是对我们输入的 ’ ’ “” /等内容进行转义时
只需要我们在使用sqlmap时,加上对应的参数,启用相对的脚本绕过即可
如遇到base64加密的参数值想要对其进行注入时
python sqlmap.py -r 1.txt --tamper=base64encode.py 即可 sqlmap会自动对payload进行加密
如遇到对我们输入的 ’ ’ “” /转义时,手注时常用到的绕过放法就是使用 宽字节的方法进行绕过
如手注入的payload应该为 ?id=1 %23’ union select database() --+ 这样才可以正常的让单引号发挥作用去闭合原本的sql语句中的单引号
我们在使用sqlmap注入时,只需要
python sqlmap.py -r 1.txt --tamper=unmagicquotes.py 启用这个脚本即可,就可以让sqlmap智能得在payload中加入宽字节等方法绕过转义函数。
启用对接受到的字符串进行转义的方法可以使用mysql的内置功能 magicquotes 或php的内置函数addslashes(),但是使用tamper=unmagicquotes.py这个脚本时都是可以成功pass的。
更多sqlmap的详细用法参考:1. sqlmap超详细笔记+思维导图 - bmjoker - 博客园 (cnblogs.com)