浅析 ASP 中 SQL Injection 漏洞产生原因
这里先给出一小段 ASP 代码,其中大部分被我省略,只留下一个框架和关键代码,各个网站的 ASP 代码大 同小异,大家可以举一反三 …………………………………省略 N 行代码 <% id=Request(“id”) if id=”" then Response.end end if …………………………………再次省略 N 行代码 SQL=”Select*from product Where id=”&;id Set rs=Server.Create(“ADODB.RecordSet”) rs.open SQL,con,1,1 %> 该代码的文件头是包含 coonDB.asp 和 function.asp 两个文件,前一段是 ASP 脚本通过 get 的方式从外 部获取变量 id 的值,后一段是利用 SQL 语句将变量 id 的值带入数据库查询,基本上原理都是如此,虽然 表面上看起来是没有问题的,但是有点 ASP 基础的朋友应该一经看出了
问题的所在了,那么接下来我们分 析一下。 首先,从包含的文件名我们可以看出,coonDB.asp 是数据库文件,而 function.asp 是函数调用文件,这 两个文件对下面的漏洞基本没有什么影响,我们看下面的: id=Request(“id”) if id=”" then Response.end end if 我们再来看查询的: SQL=”Select*from product Where id=”&;id Set rs=Server.Create(“ADODB.RecordSet”) rs.open SQL,con,1,1 我们之前说过,变量 id 的值是可以从外部提交的,既然脚本没有对外部提交的变量做任何过滤,那么如果 我们在 id 的数值后面添加一段 SQL 语句,那么这段语句就会同变量 id 一起载入数据库
查询,执行结果就 //没有做任何过滤,直接将 id 带入数据库查询 //变量 id 为 get 获取的外部 id 参数(大家浏览网站的时候都应该注意 //判断 id 的只是否为空,若为空便结束。
到,文章的网址最后都是.asp?id=xxx 的形式 ,这里的 xxx 就是变量 id 所获取的值)
会反馈在 user-Agent 中,如果入侵者执行用户查询语句或 exec 文件调用语句,那么可想而知,网站的 登录密码将形同虚设。 我们再来看一下一般 ASP 手工注入中(虽说是 ASP 注入,但实际上还是根据数据库而定,因为一般都是 ASP+Access 的搭配,所以 Access 注入便被习惯称为 ASP 注入)所用到的 SQL 语句: and 1=1 正常 and 1=2 错误 猜列名 and (select count(列名) from 表名)>0 username userpass 都正确 猜长度 and (select top 1 len(username) from admin)>5 username 长 6 password 长 16 猜内容 and (select top 1 asc(mid(username,1,1)) from admin)>50 and (select top 1 asc(mid(password,1,1)) from admin)>50 基本上折半猜解法便是如此了, 我们看到, 如果我们对提交的 id 变量进行 integer 判断或者对 and、 select、 ()等特殊字符进行过滤,那么攻击者所提交的 SQL 语句也就没有用武之地了。但是大多数过滤脚本仅提 供
了对 get 与 post 提交方式的过滤,却忽略了 cookie 提交,这样入侵者就可以通过脚本语句绕过过滤文 件,如: javascript.alert:(document.cookie=“id=”+escape(”xxx SQL 语句”)) 所以我们最好找一个完整的的过滤包,可以过滤 get、post、cookie 这 3 种提交方式进行过滤,当然可以 进行 XSS 过滤的话更好,这里提供一份比较完全的代码进行参考: <% ‘Option Explicit’开启强制变量定义 ‘——–数据库连接部分————– Dim Neeao_Inject_Data_Name,Neeao_Inject_conn,Neeao_Inject_Data_Str,SQL_sql_inject_dir ‘数据库地址,安装前请修改之 SQL_sql_inject_dir = “F:\wwwroot\sql\” ‘数据库名称,安装前请修改之 Neeao_Inject_Data_Name = “SqlIn.mdb” Set Neeao_Inject_conn = Server.CreateObject(“ADODB.Connection”) Neeao_Inject_Data_Str = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” &; SQL_sql_inject_dir &; Neeao_Inject_Data_Name ‘On Error Resume Next
Neeao_Inject_conn.