BUUCTF [HITCON 2017]SSRFme 1 深度解析:从代码审计到命令执行的完整攻击链

张开发
2026/4/17 13:37:16 15 分钟阅读

分享文章

BUUCTF [HITCON 2017]SSRFme 1 深度解析:从代码审计到命令执行的完整攻击链
1. 代码审计从沙盒逃逸到命令执行的突破口拿到这道题目的源码时我第一眼看到shell_exec和GET的组合就意识到事情不简单。先来看关键代码段$sandbox sandbox/ . md5(orange . $_SERVER[REMOTE_ADDR]); mkdir($sandbox); chdir($sandbox); $data shell_exec(GET . escapeshellarg($_GET[url]));这里有几个危险信号直接使用shell_exec执行系统命令命令拼接了用户可控的$_GET[url]参数虽然用了escapeshellarg做过滤但后面我们会看到如何绕过沙盒目录的生成逻辑也很有意思它用当前IP地址的MD5值作为目录名。假设我们的IP是127.0.0.1那么实际创建的目录会是sandbox/cfbb870b58817bf7705c0bd826e8dba7这个沙盒机制看似安全但其实存在致命缺陷。GET命令是Linux下的一个HTTP客户端工具类似curl的简化版通常用于获取网页内容。但关键在于——它不仅能获取HTTP资源还能处理本地文件和其他协议2. 漏洞利用从SSRF到RCE的完整链条2.1 初探SSRF文件读取我们先尝试最基本的SSRF利用?url./../../filenametest这个payload做了两件事通过相对路径./../../向上跳转目录将读取到的内容写入沙盒内的test文件访问生成的文件后我们发现可以列出目录结构。继续向上跳转?url./../../../../../filenametest这时候就能看到根目录下的文件了。但直接读取flag文件会发现内容为空这是因为题目设置了需要执行/readflag二进制文件才能获取真正的flag。2.2 突破escapeshellarg的限制核心难点在于如何绕过escapeshellarg的限制。这个函数会给参数添加单引号并转义已有单引号例如escapeshellarg(file:bash -c /readflag) // 输出file:bash -c /readflag看似安全但结合GET命令的特性我们可以利用file:协议和管道符实现突破。最终构造的payload如下?urlfile:bash -c /readflag|filenameresult这里有几个关键点file:协议让GET命令执行本地文件|管道符将前一个命令的输出作为输入整个命令会被bash解析执行2.3 命令执行的完整流程让我们拆解下实际执行的命令流服务器拼接命令GET file:bash -c /readflag|bash解析时会将其转化为bash -c /readflag执行结果通过管道传递给GET命令最终输出被写入result文件访问生成的文件就能看到flag内容了。这个过程中最精妙的是如何利用GET命令的特性绕过过滤这也是这道题目的核心考点。3. 技术细节深度剖析3.1 GET命令的隐藏特性大多数人对GET命令的认识停留在HTTP客户端功能但它其实支持多种协议http://https://file:ftp://特别是file:协议它允许直接读取本地文件内容。但题目更进一步利用它执行了系统命令。3.2 escapeshellarg的绕过艺术escapeshellarg通常被认为是安全的但在这个场景下被完美绕过。关键在于单引号包裹的字符串中管道符|仍然会被bash解析GET命令会处理file:协议后面的内容整个字符串最终会被bash二次解析这种多层解析的特性创造了安全过滤被绕过的条件。3.3 Linux管道符的妙用管道符|在这个攻击链中起到了关键作用它让bash将GET命令的参数作为命令执行前一个命令的输出可以作为后一个命令的输入在这个场景下它帮助跳出了GET命令的上下文4. 防御方案与最佳实践4.1 安全的命令执行实现如果业务必须使用命令执行应该使用白名单限制可执行的命令避免直接拼接用户输入考虑使用更安全的替代方案如PHP的proc_open$descriptorspec [ 0 [pipe, r], 1 [pipe, w], 2 [pipe, w] ]; $process proc_open(safe_command, $descriptorspec, $pipes);4.2 输入过滤的强化方案单纯的escapeshellarg不够安全应该校验输入是否符合预期格式过滤特殊字符如|、、;使用正则表达式严格限制输入范围if (!preg_match(/^[a-z0-9\-\.]$/i, $_GET[url])) { die(Invalid input); }4.3 沙盒环境的正确实现沙盒机制需要使用chroot等真正的隔离技术设置适当的文件系统权限禁用危险函数和系统命令# 创建真正的隔离环境 mkdir -p /var/sandbox/{bin,lib,lib64} chown nobody:nogroup /var/sandbox chmod 750 /var/sandbox这道题目展示了从SSRF到RCE的完整攻击链关键在于理解每个组件的特性和它们组合时产生的化学反应。在实际开发中任何涉及命令执行和文件操作的功能都需要格外小心多层次的防御措施才能确保安全。

更多文章