文章目录
- Pass-01 前端JS
- Pass-02 MIME检测
- Pass-03 特殊文件后缀
- Pass-04 .htacess上传
- Pass-05 user.ini文件上传
- Pass-06 大小写绕过
- Pass-07 空格绕过
- Pass-08 .绕过
- Pass-09 ::$DATA绕过
- Pass-10 .空格.绕过
- Pass-11 双写绕过
- Pass-12 %00截断
- Pass-13 %00截断
- Pass-14 上传图片马
- Pass-15 上传图片马
- Pass-16 上传图片马
- Pass-17 上传图片马
- Pass-18 条件竞争
- Pass-19 条件竞争
- Pass-20 /.绕过
- Pass-21 数组绕过
Pass-01 前端JS
前端JS的检验
加载时弹出对话框
绕过:1.利用BP工具
2.修改webshell为允许上传类型
先上传个a.php试试,发现弹窗口,只能上传jpg、png、gif类型的图片
写个一句话木马,尝试上传
JS绕过上传
可能是前端存在过滤,打开F12检查一下,发现是checkFile()函数存在过滤
禁用JS,因为这个checkFile()函数是前端的脚本,所以如果经用了JS,实际上就是禁用这个检测的checkFile函数,或者直接删除掉这个checkFile的函数,因为如果要禁用JS的话,就有可能禁用掉正常的JS代码,可能会影响文件的正常上传
然后再次上传a.php,发现上传成功了(然后用hackbar)
或者用burp抓包的方式
修改后缀的png
变成php
,然后重新发包
可以看到已经上传成功,得到了图片的url
然后用蚁剑连接一下,就可以连接后台噜
密码就是一句话木马上传的那个
Pass-02 MIME检测
服务器MIME检测:检测Content-Type的内容
绕过:修改类型
将php
文件上传,发现不行
然后将其后缀改成png
并抓包
可以看到文件类型为png
修改一下后缀,和上道题的方法相同
然后连接蚁剑,拿到后台
Pass-03 特殊文件后缀
特殊解析后缀
服务器文件名拓展名检测(检测根文件 extension 相关的内容)
基于黑名单检测:黑名单的安全性比白名单的安全性低很多,攻击手法自然也比白名单多。一般由个专门的blacklist,里面包含常见的危险脚本文件。
绕过:1.文件大小写让绕过(Php ,PhP pHp,等)
2.黑白名单绕过(php,php2,php3,php5,phtml,asp,aspx,ascx,ashx,cer,asa,jsp,jspx)cdx,\x00hh\x46php
3.特殊文件名绕过
(1)修改数据包里的文件名为 test.php 或 test.asp_(下划线是空格)由于这种命名格式在 windows系统里是不允许的,所以在绕过上传之后windows系统会自动去掉.点和空格。Linux和 Unix中没有这个特性。
(2)::$DATA(php在windows的时候如果文件名+"::DATA"会把::DATA之后的数据当作文件流处
理,不会检测后缀名,且保持"::DATA"之前的文件名,其目的就是不检查后缀名)
4.0x00截断绕过(5.2 C语言中将 \0 当作字符串的结尾)
5.htaccess文件攻击(结合黑名单攻击)
6.解析绕过
上传3.php
,发现失败了
查看一下源代码吧
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
浅浅分析一下:isset
是确定上传按钮存在
file_exists
是确定上传路径存在
deny_ext
是删除后缀名为’.asp’,‘.aspx’,‘.php’,‘.jsp’
trim
:是php的函数,是去除字符串首尾的空白符
deldot
是即从字符串的尾部开始,从后向前删除点.
,直到该字符串的末尾字符不是.
为止
strchr
:查找.
的第一次出现,并返回此字符串的其余部分
strtolower
:把所有字符都转换为小写
str_ireplace
:把不允许的后缀名都给删除了,并且不区分大小写 ,将::$DATA
替换为空
黑白名单绕过
在某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml。
我们可以试试将3.php
改成3.php3
上传成功了,但是文件名的名字发生改变
特殊文件名绕过
进行特殊文件名绕过
可以发现成功上传,但是文件名有变动
Pass-04 .htacess上传
.htacess上传绕过
文件上传之.htaccess绕过黑名单——upload-labs靶场第四关
.htaccess上传绕过文件上传黑名单
Apache服务器允许在每个目录下存在一个名为.htaccess的文件,.htaccess是一个纯文本文件,该文件可以作为Apache辅助配置文件,仅在当前目录生效。.htaccess文件可以实现URL重写、自定义错误页面、MIME类型配置以及权限访问控制等。起到了伪静态应用、图片防盗链、自定义404错误页面、允许或阻止特定IP地址范围访问、目录浏览与主页、禁止访问指定文件类型以及文件密码保护等等的作用。
.htaccess只针对Apache服务器有效
上传一个php文件,发现不能上传
查看源码:
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
上一道题因为过滤了上传文件的文件名后缀,所以我们可以使用php5、phtml、php3、phps
等后缀名来进行绕过,但是这一关将这些后缀名也进行了过滤,所以我们可以用.htaccess
上传来绕过
可以上传一个.htaccess
的文件
创建一个.htacess的文件,里面写入:
<FilesMatch "4.png">
SetHandler application/x-httpd-php
</FilesMatch>
FileMatch表示匹配4.png的文件,当该文件匹配成功后,setHandler表示将文件名中有“4.png”的文件作为PHP类型的文件来进行处理
然后再上传4.png,利用图片构造HackBar请求
Pass-05 user.ini文件上传
user.ini文件上传
Upload-labs Pass-05 .user.ini文件上传-优快云博客
.user.ini文件上传
从上一关,我们可以知道.htaccess可以覆盖apache的配置文件,而user.ini 则可以覆盖php.ini的配置
.htaccess文件只能用于apahce,不能用于iis和nginx等中间件
.user.ini只能用于Server API为FastCGI模式下,而正常情况下apache不是运行在此模块下的。
.htaccess和.user.ini都只能用于访问本目录下的文件时进行覆盖。
所以先创建.usere.ini
文件
里面写入:
方法一:
auto_prepend_file = 5.png //包含在文件头
方法二:
auto_append_file = 5.png //包含在文件尾
.user.ini文件的意思是:所有的php文件都自动包含一个5.png文件。user.ini相当于一个用户自定义的php.ini
然后上传.user.ini
,再上传5.png
发现上传成功
直接查看图片路径会现在解析图片错误,是因为只有在访问php
文件时,才会自动包含5.png
,所以作者给了提示在上传目录下是有一个readme.php
文件的,所以直接访问此文件就可以包含上传的shell
了
Pass-06 大小写绕过
大小写绕过
上道题的源码,有个strtolower
这道题的源码:
可以看到没有strtolower
了,所以直接用大小写绕过
利用BP抓包看一下,修改一下大小写
大小写绕过原理:
Windows系统下,对于文件名中的大小写不敏感,例如test.php和TeSt.PHP是一样的。
Linux系统下,对于文件名中的大小写敏感,例如:test.php和 TesT.php就是不一样的。
Pass-07 空格绕过
空格绕过
查看源码:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
$file_name = $_FILES['upload_file']['name'];
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH