SQL注入检测

来源:互联网 发布:数据库添加 insert 编辑:程序博客网 时间:2024/05/17 14:30

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

一、操纵参数

首先我们先注意一个浏览器上的URL地址,为什么我们会提到这个URL地址,因为学过服务器端编程的人都知道,在get请求下,我们的参数都是通过URL以明文的形式传输的,而在初期我们也主要是靠这个来进行判断是否存在注入点。(当然向服务器端发送数据还有一种post请求方式,post请求相对于get请求,可能会略好一些,但是它仍然可以注入。请注意,数据在浏览器中如何呈现并不重要,这些都是客户端的功能,我们完全可以控制发送给服务器的内容。不要将客户端的接口机制看作安全功能)

比如说:
http://www.xx.com?id=1
http://www.xx.com?name=food
以上的这两个网站都有可能存在着sql注入,具体是否真的存在,我们可以通过修改id或者name后面的参数来看其返回的内容。
最简单的方式就是在参数的后面直接加入一个单引号来观察其返回的结果,比如说http://www.xx.com?name=food’ (注意food后面的单引号),如果页面返回如下结果:
这里写图片描述

我们可以从这个结果中得到两个信息,一个是这个URL存在注入的漏洞,而且后台的数据库用的是mysql的数据库。那么为什么会发生这种错误??
我们根据这个URL可以大致的推断出,这个页面的后台代码,假设(我说的是假设,因为以我们现在得到的信息还不能做出这种推断)这个网站的后台代码用的是php代码,那么我们就重写一下这个语句。

$name=$_GET['name'];  #因为这个界面是使用的get的提交方式$sql="select * from table_name where name='$name'"; $result = mysql_query($sql); #查询数据库返回结果

所以在name的参数值直接加入’时会出现上图的那种错误,也就是说我们的推断也是成立的。(后台还有asp、jsp语言,其实都是一样的,发生上图的错误,基本上都是未对输入的数据进行过滤,直接写进代码中,导致程序异常)。

除了单引号可以检测当前的URL是否存在注入外,我们还可以使用其他的方法来进行判断。比如说:还是使用这个链接http://www.xx.com?name=food
下面我们开始发送一个请求,像这样:
http://www.xx.com?name=fo‘||’od
如果它返回的结果和http://www.xx.com?name=food返回的结果是一样的话,那么我们可以初步的判断后台的数据库是使用的oracle或者PostgreSQL的数据库。

同理如果这个请求:http://www.xx.com?name=fo‘+’od和上面的结果是一样的话,我们可以认为,后台的数据库是Microsoft的SQL SERVER数据库。

如果这个请求:http://www.xx.com?name=fo’ ‘od和上面的结果是一样的话,我们可以认为,后台的数据库是Mysql的数据库。


二、SQL错误

  1. Microsoft SQL SERVER错误
    同样的如果我们想观察一些SQL SERVER的错误,我们也是可以直接在参数后面直接加单引号来获取它的错误信息。当然我们还可以利用其他的错误来返回一些对我们有帮助的信息。比如说:(我们这次依旧使用http://www.xx.com?name=food,这个URL)我们可以传递这样的参数,http://www.xx.com?name=food and 1=0/@@version。
    通过上面的这个链接我们可以成功的获取到这个数据库的版本信息,因为SQL Server在解析这条sql语句时,会碰到/运算符,因为/运算符两边都要是整数,在解析@@version时 ,数据库不能够将其解析成整数,在报错时,也就将@@version给显示出来了。
    还可以这样修改 http://www.xx.com?name=food’having ‘1’=’1 ,通过having与order by 语句的结合可以枚举出当前select语句中的所有表。

  2. oracle错误:
    如果后台是oracle的数据库,如果我们在URL后面之间加单引号的话,我们会发现界面返回类似这个错误:

Error:SQLExceptionjava.sql.SQLException:ORA-01756:quoted string not properly terminated

由上面的错误我们可以很轻松的认出来ORACLE要求必须使用单引号结束。

0 0
原创粉丝点击