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程式碼審計:入門篇》等。
掃描客服微信 獲取更多課件+學習資料