我们首先还是来看看中网景论坛的最新版本"(CNKBBS2007)中网景论坛2007v5.0 "官方下载地址" http://www.cnetking.com/websys2.asp?id=26"发布时间是2007-06-06,打开系统的源代码后,在"user_RxMsg_detail.asp"文件中,有如下代码:
(调用opendb.asp文件)
<%
Call CheckUserLogin(username)
Dim action,s,id
id&#61;request("id") (获取客户提交的变量,并赋值给id,并没过滤,也没有指定采用那种方式提交)
if id<>"" then Call IsNum(bid) (这是程序员的出现地方,注意bid<>id)
conn.execute("update cnk_Users_RxMsg set readed&#61;1 where id&#61;"&id) &#39;设置已读
rs.open "select * from cnk_users_RxMsg where id&#61;"&id,conn,1,3
我们再打开"opendb.asp"文件
<%Option Explicit
Response.Buffer &#61; true%>
(调用fzr.asp文件)
..................
以现它是连接数据库的文件,其中调用了fzr.asp文件,我们再打开fzr.asp文件
<%
&#39;--------版权说明------------------
&#39;SQL通用防注入程序
&#39;Aseanleung
&#39;--------定义部份------------------
Dim Fy_Post,Fy_Get,Fy_In,Fy_Inf,Fy_Xh,Fy_db,Fy_dbstr
Dim fso1,all_tree2,file1,files,filez,fs1,zruserip
If Request.QueryString<>"" Then (对Request.QueryString提交(客户采用GET方式提交)的数据进行判断,并没有指明对其它方式提交的数据进行判断)
&#39;自定义需要过滤的字串,用 "|" 分隔
Fy_In &#61; "&#39;|;|%|*|and|exec|insert|select|delete|update|count|chr|mid|master|truncate|char|declare|script" (阻止了常用的SQL注入的语句)
Fy_Inf &#61; split(Fy_In,"|")
For Each Fy_Get In Request.QueryString
For Fy_Xh&#61;0 To Ubound(Fy_Inf)
If Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>0 Then
zruserip&#61;Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If zruserip&#61;"" Then zruserip&#61;Request.ServerVariables("REMOTE_ADDR")
Response.Write "内容含有非法字符&#xff01;请不要有&#39;或and或or等字符&#xff0c;请去掉这些字符再发&#xff01;&#xff01;
"
Response.Write "如是要攻击网站&#xff0c;系统记录了你的操作↓
"
Response.Write "操作&#xff29;&#xff30;&#xff1a;"&zruserip&"
"
Response.Write "操作时间&#xff1a;"&Now&"
"
Response.Write "操作页面&#xff1a;"&Request.ServerVariables("URL")&"
"
Response.Write "提交方式&#xff1a;&#xff27;&#xff25;&#xff34;
"
Response.Write "提交参数&#xff1a;"&Fy_Get&"
"
Response.Write "提交数据&#xff1a;"&Request.QueryString(Fy_Get)
......................
很明显的看出它是一个SQL通用防注入程序文件&#xff0c;(以上的红字是对代码的解释)
代码看好了&#xff0c;我们来整理下思路&#xff1a;由于程序员的出错&#xff0c;导致了id没有被过滤就被带到SQL语句中查询&#xff0c;这是注入漏洞产生的原因&#xff0c;虽然程序引入了防注入程序&#xff0c;阻止了常用的SQL语句使用&#xff0c;但只对客户采用GET方式提交的数据进行判断&#xff0c;而没有对其它方式提交的数据进行判断&#xff0c;这样导致了客户可以使用Request.COOKIE方式来提交变量的值&#xff0c;而绕过了SQL防注入程序(总结下&#xff1a;COOKIE注入产生的条件&#xff1a;系统直接使用"request("name")"获取客户提交的数据&#xff0c;并对客户提交的变量没有过滤&#xff0c;而且在防注入程序中没有限制Request.COOKIE&#xff0c;现在防注入程序3.0只是对客户采用GET和POST提交方式进行了限制).