Sql注入英文全称是Sql Injection,实施过程大部分是通过Web浏览器,或者其他的黑客工具来实施攻击的。Sql注入的时候表面看不出来有什么不一样,因为过程中就像你敲网站域名那样,写下字符,然后按下回车,但是危险可能已经发生了。
简单地说,Sql注入(sql injection)是这样的一种漏洞:应用程序在向后台数据库传递sql(structured query language,结构化查询语言)查询时,如果为攻击者提供了影响该查询的能力,则会引发sql注入。攻击者通过影响传递给数据库的内容来修改SQL自身的语法和功能,并且会影响SQL所支持数据库和操作系统的功能和灵活性。SQL注入不只是一种会影响Web应用的漏洞;对于任何从不可信源获取输入的代码来说,如果使用了该输入来构造动态SQL语句,那么就很可能也会受到攻击。涛涛电脑知识网
目前整个互联网流行的注入,按照数据库结构来划分的话,有5个方向。
A. Access注入
B. Mssql注入
C. Mysql注入
D. Oracle注入
E. Sysbase注入
F. 其他数据库注入
下面让我们来详解一下asp类型的注入到底是通过怎么样步骤来实施攻击的。
Access注入概况
Asp注入划分起来也比较复杂。简单的说,asp的注入可以和access数据库来结合,那么得到注入点的时候,不会有权限高低之分,但是asp也可以和Mssql数据库来结合,在这种情况下得到的注入点,会有3种情况。
1. Public
2. Db_owner
3. SA
这三种权限简单的介绍一下:public权限是最小的一个,面对这样的注入点,可以列表和字段,得到管理员账号密码,db_owner权限比public大点,这样的权限可以得到网站绝对路径之后,用备份的方式得到目标网站Webshell(拥有一个网站的权限);sa权限是最大的一个,全名是(System Admin),简单的说这种权限相当于windows下面的administrator管理员,由此可见,这样的注入点是有多么大的危害。
Access注入的产生过程
Web应用语言均提供了可编程的方法来和数据库进行交互,比如数据查询等。在这个条件下,如果Web开发人员无法确保用户在输入的参数和收到的值传递给数据库做查询的时候已经得到了很好的处理,那么通常会发生注入,如果攻击者能够控制发送给数据库查询的语句,那么数据库查询解析的时候就会把数据解析成代码,攻击者就能得到他想得到的数据库查询的数据。
判断Access是否存在注入
在学习注入之前,应先将IE浏览器设置一下,具体步骤如下。
工具→→Internet选项→→高级→→显示好友http信息
把显示好友http信息前面的勾去掉,然后确定,那么第一步算是大功告成了。这样做是因为如果不把勾去掉,那么网站爆出的任何错误都可能是http500错误,在网页上不会得到更详细的其他信息。具体操作如下图1和图2所示。
图1
图2
设置完之后,打开本地搭建的一个asp Web程序的环境,来测试注入漏洞。
例1 ?id=50'我们在这个地址后面加上单引号’,服务器会返回下面的错误提示,如图3所示:
Microsoft JET Database Engine 错误 '80040e14'
语法错误 (操作符丢失) 在查询表达式 'id < 50''' 中。
/news.asp,行 84
图3
通过这个报错的结果,得到了几条重要的信息:
1.网站使用Access数据库,通过JET引擎连接数据库
2.该SQL语句所查询的表中有一名为ID的字段
3.程序没有判断用户输入的内容是否合法
4.该注入为数字型注入
所以,可以看到,SQL注入的原理简单地说就是从客户端提交特殊的代码,从而收集程序、数据库及服务器的信息。
当然,这样测试是否为注入点,还不是太好的方法。每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了参数之类的话,SQL注入是不会成功的,但服务器可能同样会报错,具体提示信息为:处理 URL 时服务器出错。请与系统管理员联系,如图4所示。
图4
其次,部分对SQL注入有一点了解的程序员,认为只要把单引号过滤掉就安全了,这种情况不为少数,如果你用单引号测试,是测不到注入点的。那么,什么样的测试方法才是比较准确的呢,答案如下:
1 ?id=50
2 ?id=50 and 1=1
3 ?id=50 and 1=2
此时,查询数据库的时候sql语句就变成了下面的SELECT * FROM 表 WHERE id = 50
下面举个例子 :
这是一张数据库的截图data.mdb下面都是表,如图5所示:
点开其中一个表,比如gmadmin右边出现了id gmadmin gmpass这就叫字段,然后每个对应的字段都有对应的数据。
图5
所以,这句代码就很好理解了
SELECT * FROM 表 WHERE id = 50
从表里面找一个确定的字段,那个字段对应的id 是50,然后找出对应的数值。
下面看看测试注入的情况:
SELECT * FROM news WHERE id = 50 and 1=1 条件为真,因为1确实等于1
SELECT * FROM news WHERE id = 50 and 1=2 条件为假,因为1不等于2
测试一下,分别使用这2条语句打开网页是什么样的。首先看一下不加任何参数的原始页面,如图6所示。