OWASP——SQL注入(一)

来源:互联网 发布:陈江华的体测数据 编辑:程序博客网 时间:2024/05/21 19:48

前言

对于OWASP发布的十大安全风险简单介绍在上一篇博文已经分享了,本文是对2013年发布的OWASP Top 10中的A1注入部分进行分享学习。

本地学习环境

DVWA环境搭配:
1.本地建立DVWA环境,在线进行测试练习,前往dvwa官网下载最新版本DVWA;
2.搭建php环境以及安装mysql数据库,建议phpmyadmin安装,对于学习而言非常方便快捷,这个工具将php以及myadmin都进行封装。
3.将DVWA解压之后放入phpstudy目录下的www文件夹中,开启phpstudy的mysql和Apache的服务,在浏览器中输入127.0.0.1的本地url,进入DVWA文件夹,在登录页面输入默认帐号和密码进入实验环境。
4.DVWA Security选择相应等级为low,其他安全等级测试会后续更新。

SQL-Injection

1.注入原理:
sql语句可以被服务器接收作为输入参数,而我们可以通过sql语句的注入达到获取数据库信息的目的,主要是一些敏感信息,下图为客户端与服务器及数据库之间简单联系。

1

2.注入场景:
表单输入或者存在客户端输入的地方都可能作为注入利用,而这是利用服务端接收到来自客户端的信息而没有做较好过滤的缺陷,将一些非法输入内容传送到数据库获取一些敏感数据。
3.注入点测试:
通过sql注入的原理,可能中间具体是怎样的还不能完全清晰,但是知道是因为什么导致可以注入,而要实现注入的关键起始就是找到注入点,注入点就是可以将外部指令内容作为数据传输到服务端的数据库的位置,而最简单的测试便是单引号',因为服务端写好的php中的数据库语句可能是

select * from user where user='' and pass=''

而数据库查询时引号是字符串内容合闭的符号,是成对出现的,而我们输入的单引号能够不被过滤就会使得查询语句变为user=''' and pass='',这便出现了落单的单引号,数据库就会报错,在dvwa中会显示错误点,这便说明这是一个注入点。
找到注入点便可以将一些复杂的查询语句进行注入然后被执行,达到我们的渗透目的。

上述的简单判断是否有注入点的方法被叫作基于报错的检测方法,是比较基础的办法(暂定义为low等级),这种方法除了单引号,还可以使用双引号,百分号以及小括号。

还可以通过布尔逻辑判断进行检测,这个便是使用到逻辑布尔运算符,将上述方法的输入内容换为“1’and’1”,布尔值为真可以得到一个正确的返回值,如果变为“1’and’2”,可以得到一个错误或者不会有正确结果,这时可以确定是存在注入的。

我把注入点检测方法归结为以下简单的两点(学习比较深入的大神欢迎补充):

1).基于报错的检测方法

2).基于布尔的检测

4.字段数
当知道注入点之后,为了能更好的展开注入,需要对查询的字段进行检测,因为这对注入的信息获取很有帮助,同时也会让注入者明确知道得到的信息来自哪里。
上面展示的web服务端的sql语句只是一个猜想,可能不不是这些字段的查询,可能是单一字段查询,可能是使用“*”对所有字段进行查询。

对查询的字段个数进行判断可以使用order by语句,在数据库中“order by”是对结果集进行排序用的,还可以设置升降,不过这里用默认的“order by”就可以。

如果查询语句是使用所有字段即*,那么“order by”可以得到字段的长度即一共多少个字段,但是如果是指定字段查找就不一定得到所有字段。

在测试字段个数时需要对其进行一个模糊检测,因为一开始也不知道具体是多少个对象,如果输入' order by 50--,那么sql语句为

select * from user where user='' order by 50-- '

其中为了保证引号的合闭,最后使用注释符号“– ”或者“#”,“– ”最后带有一个空格,这样得到错误提示便说明字段数不正确,不断缩减至当不报错时可以确定字段数在上一个报错到目前的数字范围,最后可以得到当前的字段数。

在得到字段数之后就要知道哪些字段,因为使用多条语句单独查询可能在web服务端的sql语句是不符合逻辑的,这时需要union进行联合查询替代多条查询语句,如已知字段数是2,可以通过输入' union select 1,2--得到字段名。
5.数据库基本信息
在上述的sql字段测试中我们使用了带union的联合查询,此后为了进一步地得到sql中的数据信息,需要变换查询内容,如要得到当前数据库的帐号可以使用user()函数,在查询结果中会返回当前数据库使用的帐号名,要知道当前数据库版本信息可以使用version()函数,从版本可以推知是使用mysql,还是sql server,或者oracle版本的数据,就像dvwa中显示的是5.0.51,这个只能是mysql的数据库,要知道数据库名可以使用database()函数。
在查完这些信息之后,就要去查询表的具体内容,而除了查询函数外还可以使用全局变量得到更多信息,@@datadir可以得到当前数据库所在目录,@@hostname可以得到使用的主机名,@@VERSION和version()函数效果一样,@@version_compile_os可以得到所在系统版本,CHAR()函数可以将ASCII码转为对应字符以应对一些字符串过滤。
而在dvwa的测试中因为只有两个字段,要获取所有信息需要分多次来获得,这时可以使用连接字符串显示多个信息,CONCAT_WS(CHAR(32,58,32),USER(),DATABASE(),VERSION())这样得到三个信息且用三个字符分割。

Q:知道数据库版本有什么用?
A:因为不同数据库类型版本有不同的特征可以利用,像mysql将所有元数据保留在一张表中,这张表是information_schema,它包含所有库的信息。

6.数据库查询
' union select table_name,table_schema from information_schema.tables--,table_name就是所有的表名,table_schema是所有的库,information_schema.tables就是这个表中所有的表名(其中mysql库有17张表,听说要深入了解mysql要对其17张表弄懂),对不同库及表进行归类,
'UNION select table_schema,count(*) FROM information_Schema.tables group by
table_schema --

7.数据表查询
' union select table_name,table_schema from information_schema.tables where table_schema='dvwa'--
8.数据字段查询
' union select table_name,column_name from information_schema.columns where table_schema='dvwa' and table_name='users'--
9.数据字段敏感内容查询
' union select user,password from users--

实践测试结果

1.等级安全:选择安全等级

2.测试注入点:
1

3.字段数:
1)长度为3的测试:2
2)长度为2的测试:3
4.数据库基本信息:
4
5.查询数据库:
5
6.查询数据表:
6
7.查询字段名:
7
8.查询字段内容:
8

小结

测试结果顺利找到并利用注入漏洞将数据库中账户密码获取,但是这是一个布置好漏洞环境的实验平台,如果是实际web应用平台,发现这样的漏洞时,不要好奇心作怪去盗取他人的信息,可以将漏洞信息及修补方案交给该应用企业管理维护人员去修补。

0 0