常见SQL注入方法整理系列-初始篇

标签: 专栏 SQL注入 信息安全 信息安全工程师 小白 | 发表时间:2017-08-31 00:22 | 作者:炼石教育_曹博士
出处:http://www.freebuf.com

前面介绍了MSSQL、MYSQL以及ORACLE的一些涉及安全体系的基本知识,且当作知识的积累或者温故吧。本篇主要介绍这三种数据库的攻击手法,力求形成一套攻击流程,当然流程是死的,在真实的攻击环境中还是需要发挥聪明才智的,所以也且当作参考笔记吧。

发现SQL注入漏洞

万事开头难,SQL注入攻击同样如此。给定一个WEB站点URL,发现该站点SQL注入漏洞最快的方法莫过于使用扫描工具,最有效的我自认为是查看应用程序源代码。然而工具往往不是万能的,查看源代码寻找注入漏洞的机会通常也是没有的,所以此时手工探测注入漏洞就显得格外重要了。

经典方法

相信听说过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注入漏洞。

利用字符串连接符号

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。

数据库错误

通过发送意外的数据产生数据库异常错误来寻找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注入漏洞的根据,这里对常见的数据库错误不详细说明,遇到具体情况具体分析,至于利用数据库错误的攻击手法,后面会有介绍。

补充说明

其实发现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注入漏洞。

相关 [常见 sql 方法] 推荐:

常见SQL注入方法整理系列-初始篇

- - FreeBuf.COM | 关注黑客与极客
前面介绍了MSSQL、MYSQL以及ORACLE的一些涉及安全体系的基本知识,且当作知识的积累或者温故吧. 本篇主要介绍这三种数据库的攻击手法,力求形成一套攻击流程,当然流程是死的,在真实的攻击环境中还是需要发挥聪明才智的,所以也且当作参考笔记吧. 万事开头难,SQL注入攻击同样如此. 给定一个WEB站点URL,发现该站点SQL注入漏洞最快的方法莫过于使用扫描工具,最有效的我自认为是查看应用程序源代码.

我的Sql常见面试题(总结)

- - CSDN博客推荐文章
我开的  DBA群:225982985. 1.用一条SQL语句 查询出每门课都大于80分的学生姓名. 姓名 课程编号课程名称 分数. 1        2005001  张三 0001      数学    69. 2        2005002  李四 0001      数学    89. 3        2005001  张三 0001      数学    69.

SQL常见的可优化点

- - OurMySQL
查询(或更新,删除,可以转换为查询)没有用到索引.    这是最基础的步骤,需要对sql执行explain查看执行计划中是否用到了索引,需要重点关注type=ALL, key=NULL的字段.    B树无法解决此类问题,可以考虑搜索引擎.    但是member_id like ‘alibab%’可以用到索引.

常见 SQL 面试题:经典 50 例

- - SegmentFault 最新的文章
-- 含义是跳过2条取出1条数据,limit后面是从第2条开始读,读取1条信息,即读取第3条数据 select * from table limit 2 offset 1;. -- 含义是从第1条(不包括)数据开始取出2条数据,limit后面跟的是2条数据,offset后面是从第1条开始读取,即读取第2,3条.

提高SQL执行效率的方法

- - CSDN博客推荐文章
Oracle提供了多种方法用于减少花在剖析Oracle SQL表达式上的时间,在执行带有大量执行计划的复杂查询时剖析过程会拖累系统的性能. 现在我们来简要地看看这些方法中的几种.   1、使用ordered提示.   Oracle必须花费大量的时间来剖析多表格的合并,用以确定表格合并的最佳顺序. 如果SQL表达式涉及七个乃至更多的表格合并,那么有时就会需要超过30分钟的时间来剖析,因为Oracle必须评估表格合并所有可能的顺序.

Sql Server 大数量插入方法简单汇总

- ddtd - 博客园-首页原创精华区
   在某些场景下,可能需要在短时间内向数据库中插入大量数据,数据来源可能是性能非常高的实时数据库或者文件,然后转换为关系数据库中的内容,这就要求关系数据库具有非常高的写入性能.     解决办法1:在默认情况下,Sql Server把每一次写入当做一个事物处理,在大数据量写入的情况下,每一次写入的事物处理需要耗费非常多的性能和时间,如果插入10w条记录,使用10w次insert语句,在普通pc上30秒钟都无法完成,如果仅启用一次事物,然后做10W次insert操作,仅需要短短的1秒钟就可以完成.

Oracle EBS SQL Trace日志收集的方法

- - CSDN博客推荐文章
Raw Trace的收集方法. 打开Trace,Help > Diagnostics > Trace > Trace > Trace with Binds and Waits. Trace项代表的意思. 3.关闭Trace,Help > Diagnostics > Trace > Trace > No Trace.

Sybase ASE15.x中启用跟踪SQL语句的方法

- - CSDN博客推荐文章
当说到跟踪SQL语句,有人可能会问起这个功能,也许有人会想到用审计功能,为了跟踪SQL语句,去启用审计功能,会成为一种浪费,或许用户只是想跟踪某一个连接的所有SQL语句呢. 1> set tracefile "d:/abc.txt" 2> go 1> set show_sqltext on 2> set statistics io on 3> go 1> select * from t123 2> go id.

查看sql语句执行时间的方法

- - SQL - 编程语言 - ITeye博客
SQL Server中可以通过设置STATISTICS查看执行SQL时的系统情况. 1、选项有PROFILE,IO ,TIME. SET STATISTICS PROFILE ON:显示分析、编译和执行查询所需的时间(以毫秒为单位). SET STATISTICS IO ON:报告与语句内引用的每个表的扫描数、逻辑读取数(在高速缓存中访问的页数)和物理读取数(访问磁盘的次数)有关的信息.

MYSQL查询SQL语句性能优化方法

- - 数据库 - ITeye博客
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,. Sql 代码 : select id from t where num is null;.