URL編碼與SQL注射

2021-03-31 08:56:57 字數 1232 閱讀 4356

說到url編碼,你或許會想起n年前的url編碼漏洞。可惜我是「生不逢時」啊,我接觸網路時,那個漏洞早就絕跡咯。

言歸正傳,url 編碼是什麼東東呢?看看我從網上抄的定義:

引用:

url編碼是一種瀏覽器用來打包表單輸入的格式。瀏覽器從表單中獲取所有的name和其中的值 ,將它們以name/value引數編碼(移去那些不能傳送的字元, 將資料排行等等)作為url的一部分或者分離地發給伺服器。不管哪種情況, 在伺服器端的表單輸入格式樣子象這樣:

thename=ichabod+crane&gender=male&status=missing&headless=yes

url編碼遵循下列規則: 每對name/value由&符分開;每對來自表單的name/value由=符分開。如果使用者沒有輸入值給這個name,那麼這個name還是出現,只是無值。任何特殊的字元(就是那些不是簡單的七位ascii,如漢字)將以百分符%用十六進製制編碼,當然也包括象 =, &, 和 % 這些特殊的字元。

它的思路就是先獲得提交的資料,以「&」為分界獲得並處理name/value組,然後判斷value裡是否含有定義的關鍵字(這裡為求簡便,我只留下了「and」),有之,則為注射。

乍一看去,value被檢查了,似乎沒有問題。呵呵,是的,value不會有問題,可是,name呢?

它的name/value組值來自於request.servervariables("query_string"),呵呵,不好意思,這裡出問題了。request.servervariables("query_string")是得到客戶端提交的字串,這裡並不會自動轉換url編碼,哈哈,如果我們把name進行url編碼再提交的話,呵呵,那就可以繞過檢查了。比如引數是ph4nt0m=lake2 and lis0,此時程式能夠檢測到;如果提交%50h4nt0m=lake2 and lis0(對p進行url編碼),程式就會去判斷%50h4nt0m的值,而%50h4nt0m會被轉換為ph4nt0m,所以%50h4nt0m值為空,於是就繞過了檢測。

等等,為什麼既然name不解碼可以繞過檢查而value就不能繞過呢?因為value的值取自request(fy_cs(fy_x)),這個伺服器就會解碼的。

程式怎麼改進呢?只要能夠得到客戶端提交的資料是解碼後的就可以了,把得到name的語句改為for each submitname in request.querystring就可以了。

呵呵,謝謝閣下耐著性子看完我的文章^_^

lake2

2004-11-21

ps:同時發布於ph4nt0m

SQL注射總結 5

通常注射的一些介紹 a id 49 這類注入的引數是數字型,sql語句原貌大致如下 select from 表名 where 字段 49 注入的引數為id 49 and 查詢條件 即是生成語句 select from 表名 where 字段 49 and 查詢條件 b class 連續劇 這類注入的...

SQL注射總結 8

把 password sqlserver sql admin sesame sa guest here is the script sqlcrack.sql create table tempdb.passwords pwd varchar 255 bulk insert tempdb.passwo...

SQL注射資料(翻譯)

1 介紹 2 漏洞測試 3 收集資訊 4 資料型別 5 獲取密碼 6 建立資料庫帳號 7 mysql作業系統互動作用 8 伺服器名字與配置 9 從登錄檔中獲取vnc密碼 10 逃避標識部分訊號 11 用char 進行mysql輸入確認欺騙 12 用注釋逃避標識部分訊號 13 沒有引號的字串 1 當伺...