|
近日有些客户向我咨询关于如何防御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 |
刷新后再试将载入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并在页面中输出提示/警告信息。
| 新云CMS Online.asp页面过滤不严 | 02-26 |
| 对网软网上购物系统的漏洞分析 | 01-09 |
| 测试SQL防注入脚本 | 12-21 |
| Google Xss又出跨站新漏洞 | 11-06 |
| 一次简单的html injection导致的 | 11-06 |
| 风讯、科讯漏洞利用 | 11-01 |
| Adobe pdf reader URI利用方式浅 | 10-23 |
| 超星阅览器的最新0DAY | 10-19 |
| 运用SQL Injection做数据库渗透的 | 09-22 |
| sa-blog 0day | 09-22 |
| HTML注入的一些简单想法 | 09-10 |
| 网站登陆接口的攻与防 | 09-04 |