提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 1.第一关
- 2.第二关
- 3.第三关
- 4.第4关(黑名单验证 htaccess)
- 5.第5关(大小写绕过)
- 6.第6关(末尾空格)
- 7.第7关(增加一个.)
- 8.第8关
- 9.第9关(代码不严谨)
- 10.第10关(PPHPHP)
- 11.第11关(0x00 截断)
- 2.抓包,sava_path修改为/13.php%00
- 12.第12关(Post 0x00 截断)
- 13.第13关(jpg图片木马)
- 14.第14关(png图片木马)
- 15.第15关(gif图片木马)
- 16.第16关(二次渲染绕过)
- 17.第17关(条件竞争)
- 18.第18关(解析漏洞)
- 19.第19关(黑名单)
- 20.第20关(白名单)
前言
上传文件的时候,如果服务器端脚本语言,未对上传的文件进行严格的验证和过滤,就有可能上传恶意的脚本文件,从而控制整个网站,甚至是服务器。
搭建了一个upload-labs靶场用来学习文件上传漏洞漏洞一共20关
1.第一关
看一下源码,在前端有校验,试试修改前端页面试试
1.保存html页面
ctrl+S把页面保存,修改前端代码
2.修改页面html
修改校验
将form的action地址写为第一关的地址
http://localhost/Pass-01/index.php
修改action
3.访问修改后的本地html文件
4.上传php文件
php文件内容
点击上传之后,地址变为了第一关地址,而且文件上传成功
5.访问上传的php
2.第二关
试了第一关的方法,校验方法没有写在html中,第一关方法用不了,看看源码,打算试试bp抓包
1.抓上传包修改文件类型 image/jpeg
2.上传成功
3.第三关
1.phtml php3会被解析为php
原理
apache服务器解析漏洞,会把phtml,php3类型解析为php
2.上传成功
4.第4关(黑名单验证 htaccess)
原理
使用.htaccess(超文本访问),是许多Web服务器根据目录应用设置的有用文件,允许在运行时覆盖Apache的默认设置。使用.htaccess,可以在运行时轻松启用或禁用任何功能。
1.新建.htaccess
它的作用是:强制将 loudong.jpg 文件当作 PHP 脚本解析并执行,即使它的扩展名是 .jpg。
2.将要上传的php文件拓展名改为loudong.jpg
名称要和.htaccess中的FilesMatch一样
3.上传两个文件
将两个文件都上传
上传.htaccess
上传loudong.php
4.上传成功
5.第5关(大小写绕过)
将第4关源码和第5关源码进行比较
发现第5关未将拓展名转为小写,直接和黑名单校验了,黑名单只有小写的,,那么就把上传文件拓展名大写,就能绕过了
1.php修改为PHP
直接改文件名,或者抓包修改文件名
2.上传成功
6.第6关(末尾空格)
第4关代码:
第6关代码:
两个比较发现少了拓展名首尾去空 那么在文件拓展名后面加上空格就可绕过
1.抓包,文件名加空格
2.上传成功
7.第7关(增加一个.)
第4关:
第7关:
少了删除文件末尾的”.“,那么修改文件名加个“。",应该能绕过
原理
Apache 的 AcceptPathInfo 默认行为:
如果请求路径包含冗余字符(如 /13.php.),Apache 仍会尝试解析 .php 部分。
PHP 的文件处理:
PHP 在接收文件路径时,会调用系统 API,而 Windows API 会忽略末尾的点,导致 13.php. 被当作 13.php 执行。
1.抓包,文件名加"."
2.成功上传
8.第8关
第4关
第8关
没有去除字符串:: D A T A ,文件名加上 : : DATA,文件名加上:: DATA,文件名加上::DATA
原理
windows会自动去掉末尾的"::$DATA"
1.抓包,文件加::$DATA
2.上传成功
9.第9关(代码不严谨)
原理
deldot从字符串的尾部开始,从后向前删除点.,知道该字符串的末尾字符不是.为止,而如果中间有个空格,就不会继续删除。
1.抓包 文件名加". ."
2.上传成功
10.第10关(PPHPHP)
原理
str_ireplace 函数用于字符串替换操作,不区分大小写,会把拓展名中的php替换为空所以改为pphphp
1.抓包 ,改为.pphphp
2.成功上传
11.第11关(0x00 截断)
原理
00 截断是操作系统层的漏洞。操作系统在识别字符串时,当读取到\0 字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0 字符的方式,达到字符串截断的目的。
save_path=…/upload/
filename=“loudong.jpg”
正常情况:…/upload/loudong.jpg
修改:
save_path=…/upload/13.php%00
filename=“loudong.jpg” 拼接的路径为:…/upload/13.php%00loudong.jpg :由于%00 当作结尾,故最终保存的文件
为…/upload/1.php
关键的代码在于这里的’save_path 是一个可控的变量,但是后面还拼接上一个后缀名,也需要绕过,
1.修改文件类型,把php改为jpg
2.抓包,sava_path修改为/13.php%00
3.上传成功
12.第12关(Post 0x00 截断)
原理
和上面一题代码对比,这里使用的是 Post 方式
但和 get 对比,需要多做一次解码的工作
GET 型提交的内容会被自动进行 URL 解码,在 POST 请求中,%00 不会被自动解
1.抓包,修改为/13.php%00
2.把%00转码
3.上传成功
13.第13关(jpg图片木马)
function getReailFileType($filename){
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch($typeCode){
case 255216:
$fileType = 'jpg';
break;
case 13780:
$fileType = 'png';
break;
case 7173:
$fileType = 'gif';
break;
default:
$fileType = 'unknown';
}
return $fileType;
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_type = getReailFileType($temp_file);
if($file_type == 'unknown'){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}
会验证上传内容,确认是图片格式,所以不能简单把 php 转化为 jpg,需要使用图片木马,需要在正常图片里面加入恶意代码
1.将图片和php木马融合,生生成.jpg图片木马
copy 1.png /b + 13.php /a webshell.jpg
2.上传成功
3.访问木马
上传的是个图片,需要使用文件包含漏洞来把图片当作代码来执行
14.第14关(png图片木马)
function isImage($filename)