upload-labs靶场1-21关一些思路
1、js绕过,后缀名绕过
查看源码分析,允许上传的文件类型为.jpg|.png|.gif,可以抓包修改后上传
修改后缀为php即可
放包然后可以看到页面成功上传
返回了地址,下面就可以利用工具进行连接了。
这里看到地址 …/upload/2.php 这里…/是上一目录的意思
所以地址是http://ip/upload-labs/upload/2.php 口令是sb
用蚁剑连接如图,测试连接数据返回成功
然后点击添加成功查看目录并且能访问所以有权限的文件了
记得及时删除文件
删除之后会里面连接失效,然后进行下一题吧
第一关还有一个解法是删除js验证,删除这个语句后即可直接上传php
上文这里打码部分就是自己的本地ip,cmd里输入ipconfig即可查看,下文均已替换,可能有几个,随机选就行,当然,得先开启你的phpstudy噢
2、Content-Type绕过
查看源码发现是对content-type做了限制,用第一关的第一种方法即可成功
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '文件类型不正确,请重新上传!';
}
} else {
$msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';
}
}
这里的限制就是Content-Type满足条件即可,抓包改后缀名即可,如下划线部分,满足条件,然后修改后缀名即可绕过。
3、黑名单检测(特殊16进制后缀绕过)
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
$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); //收尾去空
if(!in_array($file_ext, $deny_ext)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
}
}
查看源码发现基本上什么限制都搞上了,后缀名做了很高的限制,想到可以上传php3、php5、phtml等文件去绕过黑名单,但是apache的配置文件无法解析。
这里尝试上传.htaccess文件,内容为SetHandler application/x-httpd-php,是成功上传的,但是被重命名了,则无法利用
直接上传成功了,接下来直接上传图片马
用蚁剑连接
连接成功
4、黑名单检测 (.htaccess文件绕过)
同样的道理
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".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");
$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); //收尾去空
if (!in_array($file_ext, $deny_ext)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '此文件不允许上传!';
}
} else {
$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
}
}
源码的黑名单文件基本上包括了所有了,直接上传.htaccess文件进行绕过
然后上传图片马。和第三关一样
每关还是上传不同的马好一点,防止错误判断
然后蚁剑连接
5、重写特殊后缀绕过
仔细对比源码,发现第5关与第四关只有一行代码的区别
清空文件后思路同样上传.htaccess文件
已经做出了限制,那么思路并非如此,想到文件后缀
这道题将特殊字符例如空格,点,::$DATA以及.htaccess文件都给过滤了,均返回失败
试试重写特殊字符,成功绕过
点+空格+点,多加几个也可以,如下burp成功上传
网页上放包看看返回地址是什么
然后蚁剑连接
查看文件发现并没有文件后的那个点
因为Windows的特性,在创建文件的时候,末尾的点会被去掉。连接的时候加点或者不加点都可以连接成功。
6、大小写绕过、空格绕过
查看代码是加入了
$file_ext = strtolower($file_ext); //转换为小写
首先一想也是后缀问题,点空格直接绕过
蚁剑连接
阿哲
做到这里有眉头了,还是得分析分析源码,尽可能去思考其他所有的方法
果然第5关同比第5关少了大小写的限制,也可以成功上传
蚁剑连接
这样一来就有了更多思路,每一题的想法都有了更多
7、特殊后缀绕过
添加了首位去空的限制
$file_ext = trim($file_ext); //首尾去空
那好办,去空就去呗,我点+空格
蚁剑连接
8、重写后缀绕过
点空格点绕过成功
蚁剑连接
9、重写后缀绕过
点空格点再次成功
蚁剑连接
10、重写后缀绕过
点空格点
11、双写后缀绕过
上传后发现后缀名被去除
想到双写后缀
这样同样会被全部删除,再试试其他方法
此时后缀为.hp,仔细阅读源码后发现,连续的php会被删除,所有只要重写把其中一个php隔开,删除只后就只剩下php了、pphphp、这样都可以,pphpphphp这样都可以
如上可以成功
蚁剑连接成功
12 白名单 get型%00截断
源代码里有这一行代码,判断为白名单限制,只允许三种文件
$ext_arr = array('jpg','png','gif');
上传图片发现报错
解决方法:
1、在php.ini中设置date.timezone的值为PRC,设置好以后的为:date.timezone=PRC,同时取消这一行代码的注释,即去掉前面的分号就可以了。
2、在页头使用date_default_timezone_set()设置我的默认时区为北京时间,即<?phpdate_default_timezone_set("PRC");?>就可以了。
做到这发现php版本问题无法继续做了
关键的代码在于这里的’save_path’是一个可控的变量,但是后面还拼接上一个后缀名,也需要绕过$img_path = GET[′savepath′]."/".rand(10,99).date("YmdHis")."."._GET['save_path']."/".rand(10, 99).date("YmdHis").".".GET[′savepath′]."/".rand(10,99).date("YmdHis").".".file_ext;
这个时候可以使用%00截断,但这东西有点过气了,因为需要两个条件
所以如果要绕过,我们可以这样去实现,另save_path
等于../upload/11.php%00
PHP <= 5.3.4
13、白名单 POST型%00截断
同样版本问题就不继续做了
https://blog.csdn.net/Thunderclap_/article/details/108948611
14、图片马绕过
首先制作一个图片马,上传文件包含成功访问
制作命令:copy a.jpg /b + shell.php /a shell.jpg
/b 表示一个二进制文件
+ 表示将多个文件合并成一个文件
/a 表示一个ASCII文本文件
同一目录下创建好文件
生成图片马
hex查看
图片末尾会有一句话木马
然后上传我们制作好的图片马
从题中可知使用文件包含漏洞访问
返回的地址如上
根据这里文件包含漏洞,构造地址
成功连接
当然也可以只是?file=upload/1920210716141959.jpg
15、getimagesize()图片马绕过
多了一个gettimagesize()函数
同上一关一样只是判断图片类型的方式不同
上传图片马即可
16、exif_imagetype()图片马绕过
exif_imagetype ( string $filename ) 用来读取一个图像的第一个字节并检查其签名。
方法一致,上传一个图片马即可绕过
17、二次渲染绕过
$is_upload = false;
$msg = null;
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);
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 = "上传出错!";
}
}else if(($fileext == "png") && ($filetype=="image/png")){
if(move_uploaded_file($tmpname,$target_path)){
//使用上传的图片生成新的图片
$im = imagecreatefrompng($target_path);
if($im == false){
$msg = "该文件不是png格式的图片!";
@unlink($target_path);
}else{
//给新图片指定文件名
srand(time());
$newfilename = strval(rand()).".png";
//显示二次渲染后的图片(使用用户上传图片生成的新图片)
$img_path = UPLOAD_PATH.'/'.$newfilename;
imagepng($im,$img_path);
@unlink($target_path);
$is_upload = true;
}
} else {
$msg = "上传出错!";
}
}else if(($fileext == "gif") && ($filetype=="image/gif")){
if(move_uploaded_file($tmpname,$target_path)){
//使用上传的图片生成新的图片
$im = imagecreatefromgif($target_path);
if($im == false){
$msg = "该文件不是gif格式的图片!";
@unlink($target_path);
}else{
//给新图片指定文件名
srand(time());
$newfilename = strval(rand()).".gif";
//显示二次渲染后的图片(使用用户上传图片生成的新图片)
$img_path = UPLOAD_PATH.'/'.$newfilename;
imagegif($im,$img_path);
@unlink($target_path);
$is_upload = true;
}
} else {
$msg = "上传出错!";
}
}else{
$msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";
}
}
上传图片马后另存为新图片
对比源来的图片马之后发现原理的一句话木马已经失效了
修改之后再上传
emmmmm没做出来,可以看文章末大佬的博客
18、条件竞争绕过
19、条件竞争绕过
这关作者应该是想让我们,运用条件竞争+Apache解析漏洞来进行上传的,直接上传图片马也绕过了
20、%00绕过
%00截断需要php版本这里不再赘述
21、MIME、数组、%00绕过
也需要版本,更详细看参考博客,有详细的代码分析,我也会继续完善
https://blog.csdn.net/m0_46436640/article/details/107809772
至此此靶场告一段落了,慢慢完善知识吧