upload-labs闯关
upload-labs闯关
1关
- 原理:客户端(前端js验证文件是否正确)验证,可以直接抓包,重放绕过。
2关
- 原理
mime:多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型(规定了扩展名)
-
可以用第一关的方式绕过
-
原理:其content-type(mime)是由客户端根据你上传的文件生成的,但限制只能是jpg/image格式,所以抓包改就好了
也可以抓一个正确的包,修改器白名单限制类型
改mime为image/jpeg
3关
黑名单过滤,禁止上传.asp|.aspx|.php|.jsp后缀文件。更改后缀解析
例:AddType application/x-httpd-php .php .php3 .phtml
apche服务配置以上语句 将.php .php3 .phtml都以php格式解析,所以思路就是修改可以解析的后缀。
需要自己修改apche配置文件httpd.conf,构造漏洞环境)
AddType application/x-httpd-php .php .php3 .phtml
但是我是phpstudy新版,无法解析文件环境问题
4关
查看源码,发现过滤了几乎所有的后缀名,还是黑名单。
htaccess文件:是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
原理:他没有过滤 .htaccess后缀,我们可以构建一个htaccess配置文件,让所有格式文件都解析为php,然后再上传图片马(只要后缀是允许的,随便都可以)就会被解析了。
.htaccess语句:
SetHandler application/x-httpd-php
-
上传.htaccess文件
-
上传图片马(千万不要用phpstudy的新版本,解析不了,只能用老版本,我在新版本哪里浪费了很多时间)
5关
还是先看源码,发现还是黑名单过滤,这次包括了.htaccess后缀,但是第四关源码全部转化为了小写,第五关没有过滤大小写。所以可以通过大小写绕过。
1-直接将木马后缀改为1.Php就好了
6关
首先查看源代码,发现也是黑名单过滤。只是没有收尾去空。所以可以更改后缀,在末尾加入空格。windows后缀会删除末尾的.和空格。所以bp抓包,将文件改为1.php .(空格加点),传进去后会删除空格和.保留1.php文件名。(因为bp不能末尾加空格无用,所以换成空格加.)
1-后缀改为1.php .
7关
黑名单,没有对后缀名进行去"."处理,在bp中改为1.php. ,传成功后就会自动删除“.”
8关
查看源代码,黑名单过滤,没有对后缀名进行去”::$DATA”处理,利用windows特性,可在后缀名中加” ::$DATA”绕过:
NTFS文件系统包括对备用数据流的支持。这不是众所周知的功能,主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA。
1-bp中文件后缀改为:1.php::$DATA
9关
查看文件源代码,还是黑名单过滤,先删除文件名末尾的点,再进行首尾去空。都只进行一次。故可以构造点空格点进行绕过。
1-后缀名为:1.php. .
10关
原理:利用str_ireplace对黑名单里的文件后缀名进行了替换,换成空字符,使用了str_ireplace函数,即不区分大小写,故大小写绕过不适用。但是这里替换是替换成了空字符。
顺序双写,我们就可以构建.pphphp后缀。从左至右识别到php替换后,还剩下一个php。(不能.phpphp这样全部都能识别替换)
11关
查看源代码,发现使用了白名单,只允许jpg,png,gif三种格式文件。
if(isset($_POST['submit'])){
$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)){
$is_upload = true;
} else {
$msg = '上传出错!';
}
}
理解原理:$_GET['save_path']函数是文件最终存储路径。代码里面拼接了一些随机字符,我们可以上传1.jpg,而在 save_path这个最终保存路径函数下面保存为1.php并加上%00来隔断后面的随机字符,这样实际存储到服务器上面路径上就是1.php的后缀了。
这里利用的是00截断。即move_uploaded_file函数的底层实现类似于C语言,遇到0x00会截断
截断条件:
1、php版本小于5.3.4
2、php.ini的magic_quotes_gpc为OFF状态
-
将1.php改为1.jpg后缀(白名单限制),抓包?save_path=../upload/1.php%00
-
加入截断%00
-
返回url时间戳,复制地址,粘贴测试,../upload/1.php /3120200428231832.jpg
12关
原理:和11关一样,但11关是$_GET['save_path'],12关是$_POST['save_path']。请求方式不同。还是用截断的方法绕过,我试了一下%00发现不成功。
原理:通过get方式在url中添加%00,通过get方式传递到服务器会被自动解码,所以ASCII码数值0对应的(null)字符,达到截断的目的。
遇到ascii码为零的位置就停止,而这个ascii码为零的位置在16进制中是00
通过post,加入%00不会被服务器解码,只会原样被参数变量接受。所以这里要修改post数据的16进制来达到截断的目的。(0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。)就是说系统是按16进制读取文件(或者说二进制)。
1-可以通过bp直接url手动解码
../upload/1.php%00,选择%00右击选择convert selection(转换)-> url->url decode(url解码)
2-也可以在hex里面修改1.php后面的一个字符的16进制改为00,来对应asscall码的0字符达到截断的作用。
具体参照:https://www.zhaosimeng.cn/writeup/68.html
17关
原理:时间差,竞争关系。
上传木马文件会在缓存中停留几毫秒然后才被删除掉,可以利用这个时间差执行操作。
1-首先抓取上传木马的数据包
木马构造语句,在解析执行时,创建一个新的shell2.php木马文件,内容为一句话木马。只要访问成功就可以在这个时间差内,写入一个新文件,即使这个文件之后被删除也没有关系。
’);?>2-抓取访问包
通过不停的访问,来在这个时间差内抓取到还未删除的木马文件,使其解析执行。
3-在爆破模块,先执行访问包,在执行木马包。这样能更大概率的能成功执行木马文件。pload配置如下
每个包都不断发送2000次,这样总会抓住时间差,解析木马成功。