网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
一.原理:
文件上传漏洞是指攻击者利用网页等应用的上传功能上传恶意的可执行脚本文件,而系统未对其进行检测或存在检测漏洞,使攻击者将文件上传成功,从而实现控制目标网站实现攻击目的。
漏洞点:一切文件上传的地方都有可能。
挖掘方法:知道源码—>白盒测试;不知道源码—>黑盒测试。
漏洞分类:WEB前端验证,常规漏洞、中间件漏洞、编辑器漏洞。
二.防护与绕过技巧:
2.1前端验证
前端验证就是网页只在前端JS界面做了过滤限制,但是其过滤限制用户可控
例1:
如下upload第一关,上传一个带有后门的php文件,提示只能上传JPG,PNG,GIF格式,查看源代码之后发现是前端页面对上传类型做了检测限制。
此时可以在网页浏览器禁用JS,然后上传成功。
2.2 白名单
顾名思义,白名单就是服务端明确规定上传格式,比如JPG,GIF,PNG等格式,除此之外其他类型无法上传。
绕过
MIME绕过:
通过检查http中包含的Content-Type字段中的值来判断上传文件是否合法,因此可以将此字段改成允许上传的。
例2:
来到第二关,还是限制只能上传GIF,JPG,PNG格式,但是在禁用JS上传已经不管用了,因为对方用了MIME验证。
打开burp抓包,找到Content-Type字段,可以发现其与代码中允许的字段不一致,所以将Content-Type字段改成代码中允许的字段类型提交即可。
%00空字符截断:
在文件上传后验证文件扩展名往本地保存的时候,%00就会形成一个null字符,截断文件名,只保存%00之前的内容。
注:只用于php5.3以下版本,并且要在php扩展设置>>参数开关设置中把magic_quotes_gpc关闭。
例3:
修改路径值,添加%00,然后提交。
2.3黑名单
与白名单相反,通过限制某些文件格式,使其无法上传之服务端。
绕过
.HTACCESS绕过:
只存在于APACHE中
主要功能:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
简而言之,在httpd.conf文件中有对文件上传的过滤规则,我们通过给目目录下上传一个重新定义解析规则的.htaccess文件,此时生效的过滤规则就会替换原来http.conf中的规则。
例4:
1.上传一个.htaccess文件
文件内容为:将xxx.jpg文件解析为PHP
<FilesMatch "xxx.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
2.然后创建xxx.jpg文件插入一句话木马,然后访问图片链接。
::$DATA绕过:
在 Windows 操作系统中,:: D A T A 是一种用于隐藏文件的特殊附加数据流,如果文件名 + : : DATA 是一种用于隐藏文件的特殊附加数据流,如果文件名+:: DATA是一种用于隐藏文件的特殊附加数据流,如果文件名+::DATA会把:: D A T A 之后的数据当成文件流处理 , 不会检测后缀名,且保持 : : DATA之后的数据当成文件流处理,不会检测后缀名,且保持:: DATA之后的数据当成文件流处理,不会检测后缀名,且保持::DATA之前的文件名,他的目的就是不检查后缀名。
2.4内容检测
文件头完整性检测:
文件头是文件开头的一段二进制代码,不同的文件其文件头类型也不同,可以用NotPad++查看。
- GIF:47494638
- JPG:FFD8FF
- PNG:89504E47
在安全测试中不但可以对文件后缀格式进行检测,还可以对文件头部完整性检测,防止恶意文件上传。
例5:
由源码可知,此关卡对文件头部做了检测;并且题目已经提示使用文件包含漏洞。
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 = "上传出错!";
}
}
}
首先创建两个文件,一个是正常的xxx.png文件
一、网安学习成长路线图
网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、网安视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
三、精品网安学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、网络安全源码合集+工具包
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、网络安全面试题
最后就是大家最关心的网络安全面试题板块
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!