最新Base64注入攻擊和程式碼分析技術

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

Base64注入攻擊

Base64注入攻擊的測試地址在本書第2章。

URL中可以看出,引數ID經過Base64編碼(“%3d”是“=”的URL編碼格式),解碼後發現ID為1,嘗試加上一個單引號並一起轉成Base64編碼,如圖4-64所示。

4-64

當訪問id=1'編碼後的網址時(/4.3/base64.php?id=MSc%3d),頁面返回錯誤。1 and 1=1和1 and 1=2的Base64編碼分別MSBhbmQgMT0x和MSBhbmQgMT0y,再次訪問id=MSBhbmQgMT0x和id=MSBhbmQgMT0y,返回結果分別如圖4-65和圖4-66所示。

4-65

4-66

從返回結果可以看到,訪問id=1 and 1=1時,頁面返回與id=1相同的結果;而訪問id=1 and 1=2時,頁面返回與id=1不同的結果,所以該網頁存在SQL隱碼攻擊漏洞。

接著,使用order by查詢欄位,使用Union方法完成此次注入。



Base64注入程式碼分析

Base64注入頁面中,程式獲取GET引數ID,利用base64_decode()對引數ID進行Base64解碼,然後直接將解碼後的$id拼接到select語句中進行查詢,將查詢結果輸出到頁面,程式碼如下:

<?php $id = base64_decode($_GET['id']); $con=mysqli_connect("localhost","root","123456","test"); if (mysqli_connect_errno()){ echo "連線失敗: " . mysqli_connect_error(); } $result = mysqli_query($con,"select * from users where `id`=".$id); if (!$result) { printf("Error: %s\n", mysqli_error($con)); exit(); } $row = mysqli_fetch_array($result); echo $row['username'] . " : " . $row['address']; echo "<br>";?>

由於程式碼沒有過濾解碼後的$id,且將$id直接拼接到SQL語句中,所以存在SQL隱碼攻擊漏洞。當訪問id=1 union select 1,2,3,4,5#(訪問時,先進行Base64編碼)時,執行的SQL語句如下:

select * from users where `id`=1 union select 1,2,3,4,5#

此時,SQL語句可以分為select * from users where `id`=1和union select 1,2,3,4,5這兩條,利用第二條語句(Union查詢)就可以獲取資料庫中的資料。

這種攻擊方式還有其他利用場景,例如,如果有WAF,則WAF會對傳輸中的引數ID進行檢測。由於傳輸中的ID經過Base64編碼,所以此時WAF很有可能檢測不到危險程式碼,進而繞過了WAF檢測。

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

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

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

相關文章