常见SQL注入方法整理系列-初始篇
前面介绍了MSSQL、MYSQL以及ORACLE的一些涉及安全体系的基本知识,且当作知识的积累或者温故吧。本篇主要介绍这三种数据库的攻击手法,力求形成一套攻击流程,当然流程是死的,在真实的攻击环境中还是需要发挥聪明才智的,所以也且当作参考笔记吧。
1 发现SQL注入漏洞
万事开头难,SQL注入攻击同样如此。给定一个WEB站点URL,发现该站点SQL注入漏洞最快的方法莫过于使用扫描工具,最有效的我自认为是查看应用程序源代码。然而工具往往不是万能的,查看源代码寻找注入漏洞的机会通常也是没有的,所以此时手工探测注入漏洞就显得格外重要了。
2 经典方法
相信听说过SQL注入攻击的,都知道最经典的探测方法。这里假设存在一个GET请求的连接http://www.sqltest.com/sql.php?id=1,则经典的做法如下:
http://www.sqltest.com/sql.php?id=1and 1=1
http://www.sqltest.com/sql.php?id=1and 1=2
如果and 1=1页面响应与正常请求一样,and 1=2页面返回异常信息出错,OK,基本可以断定存在SQL注入漏洞。
3 利用字符串连接符号
SQL Server、ORACLE以及MYSQL的字符串连接符各不相同,利用这一点不同可以用来识别各自的SQL注入漏洞。向Web服务器发送下面两个请求:
http://www.sqltest.com/sql.php?name=jack
http://www.sqltest.com/sql.php?name=ja’+’ck
如果两个请求结果相同,则很可能存在SQL注入漏洞,且数据库为SQL Server。同理:
http://www.sqltest.com/sql.php?name=jack
http://www.sqltest.com/sql.php?name=ja’||’ck
与
http://www.sqltest.com/sql.php?name=jack
http://www.sqltest.com/sql.php?name=ja’‘ck
两个请求结果相同,则可能存在SQL注入漏洞,且数据库为ORACLE与MYSQL。
4 数据库错误
通过发送意外的数据产生数据库异常错误来寻找SQL注入漏洞,WEB产生数据库错误有很大的可能存在数据库错误。
最简单的方法是发送一个单引号,如下:
http://www.sqltest.com/sql.php?id=1’
WEB服务器利用用户的输入构造一条SQL查询语句,由于引号的存在导致SQL语法错误,服务器返回语法错误信息,根据这条信息我们就有很大可能判定存在SQL注入漏洞。
既然这里发送的请求包含意外的数据,那么这种数据如何构造,如何发送呢?在构造意外数据前有必要了解一下WEB环境的客户端/服务器架构。浏览器(客户端)向服务器发送请求并等待响应。服务器接收请求产生响应,并返回客户端。很明显,双方必须存在某种方式的约定,这就是HTTP协议。
HTTP协议定义了很多客户端发送数据的方式,本手册我们只关注两种最有用也是最常见的方式:GET和POST。所以制造意外数据就是修改在GET和POST请求中提交的数据。如果浏览器禁止修改数据或者对输入的数据的大小有限制怎么办?遇见这种情况我们只需要通过一个代理服务器来解决就可以了,比如安装一下Fidler工具,利用代理工具除了修改GET和POST数据外,还可以修改一些隐藏域或者Cookie的值,这些地方也经常存在SQL注入漏洞。
异常数据产生的异常响应被服务器返回后要及时捕获。产生的数据库错误信息是我们判断SQL注入漏洞的根据,这里对常见的数据库错误不详细说明,遇到具体情况具体分析,至于利用数据库错误的攻击手法,后面会有介绍。
5 补充说明
其实发现SQL注入漏洞的过程就是不断修改自己提交的数据,探测其是否能够在服务器上执行,这也是SQL注入攻击的本质。其实经典方法,字符串连接符号都是如此,不过对返回的结果需要我们判断一下。这里补充一些符号、关键字,这些符号、关键字都可以用于判断SQL注入漏洞,至于怎么探测,就需要点聪明才智了。
[关键字]
and;or;having;group by;order by;is;in;between and;not;like;regexp;
[符号]
<=>;<=;!<;!=;!>;=;<>;>=;^=;>>;<<;<;>;+;-;*;/;%;&;|;^;~;!;&&;||;
这些关键字未区分数据库,有选择使用。如mysql中可以这样使用:
http://www.sqltest.com/sql.php?id=1&& 2|1;
如果页面返回正常,那么有很大可能存在SQL注入漏洞。