upload-labs 1-21关通关思路教程

Upload-Labs and 1-21关通关教程

前言:本文章一下的涉及的环境均来着GitHub中的官方upload-labs环境,中间件是使用phpstudy2018搭建,文章涉及的内容仅代表个人思路个人观点,绕过思路不是单一的,举一反三即可。请勿较真。

第一关:针对JavaScript的处理绕过

通过浏览器网络进行抓包,并没有发现任何数据,猜测为前端JavaScript验证的。
javascript
绕过方法:直接在浏览器禁用JavaScript代码
火狐浏览器禁用JavaScript
右键查看地址访问
上传成功

成功访问PHP info

第二关:Content-Type的验证

通过源代码可发现是验证上传文件的type值,那么直接修改成允许的值即可。
burp修改
上传成功

黑名单的绕过

前言:黑名单的意思就是,不允许上传的类型,比如禁止上传php,asp等等,这种就是黑名单。

第三关:其他后缀名的绕过

先看源代码

源代码:
 		$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); //收尾去空
        $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; 
        解析:这里定义了禁止上传的名单,并且对上传的后缀做了删除末尾的点,转换小写等等操作
        文件命名还做了时间戳的处理。

综合上面的源代码,发现并没有对php2,php3,phtml这些后缀进行过滤,在php中,这些后缀都是会当作php来解析的。前提是httpd.conf中AddType application/x-httpd-php.php.phtml.php3.php4.php5 没有被注释掉才可以用。ps:其实也可以通过.user.ini进行绕过。
上传成功

第四关:利用.htaccess绕过

先看源代码

源代码:
 		$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); //收尾去空
        $img_path = UPLOAD_PATH.'/'.$file_name;
        解析:这里定义了禁止上传的名单更多了,几乎能解析的后缀都被禁止上传了,但是仔细发现
        .htaccess并没有被过滤,.htaccess这个文件是在当前目录的文件,都可以被当作php进行执行,
        那么就可以上传一张图片马,结合.htaccess进行绕过即可。

步骤:
首先上传.htaccess文件,文件内容如下

SetHandler application/x-httpd-php

然后上传一张图片马,1.jpg
解析.htaccess文件

第五关:利用.空格.绕过

源代码:
        $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); //首尾去空

如果我是1.php. .上传到服务区就只剩下1.php.
但是在Windows中这个.是可以忽略的,造成可以直接被当作php去执行
修改后缀名
上传成功
正常访问解析

第六七八十关:均可以利用.+空格+大小写进行绕过,多想,举一反三,我相信问题都不大。

第九关:利用::$DATA绕过

源代码:
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = trim($file_ext); //首尾去空

通过源代码的分析,我们发现,并没有对::DATA字符串进行去除,从而我们可以通过::DATA进行绕过上传。
::DATA只在Windows中存在,这是特性,一旦出现这个,后面的后缀将被略过,不检测::DATA后的内容,但是保留::DATA前的后缀,所以,当我们上传1.php::$DATA的时候,就会只剩下1.php。
更改文件名为1.php::DATA
上传文件
直接访问是会显示DATA的后缀的,所以我们需要去掉后再进行访问
没去前
去掉后正常访问

第十一关:利用双写绕过

源代码:
$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","ini");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = UPLOAD_PATH.'/'.$file_name; 

注意上面这串代码,里面有一个重要的php函数,str_ireplace,这个函数的作用是替换字符,简单的例子,如果上传1.php,经过上面的代码替换,因为deny_ext中里面有php,所以就会把php替换为空,上传到服务器就会变成1.
验证
都知道当文件名中包含$deny_ext里面定义的值,就会替换成空,直接双写php即可绕过,上传1.pphphp上去,就会变成1.php,即可成功绕过。
1.pphphp

白名单的绕过

前言:白名单是指允许放行的意思,就是只允许上传指定后缀,和黑名单是刚好相反的操作。

第十二关:%00截断之get请求

%00截断的意思:0x00是十六进制,当函数处理的时候会把这个字符当作结束符,后面的内容将不会处理,系统读取文件名遇到0x00会以为读取结束。
注意:php5.3之后完全修复%00的截断,并且受限gpc和addslashes函数。所以想运用到实战中难度比较高。

源代码:
 $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

get的请求是直接在url中的,会自动编码的。这里给了用户可操作上传的地方。
上传1.jpg,然后在文件路径拼接处截断拼接的jpg即可。
直接上传即可

第十三关:%00截断之POST请求

源代码:
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

post的请求需要我们在burp中提前编码过,需要把%00进行编码即可。
%00编码过就会变成一个空格的。
post截断

图片马配合文件包含绕过

第十四至十六关:图片马配合文件包含

制作图片马:找一张图片,和一段php的执行代码,phpinfo也可以一句话木马也可以。
copy 1.jpg/b+1.php shell.jpg
成功上传
直接访问是解析不了,所以这个时候需要配合包含漏洞才可以解析里面的php代码
直接访问
成功访问

第十七关:二次渲染图片马配合文件包含

这一关上传的图片会进行二次渲染后,然后把php的代码去掉,所以正常的图片马是执行不了,需要使用特定的图片马才可以解析,如果有兴趣可以私信我要二次渲染图片也可以自己去网上找,这里就不上传了。
直接上传经过二次渲染后的图片马
渲染图片
直接包含即可解析
解析二次渲染

其他上传绕过

第十八关:竞争上传

前言:根据源代码来看,是允许你上传php的文件,但是你上传后会进行检测里面的内容,如果不符合的话,会对上传的文件进行删除。但是,如果我们在删除前去访问了上传的php的内容,并且这个php的内容里面可以生成出来一个新的php脚本,那么这个时候我们就可以直接访问生成出来的php代码。
代码解析:
a变量是一句话经过编码后的,然后会新建一个shell.php,然后经过解码写入shell.php。
php的代码
关于去访问的话,直接用python写个死循环访问你上传的那个文件即可。
python
直接上传php代码,会显示不允许上传的
在这里插入图片描述
成功上传
然后直接用菜刀连接即可。

关于代码审计

前言:以下的绕过方法其实都是可以配合文件包含利用的,但是下面的纯属个人的小心思,可以选择忽略。

第十九关:00截断绕过就可以的。和上面的是差不多的。不多赘述了。

第二十关:空格+.可以绕过 00截断也可以绕过,等等,发挥你的想象

第二十关:数组绕过

下面简单说说,不细说。

//检查MIME
    		$allow_type = array('image/jpeg','image/png','image/gif');
//判断数组
			if (!is_array($file)) {
            $file = explode('.', strtolower($file));
        }
//白名单检测
$allow_suffix = array('jpg','png','gif');
//最后是进行拼接,reset是数组的第一个,count是最后一个
$file_name = reset($file) . '.' . $file[count($file) - 1];

综合上面来说,就是说,如果我添加多一个数组,那么只要最后一个元素是满足白名单的内容,至于第一个,你就可以人为进行控制了。
下面是操作的过程:
数组的更改
效果验证

结束语:以上就是upload-labs的靶场全部通关内容了,如果你感兴趣的话可以选择关注我,以后会继续更新其他关于网络安全web层面的一些小故事,当然上面的文件上传漏洞只是一部分,还有配合一些中间件的解析漏洞,比如is6的解析漏洞,apache的解析漏洞都是存在的,后续大概会更新,敬请期待。本文所有解释权归作者本人请再坚持一下(qzjcyx)(http://upload.qzjcyx.com为本地环境的解析域名,并非公网的)。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值