Load... 注册 | 登陆

"cint函数+容错"引发的问题

从最简单的一段代码开始
conn.asp:

ASP/Visual Basic代码
  1. <%   
  2. on error resume next   
  3. connstr="Provider=microsoft.jet.oledb.4.0;data source="&server.MapPath("1111/test.mdb")   
  4. set conn=server.CreateObject("adodb.connection")   
  5. conn.open connstr   
  6. %>  

数据库连接文件,通用格式,防暴库,一般人都会加on error resume next
cint.asp:

ASP/Visual Basic代码
  1. <!--#include file="conn.asp"-->   
  2. <%   
  3. a=request("id")   
  4. a=cint(a)   
  5. set rs=server.CreateObject("adodb.recordset")   
  6. sql="select * from admin where id="&a   
  7. rs.open sql,conn,1,3   
  8. response.write rs("name")   
  9. rs.close   
  10. set rs=nothing   
  11. %>   
  12. <%set conn=nothing%>  

一个简单的查询,这里可以看出对id这个变量进行了cint转换,看似没注入了
其实:
(本来打算有图有真相的。图片上传不了,不知道是不是论坛的问题还是我的问题。。。反正就是可以注入)

原因:在conn.asp文件内多了一句on error resume next,所以顺理成章的被我们射了。加这句话主要是为了防止被存有不轨之心的人进行%5c暴库

利用:注入的时候遇到cint类型不匹配错误,可以尝试进入网站二级目录进行%5c暴库,因为conn.asp没有容错处理

ps:当然,一套好的程序一般在处理过滤方面都有自己的函数,文章没什么技术含量,抛砖引玉 by 3x

 

-----------------------------------------------------

以上是作者的原文:

经过俺叉叉兵小小的测试,上面的代码确实可以注射,cint失去了作用。

原因是这样的:

没有容错语句的时候,a=cint(a)  假如a不是数字,那么这里就直接出错,整个程序终止了运行。
有容错语句的时候,a=cint(a)  假如a不是数字,那么这里就忽略出错,a=cint(a)直接被抛弃,继续转下运行。结果就进了sql,引发了注射。

为什么我这么说,也是测试而来。
假如代码是这样写的:a=cint(request("id")),其他代码不变,这时候我们提交注射语句,发现无效了,为什么??

因为request("id")不是数字,导致a=cint(request("id"))出错,整句直接被丢弃,a变量没有赋值!

« 上一篇 | 下一篇 »

1条记录Comments

a=cint(request("id"))
那就是说这样写就OK啦。

Post by wowo on 2010-08-10 5:23 引用此文发表评论 #1


Leave a Comment

评论内容 (必填):