文件上传Ⅰ
文件上传--前后端验证
不让上传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+短标签+过滤+文件头:
思路:1第0关+文件验证
文件头部检测是否为图片格式文件
user ini: GIF89A auto_prepend_file-test png
test png:GIF89A<?=nclude"/var/lo""g/nginx/access.lo"g"?>
余下步骤同第10关!
以上为个人在学习时的总结,如有错误,欢迎大家前来评论指正哦!!!