SUCTF2019-EasyWeb
源码
1 | |
代码审计
1 | |
创建基于IP MD5哈希值的唯一上传目录
目录格式:upload/tmp_[用户IP的MD5]
1 | |
检查是否有文件上传
获取上传文件的临时路径、原始文件名和扩展名
1 | |
安全限制:
禁止包含ph的扩展名
内容过滤:检查文件内容是否包含php起始标记<?
图像验证:使用exif_imagetype()验证是否为有效图像文件
1 | |
将文件上传到专属目录
输出文件保存路径
1 | |
获取?_=参数值,无参数时显示源码
1 | |
限制参数值为18个字符
1 | |
字符过滤
禁止使用:控制字符(\x00-\x1F)、空格、数字0-9、大小写字母、特殊字符
1 | |
count_char($hhh,3)返回参数中使用的唯一字符
限制最多使用12中不同字符
1 | |
危险函数
异或运算构造$_GET{};
我们可以使用异或绕过来构造$_GET[]();的格式来调用get_the_flag函数
异或生成脚本
1 | |
payload:
1 | |
.htaccess上传
如果像之前一样在文件前面加个GIF89A是不行的,会有500响应码
解法一
1 | |
可能是为了绕过某些 WAF 的规则检测。
解法二
1 | |
<?和exif_imagetype的绕过
利用 .htaccess 文件和文件幻术绕过代码中对文件上传的严格检查,进而执行任意代码获取 flag。具体步骤为:上传特制的 .htaccess 文件,利用 php_value auto_append_file 和 AddType 指令,配合 php://filter 伪协议绕过对 <? 的检测;同时,为上传的 PHP 代码文件添加 GIF 文件头幻术绕过 exif_imagetype 检测。
.htaccess 文件是 Apache 服务器的配置文件,可用于在目录级别覆盖全局服务器配置。我们可以利用它来改变 PHP 解析文件的方式。
1 | |
shell.gif文件的创建
1 | |
注意:文件幻术头一般为GIF89A,这里只有6位,而base64解码时以4个字符为单位,所以需要再加两位随机字符
上传文件
html表单上传
由于没有上传界面,自己写一个上传的html表单
1 | |
分别传入.htaccess文件和shell.gif文件
得到两个路径
1 | |
python脚本上传(更方便)
这里也可以用python脚本一键完成
1 | |
同样也是得到两个路径
然后用蚁剑连接shell.gif的路径即可。
绕过open_basedir和disable_function
在上传之后就可以通过蚁剑连接,但我们发现不能访问其他目录。查看phpinfo之后发现有open_basedir
方法一:
利用蚁剑插件,选择PHP7 GC with Certain Destructors UAF
然后在根目录发现flag
方法二:
- 首先构造一个相对可以上跳的open_basedir 入mkdir(‘lin’); chdir(‘lin’) ,当然我们这里有上跳的路径我们直接 chdir(“img”)
- 然后每次操作chdir(“..”)都会进一次open_basedir的比对由于相对路径的问题,每次open_basedir的补全都会上跳。
- 比如初试open_basedir为/a/b/c/d:
- 第一次chdir后变为/a/b/c,第二次chdir后变为/a/b,第三次chdir后变为/a 第四次chdir后变为/
- 那么这时候再进行ini_set,调整open_basedir为/即可通过php_check_open_basedir_ex的校验,成功覆盖,导致我们可以bypass open_basedir。
1 | |
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。