SQL注入防護繞過——二次編碼之幹掉反斜槓

SQL注入防護繞過——二次編碼

 

01 背景知識

1、爲何要進行URL編碼

一般若是同樣東西須要編碼,說明這樣東西並不適合傳輸。對於URL來講,編碼主要是爲了不引起歧義與混亂。
例如,URL參數字符串中使用key=value鍵值對這樣的形式來傳參,鍵值對之間以&符號分隔,如/?name=abc&pwd=123若是你的value字符串中包含了=或者&,那麼勢必會形成接收Url的服務器解析錯誤,所以必須將引發歧義的&和= 符號進行轉義,也就是對其進行編碼。
對於URL編碼的深刻研究能夠參看下面這些內容:
爲何要進行URL編碼
深刻分析 web 請求響應中的編碼問題php

2、URL傳輸過程當中的編碼問題

HTTP請求過程經歷的幾個環節:
瀏覽器【get/post】①========>服務器②========>瀏覽器顯示③html

  • ①:瀏覽器會把URL通過編碼後發送給服務器,不一樣的瀏覽器對URL的編碼規則不一樣。對於GET方式提交的數據,瀏覽器會自動進行URL編碼;對於POST方式提交的數據,其編碼方式能夠由開發者進行指定。
  • ②:服務器根據其自身的配置文件對URL進行解碼(解碼成Unicode),而後將顯示內容編碼。
  • ③:瀏覽器按照指定的編碼顯示該網頁。
    此外,在客戶端也就是瀏覽器上運行的前端程序也會根據Web服務的須要對要傳輸的數據進行一些編碼操做,而在服務端除了服務器中間件會自動對URL進行解碼,後端的Web程序會對前端進行編碼的數據進行解碼操做。

02 二次編碼注入

下面這幅圖片很好地解釋了二次編碼注入的原理(圖片來源爲網易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" 

分享一個二次編碼注入的漏洞實例後端

相關文章
相關標籤/搜索