科普第一篇:access注入中%00作为截断符的原理

2013-06-23 13:22:14 16 5367 2
话说笔者已经有七八年的时间没有搞站了最近比较悠闲,跟朋友聊起来觉得有必要复习下,于是写了几篇科普的文章,欢迎大家拍砖。(由末日代发)-----powered by hi_heige

第一篇:access注入中%00作为截断符的原理

%00其实有两种方式一种是二进制的0x00一个字节,还有一种是字符串"%00"三个字节.
在asp中
request("aaa")
修改数据包:字串有0x00,直接丢弃包含0x00和后面的数据
url中有%00,直接转换成0x00,然后丢弃包含0x00和后面的数据

request.querystring("aaa")
修改数据包:字串有0x00,直接丢弃包含0x00和后面的数据
url中有%00,直接转换成0x00,然后丢弃包含0x00和后面的数据

request.form("aaa")
修改数据包:字串有0x00,直接丢弃包含0x00和后面的数据
表单中有%00,直接转换成0x00,然后丢弃包含0x00和后面的数据

request.BinaryRead(Request.TotalBytes)
0x00和%00都不处理,当成二进制数据,后继由用户处理

request.servervariables("query_string")
修改数据包:字串有0x00,直接丢弃包含0x00和后面的数据
url中有%00,当成字符串%00

总结:除了binaryread方式,直接提交0x00都是不能成功的.
而querystring和form方式%00会被解码也不能利用.所以能利用的地
方在servervariables("query_string")
由于正常用户提交的数据可能有特殊符号比如空格,所以在url和form提交中浏览器会编码成%20
当然asp想到了这种方式,所以querystring中会自动解码并丢弃0x00
但是有些时候作者不想让程序自动解码,就会调用servervariables("query_string")
自已来处理代码,通常是通过自已写的urldecode函数(在asp中有server.urlencode但是没有decode).
自已处理那么很可能没丢弃0x00就有可能出错了.
比如提交的是
http://hi_heige.com/1.asp?aaa=aa','fff')%00
代码
url=request.servervariables("query_string")
response.write url 返回aaa=aa%27,%27fff%27)%00
durl=urldecode(url)
response.write ("---------")
response.write len(durl) //返回长度15
a=durl+"bbu"
response.write len(a)    //返回长度18
说明durl中包含了0x00,那么如果下面的代码
set rs = server.createobject("adodb.recordset")
sqli = "insert into cookie (browser,time1) values('"&durl&"','abcdef')"
rs.open sqli,conn,1,3
主要是sqli这个字串将变为
insert into cookie (browser,time1) values('aa','fff')0x00','abcdef')
那么在查询的时候0x00就等于mssql中的--了.写入表中的abcdef就变成了fff

%2500攻击方式:
有些程序虽然调用了request("aaa")来取得值比如用户提交
http://hi_heige.com/1.asp?aaa=asdf%2500asdf
asp会转换为  asdf%00asdf
注意这儿的%00还是字符串.但后台代码再次调用了urldecode函数,造成了二次解码漏洞
第二次  asdf%00asdf
就会解码为asdf 0x00 asdf 9个字节

然后和上面的攻击原理就一样了.
url=request("aaa")    //aaa=asdf%2500asdf
response.write url        //asdf%00asdf
response.write len(url)   //长度11,上面的是字串
durl=urldecode(url)       //二次解码!
response.write ("---------")
response.write (durl)     //asdf
response.write len(durl)  //长度9,因为有0x00所有上面只能显示4个字符
同时二次解码还可以跳过过滤比如
cookie = request("c")
cookie=Replace(cookie,Chr("34"),"")
cookie=URLDecode(cookie)
第二行会过滤双引号.但我们可以提交%2522
第一行执行后变成%22,跳过第二行的过滤
第三行执行后变成了0x22=34d

关于作者

末日55篇文章1271篇回复

评论16次

要评论?请先  登录  或  注册