关于SQL注入检测写一点东西

 

背景,为什么这么做其实我一直搞不清楚


CSDN论坛上发的帖子


最近在帮老师做一个项目,整个系统是进行数据库访问审计用的。具体说系统用于服务器和数据库之间,对所有从服务器提交的查询数据库的请求进行审计。可以添加规则和创建白名单这些。现在要实现的一个功能是通过服务器提交的SQL语句判断是否是注入,如果是注入语句那么需要检测出来这样才能保证数据库的安全性。

目前还不知道怎么去做,SQL注入千变万化,穷举明显不可能,而且系统效率还要很高实现每秒几万条数据的检测,这更难了。和一个学长讨论过,他认为SQL注入检测一般都是在前台WEB端进行的,很少有在后台服务器和数据库之间检测的。可是老师说必须要这么做,我也没办法,求助知情人士,给我点提示怎么做。谢谢。

最后再次感谢,希望大家帮帮我。

 

 

在下面的回帖中CSDN上的达人们提出了自己的看法,有人就认为这样做不可行,防注入应该在客户端防,为什么要放到后台来呢。如果硬要这么做的话,应该如下:
首先定下监测点,在哪些部位进行监测,很显然服务器传递过来的是一个sql语句,要检查的应该是where关键词之后的语句,其中有字符串常量,即''之间的部分需要注意。为了实现这一点,之前应该有分析SQL语句的部分,这样才能实现具体的防注入检测。
还有一条回复提到下面两个难点:
1.如何高效的记录执行的SQL语句. --> 建议用SQL Profiler记录到数据表即可.
2.如何定检测过滤的规则. --> 关键要找到注入攻击语法的特征.

至于语法特征和共同规律找起来就比较难了,可能涉及到模式识别。通过穷举显然是穷举不了的。

 

在CSDN上面搜索了一下,发现有人提出防注入在前端实现的方法有下面几种:


第一:可以采用存储过程,存储过程自动会帮你屏蔽注入,这中方式虽然很好用,但是也有不利的地方,因为你不可能写一条简单的sql语句如select * from tb_aa where id=+request("id");都用存储过程就太小题大做了。


第二种方法:【尝试中】
在config文件中节点下面加入

这样就把所有的类似于.aspx的请求都映射到UrlRewriter类中进行处理,可以在UrlRewriter中任意发挥,用string Url = context.Request.RawUrl;将当前请求路径取得,然后检查有没有特殊字符什么之类的。屏蔽之后就放行,这个位置我不会了,因为放行之后必需还是以.aspx文件放行,这样又会执行到这个类


第三种方法,就是自己写一个类,进行字符串中是否包含特殊字符的处理。可以传入一个字符串进去
在每个页面加载的时候加入
string url=Request.RawUrl;然后调用方法testa(url),进行判断。

 

那么在后台呢,只好穷举了,耐着头皮把SQL注入专题-整理贴看了一遍,感觉其中很多都是在讲客户端的,很无奈。把文章中有用的信息提取出来也不过如下:

首先,判断环境,寻找注入点,判断数据库类型。

其次,根据注入参数类型,在脑海中重构SQL语句的原貌,按参数类型主要分为下面三种:

(A) ID=49 这类注入的参数是数字型,SQL语句原貌大致如下:
Select * from 表名 where 字段=49
注入的参数为ID=49 And [查询条件],即是生成语句:
Select * from 表名 where 字段=49 And [查询条件]

(B) Class=连续剧 这类注入的参数是字符型,SQL语句原貌大致概如下:
Select * from 表名 where 字段=’连续剧’
注入的参数为Class=连续剧’ and [查询条件] and ‘’=’ ,即是生成语句:
Select * from 表名 where 字段=’连续剧’ and [查询条件] and ‘’=’’

(C) 搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致如下:
Select * from 表名 where 字段like ’%关键字%’
注入的参数为keyword=’ and [查询条件] and ‘%25’=’, 即是生成语句:
Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’


下面纯粹是个人意见:


和数字有关的注入:1=1,1+1=2,1 IN (1,2),1<>2,1<2
我想当然的解决方法:首先找到关键符号,例如=,IN,<,>这些,判断这些符号前后是否都是数字,如果都是就认为是注入,管他是真还是假,正常语句中肯定不会弄出来个1=2,1=1这个玩意

和字符有关的注入:主要涉及到''不匹配,还有带注释的-- ,#,/**/语句需要给出提示
想当然的解决方法:直接搜索,找到就提示

一些函数:exec,xp_cmdshell,下面是在网上找到一些

有SQL语言基础的人,在SQL注入的时候成功率比不熟悉的人高很多。我们有必要提高一下自己的SQL水平,特别是一些常用的函数及命令。

  Access:asc(字符) SQLServer:unicode(字符)

  作用:返回某字符的ASCII码

  Access:chr(数字) SQLServer:nchar(数字)

  作用:与asc相反,根据ASCII码返回字符

  Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L)

  作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串

  Access:abc(数字) SQLServer:abc (数字)

  作用:返回数字的绝对值(在猜解汉字的时候会用到)

  Access:A between B And C SQLServer:A between B And C

  作用:判断A是否界于B与C之间

想当然的解决方法:找到函数,提示

穷举太可怕了,只能这么简单做点东西了。


 

你可能感兴趣的:(程序人生,sql,sqlserver,数据库,access,服务器,profiler)