说到url编码
![](/icons/71975dou.gif)
你或许会想起N年前
![](/icons/71975de.gif)
url编码漏洞
![](/icons/71975dou2.gif)
可惜我是“生不逢时”啊
![](/icons/71975dou.gif)
我接触网络时
![](/icons/71975dou.gif)
那个漏洞早就绝迹咯
![](/icons/71975dou2.gif)
言归正传
![](/icons/71975dou.gif)
URL 编码是什么东东呢?看看我从网上抄
![](/icons/71975de.gif)
定义:
引用: url编码是
![](/icons/71975yi.gif)
种浏览器用来打包表单输入
![](/icons/71975de.gif)
格式
![](/icons/71975dou2.gif)
浏览器从表单中获取所有
![](/icons/71975de.gif)
name和其中
![](/icons/71975de.gif)
值
![](/icons/71975dou.gif)
将它们以name/value参数编码(移去那些不能传送
![](/icons/71975de.gif)
![](/icons/71975zifu.gif)
, 将数据排行等等)作为URL
![](/icons/71975de.gif)
![](/icons/71975yi.gif)
部分或者分离地发给服务器
![](/icons/71975dou2.gif)
不管哪种情况, 在服务器端
![](/icons/71975de.gif)
表单输入格式样子象这样:
theName=Ichabod+Crane&gender=male&status=missing&headless=yes
URL编码遵循下列规则: 每对name/value由&符分开;每对来自表单
![](/icons/71975de.gif)
name/value由=符分开
![](/icons/71975dou2.gif)
如果用户没有输入值给这个name
![](/icons/71975dou.gif)
那么这个name还是出现
![](/icons/71975dou.gif)
只是无值
![](/icons/71975dou2.gif)
任何特殊
![](/icons/71975de.gif)
![](/icons/71975zifu.gif)
(就是那些不是简单
![](/icons/71975de.gif)
7位ASCII
![](/icons/71975dou.gif)
如汉字)将以百分符%用十 6进制编码
![](/icons/71975dou.gif)
当然也包括象 =, &, 和 % 这些特殊
![](/icons/71975de.gif)
![](/icons/71975zifu.gif)
呵呵
![](/icons/71975dou.gif)
明白了吧
![](/icons/71975dou.gif)
其实url编码就是
![](/icons/71975yi.gif)
个
![](/icons/71975zifu.gif)
ascii码
![](/icons/71975de.gif)
十 6进制
![](/icons/71975dou2.gif)
不过稍微有些变动
![](/icons/71975dou.gif)
需要在前面加上“%”
![](/icons/71975dou2.gif)
比如“\”
![](/icons/71975dou.gif)
它
![](/icons/71975de.gif)
ascii码是92
![](/icons/71975dou.gif)
92
![](/icons/71975de.gif)
十 6进制是5c
![](/icons/71975dou.gif)
所以“\”
![](/icons/71975de.gif)
url编码就是\
![](/icons/71975dou2.gif)
那么汉字
![](/icons/71975de.gif)
url编码呢?很简单
![](/icons/71975dou.gif)
看例子:“胡”
![](/icons/71975de.gif)
ascii码是-17670
![](/icons/71975dou.gif)
十 6进制是BAFA
![](/icons/71975dou.gif)
url编码是“%BA%FA”
![](/icons/71975dou2.gif)
呵呵
![](/icons/71975dou.gif)
知道如何转换
![](/icons/71975de.gif)
了吧
![](/icons/71975dou2.gif)
URL编码平时我们是用不到
![](/icons/71975de.gif)
![](/icons/71975dou.gif)
![](/icons/71975yinwei.gif)
IE会自动将你输入到地址栏
![](/icons/71975de.gif)
非数字字母转换为url编码
![](/icons/71975dou2.gif)
所以对于浏览器来说http://blog.csdn.net/l%61ke2和http://blog.csdn.net/lake2是等效
![](/icons/71975de.gif)
(注意
![](/icons/71975dou.gif)
第
![](/icons/71975yi.gif)
个url我用%61替换了a)
![](/icons/71975dou2.gif)
呵呵
![](/icons/71975dou.gif)
或许你已经想起了
![](/icons/71975dou.gif)
有人提出数据库名字里带上“#”以防止被下载
![](/icons/71975dou.gif)
![](/icons/71975yinwei.gif)
IE遇到#就会忽略后面
![](/icons/71975de.gif)
字母
![](/icons/71975dou2.gif)
破解思路方法很简单——用url编码#替换掉#
![](/icons/71975dou2.gif)
我本来企图利用url编码来躲过注射检查
![](/icons/71975de.gif)
![](/icons/71975dou.gif)
不过失败了
![](/icons/71975dou.gif)
![](/icons/71975yinwei.gif)
服务器端会将url编码转换成
![](/icons/71975zifu.gif)
![](/icons/71975de.gif)
![](/icons/71975dou2.gif)
等等
![](/icons/71975dou.gif)
好像跑题了啊
![](/icons/71975dou.gif)
呵呵
![](/icons/71975dou.gif)
不好意思:)
现在SQL注射非常流行
![](/icons/71975dou.gif)
所以就有人写了
![](/icons/71975yi.gif)
些防注射
![](/icons/71975de.gif)
脚本
![](/icons/71975dou2.gif)
当然啦
![](/icons/71975dou.gif)
思路不
![](/icons/71975yi.gif)
样
![](/icons/71975dou.gif)
效果大区别
![](/icons/71975dou2.gif)
各位看官请看下面
![](/icons/71975de.gif)
××SQL通用防注入asp版部分代码
![](/icons/71975dou2.gif)
Fy_Url=Request.ServerVariables("QUERY_STRING")
Fy_a=split(Fy_Url,"&")
redim Fy_Cs(ubound(Fy_a))
_disibledevent=> Fy_Cs(Fy_x) = left(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)
Next
For Fy_x=0 to ubound(Fy_Cs)
If Fy_Cs(Fy_x)<>"" Then
If Instr(LCase(Request(Fy_Cs(Fy_x))),"and")<>0 then
Response.Write "出现
![](/icons/71975cuowu.gif)
!"
Response.End
End If
End If
Next
它
![](/icons/71975de.gif)
思路就是先获得提交
![](/icons/71975de.gif)
数据
![](/icons/71975dou.gif)
以“&”为分界获得并处理name/value组
![](/icons/71975dou.gif)
然后判断value里是否含有定义
![](/icons/71975de.gif)
关键字(这里为求简便
![](/icons/71975dou.gif)
我只留下了“and”)
![](/icons/71975dou.gif)
有的
![](/icons/71975dou.gif)
则为注射
![](/icons/71975dou2.gif)
乍
![](/icons/71975yi.gif)
看去
![](/icons/71975dou.gif)
value被检查了
![](/icons/71975dou.gif)
似乎没有问题
![](/icons/71975dou2.gif)
呵呵
![](/icons/71975dou.gif)
是
![](/icons/71975de.gif)
![](/icons/71975dou.gif)
value不会有问题
![](/icons/71975dou.gif)
可是
![](/icons/71975dou.gif)
name呢?
它
![](/icons/71975de.gif)
name/value组值来自于Request.ServerVariables("QUERY_STRING")
![](/icons/71975dou.gif)
呵呵
![](/icons/71975dou.gif)
不好意思
![](/icons/71975dou.gif)
这里出问题了
![](/icons/71975dou2.gif)
Request.ServerVariables("QUERY_STRING")是得到客户端提交
![](/icons/71975de.gif)
![](/icons/71975zifu.gif)
串
![](/icons/71975dou.gif)
这里并不会自动转换url编码
![](/icons/71975dou.gif)
哈哈
![](/icons/71975dou.gif)
如果我们把name进行url编码再提交
![](/icons/71975de.gif)
话
![](/icons/71975dou.gif)
呵呵
![](/icons/71975dou.gif)
那就可以绕过检查了
![](/icons/71975dou2.gif)
比如参数是ph4nt0m=lake2 and lis0
![](/icons/71975dou.gif)
此时
![](/icons/71975chengxu.gif)
能够检测到;如果提交%50h4nt0m=lake2 and lis0(对p进行url编码)
![](/icons/71975dou.gif)
![](/icons/71975chengxu.gif)
就会去判断%50h4nt0m
![](/icons/71975de.gif)
值
![](/icons/71975dou.gif)
而%50h4nt0m会被转换为ph4nt0m
![](/icons/71975dou.gif)
所以%50h4nt0m值为空
![](/icons/71975dou.gif)
于是就绕过了检测
![](/icons/71975dou2.gif)
等等
![](/icons/71975dou.gif)
为什么既然name不解码可以绕过检查而value就不能绕过呢?
![](/icons/71975yinwei.gif)
value
![](/icons/71975de.gif)
值取自Request(Fy_Cs(Fy_x))
![](/icons/71975dou.gif)
这个服务器就会解码
![](/icons/71975de.gif)
![](/icons/71975chengxu.gif)
如何改进呢?只要能够得到客户端提交
![](/icons/71975de.gif)
数据是解码后
![](/icons/71975de.gif)
就可以了
![](/icons/71975dou.gif)
把得到name
![](/icons/71975de.gif)
语句改为For Each SubmitName In Request.QueryString就可以了
![](/icons/71975dou2.gif)
呵呵
![](/icons/71975dou.gif)
谢谢阁下耐着性子看完我
![](/icons/71975de.gif)
文章^_^
上
篇文章: Visual C
实现WinXP关机特效
下
篇文章: asp中自定义文件下载