突破Sql 防注入过滤程序继续注入的一点方法.经验.技巧总结

看了以下帖子想写一点东西,原帖内容如下:

标题:防注入真的有用吗?

作者:798146410

时间:2012-2-22 21:39

内容:

现在网上流传很多防注入代码。这些真的有用吗?这是在网上找的一个防注入代码

例如:

''''--------定义部份------------------
DimFy_Post,Fy_Get,Fy_In,Fy_Inf,Fy_Xh,Fy_db,Fy_dbstr''''自定义需要过滤的字串,用"|"分隔Fy_In="''''|;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|<|>|||-|_"Fy_Inf= split(Fy_In,"|")IfRequest.Form<>""ThenForEachFy_PostInRequest.FormForFy_Xh=0ToUbound(Fy_Inf)IfInstr(LCase(Request.Form(Fy_Post)),Fy_Inf(Fy_Xh))<>0ThenResponse.Write"<Script Language=JavaScript>alert(''''网长友情提示↓
网站在conn.asp插入上述代码把基本上能过滤的查询语句都过滤了。带式仔细找,貌似一个=(等号)没有过滤。。大家再找找。。。

等等。。一个等号就可以。。。。当我们我们输入and 1=1和和1=2时出现对话框。。记录了我们的ip和提交方式什么的。

我们是不是可以吧 and变成没有这些字符的语句呢?找了想到 base64字符。我们接着实验。。。成功。这里

又找了几个站,发现有的可以用这种方法注入。有的不可以。。大家不妨在注入的时候试一下。

突破Sql 防注入过滤程序继续注入的一点方法.经验.技巧总结

突破Sql 防注入过滤程序继续注入的一点方法.经验.技巧总结



这段过滤代码所存在的问题如下:

1、目测没有过滤Get、cookie提交方式,只过滤了post,而asp程序员最喜欢使用 Request("a") 这种方式获取数据,这种语句是不限定数据提交方式的,可以是get、cookie、post中任意一种,都可以获得数据(如果多个方式同时提交,则按照先后优先级获取数据,我记得默认优先级顺序为:Request.QueryString → Request.Form → Request.cookies → Request.ServerVariable),所以形同虚设。

2、Response.Write 后边如果没有 Response.End,也形同虚设,禁用js或其他发包方式即可,原理很简单不解释了,由于你代码不全(写这个文章的时候,楼主只是贴了一小段代码,后来补全了,这个不是重点,关键在于这篇文章所讲的方法),所以无法判断是否存在该缺陷。

3、大略的看了一下,他过滤的字符集没有关键词:or,这是一个严重的失误。

4、…… www.2cto.com

这几个缺点,稍微好一点的防注入过滤程序应该都不存在,除非作者太白痴了。。。

至于你说的把and变成“没有”这些字符的语句,可以参照以下方法:

1、变通法,例如他没有过滤 or,那么可以用:test.asp?id=999 or exists(select * from admin)、test.asp?id=999 or 1>2,注意:这个999必须是一个不存在的ID,让or前边的表达式运算值为false,这样整个语句的返回值就以or后的表达式运算值为准了。

2、“替换”大法,如果碰到直接替换的那种过滤程序,可以使用:test.asp?id=1 aandnd 1>2,这样执行一次替换后,结果就变成了:test.asp?id=1 and 1>2,其他关键词同理,很简单易懂的方法,大多数过滤程序都存在这个缺陷。

3、还可以使用打乱大小写字母的写法,因为在 Asp 中,Replace、Instr 等处理字符串函数默认是大小写敏感的,例如:sEleCT <> select,这是个极容易被忽视的问题。

4、使用注释方法,例如过滤了空格的话,可以用:test.asp?id=1/**/and/**/1=1,再例如,当过滤select时,可以:union/**//*!select*/1,2,3,4,或:union/**/s/**/elec/**/t/**/1,2,3,4,甚至还可以:union/**//*!5100select*/1&id=2,3&id=4,5100为mysql的版本号。

5、打碎关键词,原理很简单,如果你提交:test.asp?id=127/*&id=*/an&id=d/**/1=1 时,Asp 接收到的结果是:127/*, */an, d/**/1=1,注意中间的空格,再过滤掉逗号和空格就变成了:127/**/and/**/1=1,然后你懂的……php 的无效,直接覆盖了。这个使用条件比较苛刻,需要过滤逗号和空格,但我估计存在这种问题的站点依然不少。

6、过滤了空格还可以用:/**/、 (这是汉字空白字符)、chr(10)、chr(13),等字符充当空格。

7、……

关于 Sql 语句中的注释符,再补充一点知识:

Access 中没有专门的注释符号,因此“/**/”“--”“#”都没法使用,但是可以使用空字符 "NULL" (%00) 代替,例如:' UNION SELECT Count(*) FROM admin%00

关于 Asp 打碎关键词,具体的知识可以去看: http://www.2cto.com/Article/201104/87001.html

还有,如果是mysql数据库的话,还存在宽字节注入等问题,这些就不一一说明了,关于宽字节注入的知识,可以去看:

PHP 双字节、宽字节编码漏洞

利用GBK双字节编码突破PHP单引号转义限制进行SQL注入

突破防注入过滤,继续 Sql 注入,这方面的技巧、经验相当的多,这里只是略提一下,实际上都可以写成一本书,大家发散思维,方法很多的,欢迎补充。

在 Asp 中彻底封死注入的方法:

1、数字型:

DimTmpTmp=Request("test")IF Len(Tmp)>9thenResponse.Write"fuck you!"Response.EndElseIFIsNumber(Tmp)=FalseThenResponse.Write"fuck you!"Response.EndElseIFInstr(Tmp,"+")>0ThenResponse.Write"fuck you!"Response.EndElseIFInstr(Tmp,"-")>0ThenResponse.Write"fuck you!"Response.EndElseIFInstr(Tmp,".")>0ThenResponse.Write"fuck you!"Response.EndElseResponse.Write"ok!"End IF
2、字符型:

DimTmp, ITmp=Request("test")Tmp=Replace(Tmp,"'","\'")Tmp=Replace(Tmp,"""","\""")Tmp = Replace(Tmp, chr(10), "")Tmp = Replace(Tmp, chr(13), "")Response.Write "ok!"
这样完全就可以封死了,不用搞什么过滤关键词,弄一堆字符集,那种方法太恶心了,效率又底……Sql 注入漏洞的产生原因,就是因为程序员的不细心、缺乏安全意识,若是程序员平时写程序的时候,就注意了并避免了这些细节问题,那么为什么还需要用第三方防注入程序,进行所谓的修补呢?

再唠叨一下,经过这几年的发展,如今的防注入程序已经做得非常好了,已经不是很容易就可以突破了,但是稍微细心一下,有些还是可以再利用的。

参考资料:

基于 SQL 注入(sql injection) 介绍一些注射技巧 - 技术文章

SQL绕过注入最新代码

ASP 绕过防注入的新思路:打碎关键字

PHP 双字节、宽字节编码漏洞

利用GBK双字节编码突破PHP单引号转义限制进行SQL注入



楼主后来补充的完整的代码:

<%dim sql_injdata ,SQL_inj,SQL_Get,SQL_Post,SQL_Cookies,SQL_Data SQL_injdata ="<%|script|insert|select|delete|exec|cast|update|chr|master|truncate|declarei|eval"ifstopwords<>""andinstr(LCase(Request.ServerVariables("PATH_INFO")),"siteconfig.asp")=0thenSQL_injdata=SQL_injdata&"|"&stopwords endifSQL_inj =split(SQL_Injdata,"|")ifchecksqlin="Yes"thenIfRequest.Form<>""ThenStopInjection(Request.Form)IfRequest.QueryString<>""ThenStopInjection(Request.QueryString)IfRequest.Cookies<>""ThenStopInjection(Request.Cookies)endifFunctionStopInjection(values)ForEachSQL_Get Invalues ForSQL_Data=0ToUbound(SQL_inj)'if instr(LCase(request(SQL_Get)),Sql_Inj(Sql_DATA))>0 Then if instr(LCase(replace(request(SQL_Get),chr(34),"'")),Sql_Inj(Sql_DATA))>0 Then '“"”
无法直接写入到变量“SQL_injdata”中,在这里替换“"”为“'”提示之Response.Write "<script>alert('检测到非法信息,已禁止本次提交!');history.back()</script>" Response.end end if next Next end function%>

分类:默认分类 时间:2012-01-03 人气:11
本文关键词:
分享到:

相关文章

  • Linux下如何将数据库脚本文件从sh格式变为sql格式 2012-01-01

      1. sh文件内容   本文中的文件名为example.sh,其内容如下:   #!/bin/bash   function Init()   {   if [ -f"example.sql" ]   then   echo"example.sql is exits and is deleting it,then recreate it"   rm -fexample.sql   else   echo"example.sql no exits and is creating it"   f

  • Sql Server 存储过程实例讲解 2012-01-02

      一、遇到的问题   我们在之前学习的课程写了不少的批处理语句,这些批处理语句存在两个问题:   1.没法像函数那样传参数运行(自定义化)   2.没法像函数那样可以反复地调用(功能化模块化)   说到这里,我们可以猜到,数据库中应该可以建立函数形式的数据库对象来解决这样的问题。但是介绍这种数据库对象之前,我们再来看几个需要解决的问题:   我们已经学会把一条select语句封装在视图中,但是它只能用来查询,如果我们希望进行其它操作,比如增删改记录、建删库表等,是不能用视图来完成的。   另一

  • 修改SQL Server Management Studio默认设置提高开发效率 2012-01-03

    修改SQL Server Management Studio默认设置提高开发效率 2012导脚本默认没有判断对象是否存在的,导致执行删除创建的脚本会先报一次错。可以在工具=>选项==>sqlserver对象资源管理器中的编写脚本的.检查是否存在对象。 可以设置默认数据库。可以对数据库用户设置最近主要开发的数据库为默认,这样直接点工具栏的新建查询就不会每次需要选数据库了。 个人习惯,不喜欢启动ssms时候自动弹出一个新的查询而且还需要你去填写用户和密码。我是每次都要取消,当然你也可以去

  • 在EA中将画出的ER图转换成SQL脚本 2012-01-04

    在进行数据库设计的时候,想着正好安装着EA软件呢,看能不能用EA画ER模型。结果发现不仅能画,而且还能进行整套数据库设计(生成SQL脚本)。 下面以机房收费系统用户--学生为例。学生可以查看余额,可以查看上机记录,可以查看上机状态,可以查看充值记录,可以修改密码。步骤如下: (1)建立ER图之前,首先在EA中应选择使用哪种数据库。如图所示: (3)转换成数据模型图,选中所有的实体和属性名,右击,点击转换出现如图: (5)任何的数据库表都需要主键,外键和约束,下面我们对这些表进行修改,选择任何一个

  • 计世网sql注射,xss大礼包集合 2012-01-04

    多个sql注射+大量xss+一个上传,后台泄露,报错等。 面对G哥,压力大,果断翻硬盘找啊。找。 不说了。看详情。 注射漏洞: http://www.ccw.com.cn/oa/category/index.php?categoryId=165'%20or%20'1'= http://internet.ccw.com.cn/commlist/index.php?categoryId=1393'%20or%20% http://cio.ccw.com.cn/gq/index.php?nodeId=

  • php云两处SQL二次注入 2012-01-04

    php云两处二次注入 最新版。两个注入点。顺带一个绕过waf的小技巧。 第一处:/member/model/index.class.php 39行 function index_action() { $this->public_action(); $this->member_satic(); $this->com_cache(); $resume = $this->obj->DB_select_once("resume","`uid`='".$this->ui

  • SQL Server 2014新特性Data Explorer ForExcel的特点 2012-01-06

    Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企业中的自助式的商业智能变得更加的灵活,从而也降低了商业智能的门槛。 Data Explorer Preview for Excel提供了一种新的方式来为自助式的商业智能发现数据,整合数据以及提炼数据。如果你对它还比较陌生,那么如下五点将使你了解它如何提升你在Excel中处理数据的方法。 借助Data Explorer,你可以: 1. 发现数据 Data Explorer带来了在Excel中数据检

  • sql访问远程数据库 2012-01-07

      1、启用Ad Hoc Distributed Queries   在使用openrowset/opendatasource前搜先要启用Ad Hoc Distributed Queries服务,因为这个服务不安全所以SqlServer默认是关闭的   启用Ad Hoc Distributed Queries的方法   SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource'   的

  • SQL Server 2012中自带的SSDS多维数据集的浏览功能 2012-01-07

    在SQL Server 2012自带的SQL Server Data Tools(SSDT),上个版本中SQL Server 2008中对应为BIDS, 已经废除了多维数据集的数据浏览功能,同时在SSMS中也同步废除,只能浏览单维数据。 解决方法:在维度浏览界面,点击“Analyze in Excel”,在相应的Excel界面完成浏览。 www.2cto.com 关于“Management Studio 和多维数据集设计器中的多维数据集浏览器已被删除”的详细, 请看MSDN:http://msd

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.051 (s). 10 q(s)