記得以前在看文章的時候說,有的時候 改變一下url編碼就可以繞過一些防住入的**。實現注入。
今天抽時間 把url編碼從新學習了一下,做個簡單的筆記吧。
首先百度一下:url編碼的介紹:
介紹中使這樣定義url編碼的:
url編碼是一種瀏覽器用來打包表單輸入的格式。瀏覽器從表單中獲取所有的name和其中的值 ,將它們以name/value引數編碼(移去那些不能傳送的字元, 將資料排行等等)作為url的一部分或者分離地發給伺服器。
從定義中,實現url編碼的過程是發生在瀏覽器端的,也就是在客戶端實現的.瀏覽器把特殊的字元和不能用簡單的七位ascii實現編碼的字元,通過url編碼傳遞給了 伺服器。
例如:
在firefox中輸入:
/admin/module/sys/test.php?id=" (%22 = ")
檢視 提交的請求頭資訊:
瀏覽器把這些字元經過了url編碼處理,之後送給了伺服器。
既然這個url編碼是在客服端實現的,那麼我們把正常的字元也採用url編碼的形式提交的話,結果是什麼呢?
and 1=1 url(%61%6e%64%201%3d1)
url中輸入:
test.php的內容如下:
echo $_get['id'];
結果如下:
and 1=1
這說明了,可以在本地提交正常字元url編碼的形式,提交給了服務端是可行的。
在客戶端的 url編碼就是這樣處理的,遇到不能識別的 或者是瀏覽器內部制定的 字元的時候,瀏覽器就把這些字元進行url編碼的處理,如果是正常的能識別的字元的話就不經過url編碼的處理。當我們把乙個瀏覽器能識別的字元通過url編碼處理之後在傳遞給瀏覽器的話,那麼瀏覽器直接把這些內容傳遞給了 伺服器。
url編碼在客戶端的傳遞總結就是這樣了,
那麼下面我們說一下,在服務端是怎麼處理的呢?
看例子:
test.php的**如下:
$id = $_get['id'];
if($id == "\""){
echo "me too";
訪問 "
結果 :
me too
從這裡可以看出來 在服務端自動把 url進行了解碼處理。
再來看一下我們常用的 url編碼的諸如把:
1 and 1=1 url(1%20%61%6e%64%201%3d1)
修改test.php的**:
$id = $_get['id'];
if($id == "1 and 1=1"){
echo "buxuan";
訪問:1%20%61%6e%64%201%3d1
結果是:
buxuan
按照這樣結果的話,那麼通過url編碼來實現注入的話是根本行不通的啊,那網上好多大牛為什麼說可以通過在中方法能實現注入呢 ?
資料上說 是一些asp的防注入指令碼中,用來獲取客戶端的資料的時候呼叫的是request.servervariables("query_string") 來獲取url中的內容,依靠這個內建的函式獲取過來的url中的內容都是沒有結果解碼處理的內容.
其實利用url編碼注入的漏洞,知識針對那些在防注入程式中是利用request.servervariables("query_string")取來的url。
現在對php比較熟悉:
就拿php來說吧,
test.php
echo $_server['query_string'];
訪問:1%20%61%6e%64%201%3d1
輸出的結果是:
id=1%20%61%6e%64%201%3d1
簡單的整理一下url編碼在服務端處理:
通過$_get $_post $_cookie 獲取過來的引數都是結果url解碼之後的資料。
通過$_server 得到的 內容都是沒有經過url解碼處理的資料。
應該是和php的處理機制的問題吧
$_server直接 獲取url中的內容 ,而 $_get $_post 等 是接受了處理之後的內容。
作者:
對URL編碼的一點理解
在web開發中,亂碼是非常常見的問題,我們只有理解了為什麼會亂碼,才能很好的解決亂碼問題 1 為什麼會亂碼 因為在位址列中不能出現中文,所以當我們傳送中文的引數時,必須對其進行url編碼,由於我們可以使用各種各樣的規則對其編碼,所以當伺服器接收時,如果和伺服器使用的規則不一樣,那麼就會出現亂碼。例如...
關於轉換流的一點理解
先看如下 我工程預設的字符集為utf 8,所以每個ascii字元佔1位元組,這裡我們看到,我們通過write把位元組陣列輸出到控制台的時候,並不是直接以位元組的形式出現的,這意味著不僅僅在read的時候位元組輸入流把讀取的字元decode成了位元組然後讀入位元組陣列,同樣在write的時候位元組輸出...
關於python的編碼問題的一點記錄
我們都知道python是一門世界通用的程式語言,如果它的源 檔案中出現的都是ascii支援的字元,那python會以ascii編碼的格式處理程式。不過,一旦源 中出現了ascii不支援的字元,它該怎麼辦?我用一張圖來回答你吧 也就是說,所有超出ascii範圍的字元的處理工作,無論在輸入之前,或者輸出...