一般若是同樣東西須要編碼,說明這樣東西並不適合傳輸。對於URL來講,編碼主要是爲了不引起歧義與混亂。
例如,URL參數字符串中使用key=value鍵值對這樣的形式來傳參,鍵值對之間以&符號分隔,如/?name=abc&pwd=123
若是你的value字符串中包含了=或者&,那麼勢必會形成接收Url的服務器解析錯誤,所以必須將引發歧義的&和= 符號進行轉義,也就是對其進行編碼。
對於URL編碼的深刻研究能夠參看下面這些內容:
爲何要進行URL編碼
深刻分析 web 請求響應中的編碼問題php
HTTP請求過程經歷的幾個環節:
瀏覽器【get/post】①========>服務器②========>瀏覽器顯示③html
下面這幅圖片很好地解釋了二次編碼注入的原理(圖片來源爲網易Web安全工程師課程,侵刪):前端
從中咱們也能夠得知,二次編碼注入產生的緣由是:
後端程序的編碼函數,如urldecode()等,與PHP自己處理編碼時,二者配合失誤,使得攻擊者能夠構造數據消滅\
python
看一下實例代碼:mysql
//用GET方式獲取id值,並對其中的特殊字符進行轉義
$id = mysql_real_escap_string($_GET['id']); //使用urldecode()函數進行解碼 $id = urldecode($id); $sql = "SELECT * FROM usres WHERE id = '$id' LIMIT 0,1; $result = mysql_query($sql); $row = mysql_fetch_array($result);
上面的代碼就是一個二次注入的典型場景,這時若是咱們提交:http://127.0.0.1/sql.php?id=1%2527
就能夠繞過對'
的轉義,進行SQL注入攻擊。web
在測試時,若是發現了頁面可能存在二次編碼注入漏洞,也可使用sqlmap進行自動化攻擊sql
//只需在注入點後鍵入%2527便可 python sqlmap.py -u "http://127.0.0.1/sql.php?id=1%2527"
分享一個二次編碼注入的漏洞實例後端