關於轉換URL編碼的注入的一點總結

2022-09-23 22:57:16 字數 2077 閱讀 7036

記得以前在看文章的時候說,有的時候 改變一下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範圍的字元的處理工作,無論在輸入之前,或者輸出...