黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图
您现在的位置: 黑客风云 >> 黑客文章 >> 网管频道 >> 入侵检测 >> 文章正文
[推荐]测试SQL防注入脚本
        ★★★★★
测试SQL防注入脚本
文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2007-12-21

近日有些客户向我咨询关于如何防御SQL注入的问题。
案例A:修改代码嘛?太‘硬’,需要一定的技术功底…
案例B:买附加的‘应用层防火墙’产品?比较‘软’,但成本问题如何解决呢???
目前网上流传着通过防注入脚本来解决这方面的问题。的确,技术含量不高(因为技术含量都由产品的安全开发人员替您解决了…),而且是开源/免费的。

废话少说,先替客户测试一下。搜了一下目前比较常见的防注入脚本(本次测试主要针对最流行的ASP+ACCESS),最后锁定由neeao开发的《SQL通用防注入系统3.0(asp)》;自己‘弄’了个有缺陷的脚本(--修改《E-style工作室全站程序 E.0》ASP+ACCESS脚本):
A、删除shownews.asp中以下内容(增加GET的SQL注入缺陷):
if not isInteger(request.querystring("news_id")) then
founderr=true
errmsg=errmsg+"<br>"+"<li>非法的新闻id参数。"
end if
B、替换lib/admin_body.asp的内容(增加POST的SQL注入缺陷):将
adminname=trim(replace(request("adminname"),"'",""))
adminpwd=trim(replace(request("adminpwd"),"'",""))
替换为
adminname=trim(request("adminname"))
adminpwd=trim(request("adminpwd"))

然后下载防注入脚本《SQL通用防注入系统3.0(asp)》:
(下载地址:http://www.neeao.com/blog/attachments/200504/25_215025_neeao.rar)
解压缩后有四个文件,除去说明文件neeao.txt外,核心为Neeao_SqlIn.Asp的过滤引擎、用于管理的Neeao_sql_admin.asp脚本、用于存储被过滤日志/资料的数据库SqlIn.mdb。

首先看看关于GET的shownews.asp的内容:shownews.asp中屏蔽因为‘非整型参数’的错误定义后直接就调用自定义函数rcount,其内容:

以下是引用片段:
function rcount()
OPENnews
set rscount=conn.execute("select * from news")
sql="UPDATE news SET news_count = news_count + 1 where news_id="&request.querystring("news_id")
conn.execute (sql)
rscount.close
set rscount=nothing
end function

可以看到它是直接读取GET上去的news_id字段,直接利用的话:
http://127.0.0.1/shownews.asp?news_id=1%20and%201=1
http://127.0.0.1/shownews.asp?news_id=1%20and%201=2
加入SQL通用防注入系统--直接在shownews.asp中include file标签段内加入:
<!--#Include File="Neeao_SqlIn.Asp"-->

刷新后再试将载入Neeao_SqlIn.Asp内的GET过滤部分内容:

以下是引用片段:
If Request.QueryString<>"" Then
  For Each Fy_Get In Request.QueryString
    For Fy_Xh=0 To Ubound(Fy_Inf)
      If Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>0 Then
        If WriteSql=True Then
          killSqlconn.Execute("insert into SqlIn(Sqlin_IP,SqlIn_Web,SqlIn_FS,SqlIn_CS,SqlIn_SJ) values('"&Request.ServerVariables("REMOTE_ADDR")&"','"&Request.ServerVariables("URL")&"','GET','"&Fy_Get&"','"&replace(Request.QueryString(Fy_Get),"'","''")&"')")
        killSqlconn.close
        Set killSqlconn = Nothing
        End If
        Response.Write "<Script Language=JavaScript>alert('SQL通用防注入系统提示你↓\n\n请不要在GET参数中包含非法字符尝试注入!\n\nHttp://Www.wrsky.Com 系统版本:V3.0(ASP)版\n\nBy:Neeao');</Script>"
        Response.Write "非法操作!系统做了如下记录↓<br>"
        Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
        Response.Write "操作时间:"&Now&"<br>"
        Response.Write "操作页面:"&Request.ServerVariables("URL")&"<br>"
        Response.Write "提交方式:GET<br>"
        Response.Write "提交参数:"&Fy_Get&"<br>"
        Response.Write "提交数据:"&Request.QueryString(Fy_Get)
        Response.End
      End If
    Next
  Next
End If

以上脚本的工作模式是首先确认被加载的脚本目前是否有接收GET数据,若‘有’则将其接收字段的值代入变量Fy_Get,然后设定一个循环,初始计数器变量Fy_Xh为0,终点计数器变量为过滤数组Fy_Inf的长度。最后是辨别/过滤,首先用LCase函数将GET数据小写化,然后利用Instr函数搜索其内容是否包含Fy_Inf数组的元素,若找得到(Instr的返回值不等于0)则首先写入过滤数据库SqlIn.mdb并在页面中输出提示/警告信息。

[1] [2] 下一页  

文章录入:cainiaowang    责任编辑:cainiaowang 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    VIP 专 区