Upload-Labs and 1-21关通关教程
前言:本文章一下的涉及的环境均来着GitHub中的官方upload-labs环境,中间件是使用phpstudy2018搭建,文章涉及的内容仅代表个人思路个人观点,绕过思路不是单一的,举一反三即可。请勿较真。
第一关:针对JavaScript的处理绕过
通过浏览器网络进行抓包,并没有发现任何数据,猜测为前端JavaScript验证的。
绕过方法:直接在浏览器禁用JavaScript代码
右键查看地址访问
第二关:Content-Type的验证
通过源代码可发现是验证上传文件的type值,那么直接修改成允许的值即可。
黑名单的绕过
前言:黑名单的意思就是,不允许上传的类型,比如禁止上传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
第五关:利用.空格.绕过
源代码:
$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。
直接访问是会显示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,即可成功绕过。
白名单的绕过
前言:白名单是指允许放行的意思,就是只允许上传指定后缀,和黑名单是刚好相反的操作。
第十二关:%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编码过就会变成一个空格的。
图片马配合文件包含绕过
第十四至十六关:图片马配合文件包含
制作图片马:找一张图片,和一段php的执行代码,phpinfo也可以一句话木马也可以。
copy 1.jpg/b+1.php shell.jpg
直接访问是解析不了,所以这个时候需要配合包含漏洞才可以解析里面的php代码
第十七关:二次渲染图片马配合文件包含
这一关上传的图片会进行二次渲染后,然后把php的代码去掉,所以正常的图片马是执行不了,需要使用特定的图片马才可以解析,如果有兴趣可以私信我要二次渲染图片也可以自己去网上找,这里就不上传了。
直接上传经过二次渲染后的图片马
直接包含即可解析
其他上传绕过
第十八关:竞争上传
前言:根据源代码来看,是允许你上传php的文件,但是你上传后会进行检测里面的内容,如果不符合的话,会对上传的文件进行删除。但是,如果我们在删除前去访问了上传的php的内容,并且这个php的内容里面可以生成出来一个新的php脚本,那么这个时候我们就可以直接访问生成出来的php代码。
代码解析:
a变量是一句话经过编码后的,然后会新建一个shell.php,然后经过解码写入shell.php。
关于去访问的话,直接用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];
综合上面来说,就是说,如果我添加多一个数组,那么只要最后一个元素是满足白名单的内容,至于第一个,你就可以人为进行控制了。
下面是操作的过程: