目錄
- 1.8 報錯注入攻擊
- 1.9 報錯注入代碼分析
1.8 報錯注入攻擊
??報錯注入攻擊的測驗地址:http://127.0.0.1/sqli/error.php?username=1,
??訪問該網址時,頁面回傳ok,如圖28所示,
圖28 訪問username=1時頁面的的結果
??訪問http://127.0.0.1/sqli/error.php?username=1’,因為引數username的值是1’,在資料庫中執行SQL時,會因為多了一個單引號而報錯,輸出到頁面的結果如圖29所示,
圖29 訪問username=1'時頁面的的結果
??通過頁面回傳結果可以看出,程式直接將錯誤資訊輸入到了頁面上,所以此處可以利用報錯注入獲取資料,報錯注入有多種格式,此處利用函式updatexml()延時SQL陳述句獲取user()的值,SQL陳述句如下所示,
' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+
Updatexml()函式:Updatexml(xml_target,xpath_expr,new_xml)
- xml_target:需要操作的xml片段
- xpath_expr:需要更新的xml路徑(Xpath格式)
- new_xml:更新后的內容
??其中0x7e是ASCII編碼,解碼結果為~,如圖30所示,
圖30 利用updatexml獲取user()
??然后嘗試獲取當前資料庫的庫名,如圖31所示,陳述句如下所示,
' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
圖31 利用updatexml獲取database()
??接著可以利用select陳述句繼續獲取資料庫中的庫名、表名和欄位名,查詢陳述句與Union注入的相同,因為報錯注入只顯示一條結果,所以需要使用limit陳述句,構造的陳述句如下所示,
' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1)--+
??結果如圖32所示,以此類推,可以獲取所有資料庫的庫名,
圖32 利用報錯注入獲取資料庫名
??如圖33所示,構造查詢表的陳述句,如下所示,可以獲取資料庫test的表名,
' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='test' limit 0,1),0x7e),1)--+
圖33 利用報錯注入獲取資料庫表名
1.9 報錯注入代碼分析
??在報錯注入頁面中,程式獲取GET引數username后,將username拼接到SQL陳述句中,然后到資料庫查詢,如果執行成功,技術處ok;如果出錯,則通過echo mysqli_error(@&con)將錯誤資訊輸出到頁面(mysqli_error回傳上一個MySQL函式的錯誤),代碼如下所示,
<?php
$con=mysqli_connect("localhost","root","root","test");
// 檢測連接
if (mysqli_connect_errno())
{
echo "連接失敗: " . mysqli_connect_error();
}
$username = @$_GET['username'];
$sql = "select * from users where `username`='".$username."'";
if($result = mysqli_query($con,$sql))
{
echo "ok";
}
else
{
echo mysqli_error($con);
}
?>
??輸入username=1’時,SQL陳述句為select *from users where `username`=‘1’,執行時,會因為多了一個單引號而報錯,利用這種錯誤回顯,我們可以通過floor()、updatexml()等函式將要查詢的內容輸出到頁面上,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299134.html
標籤:其他
上一篇:PGP加密并簽名電子郵件
