0x01 攻击板块

在一次授权测试中,我被邀请去评估一个在线商城的安全性。没过多久,我发现了其中一个搜索功能的输入框存在SQL注入漏洞。这个漏洞让我能够通过精心构造的输入对后台数据库进行查询甚至修改。这篇文章将展示SQL注入攻击的实战过程,并介绍一些实用的工具和技巧。

漏洞成因剖析

SQL注入通常发生在应用程序通过不安全的方式将用户输入拼接到SQL查询语句中,未对输入进行适当的过滤或参数化处理。这种情况常见于以下场合:

  • 直接拼接用户输入:开发人员使用字符串拼接将用户输入插入到SQL查询中。
  • 缺乏预编译语句:没有使用参数化查询或预编译语句,导致SQL语句的构建过程不安全。
  • 错误的输入校验:输入验证不严格,未过滤特殊字符或SQL保留字。

在我们的案例中,该商城的搜索框直接将用户输入拼接进SQL查询中,而没有进行任何过滤和验证。

0x02 环境搭建与工具使用

为了复现这个攻击场景,我们可以使用Docker搭建一个模拟的漏洞环境。以下是环境搭建的步骤:

黑客示意图

环境搭建

  1. 安装Docker:确保你的系统上已经安装Docker工具。
  2. 拉取靶机镜像:使用docker pull命令下载一个包含SQL注入漏洞的靶机镜像。
  3. 运行靶机容器:启动容器实例并设置端口映射。

<pre><code class="language-shell">docker pull vulnerable/web-dvwa docker run -d -p 80:80 vulnerable/web-dvwa</code></pre>

工具使用

  • SQLMap:这是一款开源的自动化SQL注入工具,可以帮助我们快速检测和利用SQL注入漏洞。
  • Burp Suite:用于捕获和修改HTTP请求,便于手动测试和分析流量。

黑客示意图

在攻击中,我使用Burp Suite拦截HTTP请求,识别出可疑的参数,然后使用SQLMap进行自动化测试和攻击。

0x03 Payload构造的艺术

构造有效的SQL注入Payload需要对目标数据库的类型、版本有一定了解。以下是一些常用的Payload例子:

基础注入Payload

<pre><code class="language-sql">&#039; OR &#039;1&#039;=&#039;1</code></pre>

这个简单的Payload可以绕过一些基本验证,将条件始终评估为真。

基于时间的盲注Payload

<pre><code class="language-sql">&#039; UNION SELECT IF((SELECT database())=&#039;dbname&#039;, SLEEP(5), 0) -- </code></pre>

利用数据库响应时间来判断条件是否成立。

布尔型盲注Payload

<pre><code class="language-sql">&#039; AND (SELECT ASCII(SUBSTRING((SELECT @@version),1,1)))=51 -- </code></pre>

逐字符猜测数据库信息。

黑客示意图

在利用SQLMap时,我们可以直接使用参数进行高级Payload构造:

<pre><code class="language-shell">sqlmap -u &quot;http://localhost/search?query=test&quot; --dbms=mysql --level=5 --risk=3 --batch</code></pre>

0x04 绕过与免杀技巧

面对现代防御系统,免杀和绕过EDR/AV技术是必不可少的。针对SQL注入,可以采用以下策略:

输入过滤绕过

  • 编码绕过:使用URL编码、UTF-8编码等方式绕过基本的输入过滤。
  • 组合注入:将不同类型的Payload组合,避免被简单的正则表达式过滤。

检测与对抗

  • 流量伪装:在使用工具时,调整请求头和参数顺序,模拟普通用户行为。
  • 使用时间窗:通过在特定时间段发起请求,减少被检测的可能性。

0x05 检测与防御策略

虽然SQL注入风险极高,但通过以下方法可以有效检测和预防:

输入验证与清洗

使用严格的输入验证和清洗策略,对用户输入进行过滤,拒绝任何包含SQL保留字或特殊字符的输入。

使用参数化查询

始终使用参数化查询或预编译语句,避免直接拼接用户输入到SQL查询中。

安全审计与监控

定期进行安全审计,监控数据库访问日志和应用程序日志,及时发现异常行为。

0x06 攻击者的个人经验

在实际渗透测试中,SQL注入攻击的成功与否取决于细节。以下是一些经验:

  • 耐心与细致:很多情况下,简单的Payload无法直接奏效,需要反复调整和尝试。
  • 信息收集:在攻击前,收集尽可能多的目标信息,包括数据库类型、版本、表结构等。
  • 利用自动化工具:适当使用自动化工具可以提高效率,但仍需结合手动分析确保结果的准确性。

本文中的技术和工具仅限于授权测试和安全研究,请在合法合规的范围内进行操作。希望这些分享能为你的安全研究提供一些启发。