从最简单的一段代码开始
conn.asp:
- <%
- on error resume next
- connstr="Provider=microsoft.jet.oledb.4.0;data source="&server.MapPath("1111/test.mdb")
- set conn=server.CreateObject("adodb.connection")
- conn.open connstr
- %>
数据库连接文件,通用格式,防暴库,一般人都会加on error resume next
cint.asp:
- <!--#include file="conn.asp"-->
- <%
- a=request("id")
- a=cint(a)
- set rs=server.CreateObject("adodb.recordset")
- sql="select * from admin where id="&a
- rs.open sql,conn,1,3
- response.write rs("name")
- rs.close
- set rs=nothing
- %>
- <%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
