Web網絡安全分析Union註入攻擊原理詳解

1、Union註入攻擊

Union註入攻擊的測試地址:http://127.0.0.1/sqli/union.php?di=1。

訪問該網址時,頁面返回的結果如圖6所示。

圖6 訪問id=1時頁面的結果

在URL後添加一個單引號,再次訪問,如圖7所示,頁面返回結果與id=1的結果不同。

 

圖7 訪問id=1’時頁面的結果

訪問id=1 and 1=1,由於and 1=1為真,所以頁面應返回與id=1相同的結果,如圖8所示。訪問id=1 and 1=2,由於and 1=2為假,所以頁面應返回與id=1不同的結果,如圖9所示。

 

圖8 訪問id=1 and 1=1時頁面的結果

 

圖9 訪問id=1 and 1=2時頁面的結果

可以得出該網站可能存在SQL註入漏洞的結論。

接著,使用order by 1-99語句查詢該數據表的字段數量,如訪問id=1 order by 3,頁面返回與id=1相同的結果,如圖10所示。

訪問id=1 order by 4,頁面返回與id=1不同的結果,則字段數位3,如圖11所示。

 

圖10 訪問d=1 order by 3時頁面的結果

 

圖11 訪問d=1 order by 4時頁面的結果

在數據庫中查詢參數ID對應的內容,然後將數據庫的內容輸出到頁面,由於是將數據輸出到頁面上的,所以可以使用Union註入,且通過order by查詢結果,得到字段數為3,所以Union註入的語句如下所示。

union select 1,2,3

如圖12所示,可以看到頁面成功執行,但沒有返回union select的結果,這是出於代碼隻返回第一條的結果,所以union select獲取的結果沒有輸出到頁面。

 

圖12 訪問id=1 union select 1,2,3時頁面的結果

可以通過設置參數ID值,讓服務端返回union select的結果,例如,把ID的值設置為-1,這樣數據庫中沒有id=-1的數據,所以會返回union select的結果,如圖13所示。

 

圖13 訪問id=-1 union select 1,2,3時頁面的結果

返回結果為2 : 3,意味著在union select 1,2,3中,2和3的位置可以輸入MySQL語句。我們嘗試在2的位置查詢當前數據庫名(使用database()函數),訪問od=-1 union delect 1,database(),3,頁面成功返回瞭數據庫信息,如圖14所示。

 

圖14 利用Union註入獲取database()

得知瞭數據庫名後,接下來輸入以下命令查詢表名(數據庫名test根據實際情況進行替換)。

select table_name from information_schema.tables where table_schema='test' limit 0,1

嘗試在2的位置粘貼語句,這裡需要加上括號,結果如圖15所示,頁面返回瞭數據庫的第一個表名。如果需要看第二個表名,則修改limit中的第一位數字,例如使用limit 1,1就可以獲取數據庫的第二個表名,如圖16所示。

 

圖15 利用Union註入獲取第一個表名

 

圖16 利用Union註入獲取第二個表名

現在所有的表名全部查詢完畢,已知數據庫名和表名,開始查詢字段名,這裡以emails表名為例,查詢語句如下所示。

select column_name from information_schema.columns where table_schema='test' and table_name='emails' limit 0,1

嘗試在2和3的位置粘貼語句,括號還是不可少,結果如圖17所示,獲取瞭emails表的第一個和第二個字段名。

 

圖17 利用Union註入獲取第一個和第二個字段名

當獲取瞭庫名、表名和字段名時,就惡意構造SQL語句查詢數據庫的數據,例如查詢字段email_id對應的數據,構造的SQL語句如下所示。

select email_id from test.emails limit 0,1

結果如圖18所示,頁面返回瞭email_id的第一條數據。

 

圖18 利用Union註入獲取數據

2、Union註入代碼分析

在Union註入頁面中,程序獲取GET參數ID,將ID拼接到SQL語句中,在數據庫中查詢參數ID隨影的內容,然後將第一條查詢結果中的username和address輸出到頁面,由於是將數據輸出到頁面上的,所以可以利用Union語句查詢其他數據,頁面源代碼如下。

<?php
$con=mysqli_connect("localhost","root","root","test");
// 檢測連接
if (mysqli_connect_errno())
{
    echo "連接失敗: " . mysqli_connect_error();
}
$id = @$_GET['id'];

$result = mysqli_query($con,"select * from users where `id`=".$id);
if (!$result)
{
    exit();
}
$row = mysqli_fetch_array($result);
echo @$row['username'] . " : " . @$row['password'];
echo "<br>";
?>

當訪問id=1 union select 1,2,3時,執行的SQL語句為:

select * from users where 'id'=1 union select 1,2,3

以上就是Web網絡安全分析Union註入攻擊原理詳解的詳細內容,更多關於Web網絡安全Union註入攻擊的資料請關註WalkonNet其它相關文章!

推薦閱讀: