一般防止上传漏洞手法

1、客户端检测:客户端使用JavaScript检测,在文件未上传时,就对文件进行验证

//任何客户端的验证都是不安全的,客户端验证目的是防止用户输入错误、减少

//服务器开销,而服务端验证才可以真正防御攻击者。

2、服务器端检测:服务端脚本一般会检测文件的MIME类型,检测文件扩展名是否合法

客户端检测

客户端验证代码形如下:

图片上传

function checkFile(){

var flag = false;

var str = document.getElementById("file").value;

str = str.substring(str.lastIndexOf('.') + 1);

var arr = new Array('png','bmp','gif','jpg');

for (var i=0;i

if(str==arr[i]){

flag = true;

}

}

if(!flag){

alert('文件不合法!');

}

return flag;

}

接收文件的脚本upload.php代码如下:

if(isset($_POST["submit"])){

$name = $_FILES['file']['name'];

$name = md5(date('Y-m-d h:m:s')).strrchr($name,".");

$size = $_FILES['file']['size'];

$tmp = $_FILES['file']['tem_name'];

move_uploaded_file($tmp,$name);

echo "文件上传成功!path:".$name;

}

?>

绕过:

1、可以用firebug将form表单中的onsubmit事件删除,这样就可以绕过验证。

2、使用Burp Suite:

1)先将木马文件的扩展名改为一张正常图片的扩展名,如jpg

2)上传时使用Burp Suite拦截数据包,将木马文件扩展名改为php就可绕过客户端验证。

注意:这里修改文件名字后,请求头中的Content-Length的值也要改

服务端检测

服务端分为6项:

* 黑名单与白名单验证

* MIME验证

* 目录验证

* 截断上传攻击

* .htaccess文件攻击

* 检测文件内容

黑名单与白名单验证

黑名单过滤方式

$Blacklist = array('asp','php','jsp','php5','asa','aspx'); //黑名单

if (isset($_POST["submit"])){

$name = $FILES['file']['name']; //接收文件名

$extension = substr(strrchr($name, ".") , 1); //得到扩展名

$boo = false;

foreach ($Blaklist as $key => $value){

if ($value==$extension) { //迭代判断是否命中

$boo = true;

break; //命中后直接退出循环

}

}

if (!$boo) { //若没有被命中,则进行上传操作

$size = $_FILES['file']['size']; //接收文件大小

$tmp = $FILES['file']['temp_name']; //临时路径

move_uploaded_file($tmp, $name); //移动临时文件到当前文件目录

} else {

echo "文件不合法!!";

}

}

?>

对于上面的过滤可以通过如下方法绕过:

从黑名单中找到web开发者忽略的扩展名,如:cer

没有对扩展名进行大小写转换,在window平台依然可以大小写绕过

在window下,若文件名以"."或者空格作为结尾,系统会自动去除"."与空格,

所以可以上传以“asp.”和“asp_”为扩展名的文件

0x00截断绕过

解析漏洞

* 白名单过滤方式

> ```php

$WhiteList = array('rar','jpg','png','bmp','gif','jpg','doc');

if(isset($_POST["submit"])){

$name = $_FILES['file']['name'];

$extension = substr(strrchr($name,"."),1);

$boo = false;

foreach($WhiteList as $key => $value){

if($value==$extension){

$boo = true;

}

}

if($boo){

$size = $_FILES['file']['size'];

$tmp = $_FILES['file']['tmp_name'];

move_uploaded_file($tmp,$name);

echo "文件上传成功!
path:".$name;

}else{

echo "文件不合法!";

}

}

?>

绕过方法:

* 0x00截断绕过

* 此时若在iis6.0,则可以将木马名改为test.asp;1.jpg来上传,从而通过验证

* 配合解析漏洞

MIME验证

对文件MIME类型做验证的PHP代码如下:

if($_FILES['file']['type']==" image/jpeg"){

$imageTempName = $_FILES['file']['tmp_name'];

$imageName = $_FILES['file']['name'];

$last = substr($imageName,strrpos($imageName,"."));

if(!is_dir("uploadFile")){

mkdir("uploadFile");

}

$imageName = md5($imageName).$last;

move_upload_file($imageTempName,"./uploadFile/".$imageName);

echo("文件上传成功! path = /uploadFile/$imageName");

}else{

echo("文件上传类型错误,请重新上传...");

exit();

}

?>

未修改MIME类型,上传失败:

upload_vuln_not_alter_mime.png

修改MIME类型,上传成功:

upload_vuln_alter_mime.png

目录验证

文件上传时通常允许用户将文件放到指定的目录中,若目录存在则将文件写入目录,否则新建目录然后写入,若为iis6.0则可以利用这个漏洞,客户端上传代码如下:

up

服务端PHP接收文件的代码如下:

if($_FILES['file']['type']=="image/jpeg"){

$imageTempName=$_FILES['file']['tmp_name'];

$imageName=$_FILES['file']['name'];

$last=substr($imageName,strrpos($imageName,"."));

if($last!=".jpg"){

echo("mime error!
");

}

$Extension=$_POST['Extension'];

if(!is_dir($Extension)){

mkdir("./$Extension");

echo "mkidr $Extension succesfully"."
";

}

$imageName=md5($imageName).$last;

move_uploaded_file($imageTempName,"./$Extension/".$imageName);

echo("upload ok! path = /$Extension/$imageName");

} else {

echo("type error...");

exit();

}

?>

查看上传到了那个文件:

upload_vuln_check_asp_dirname.png

将文件改名:

upload_vuln_alter_upload_dirname.png

upload_vuln_check_asp_dirname.png

截断上传攻击

截断上传攻击在ASP程序中比较常见(在PHP、JSP中也有)

先上传正常后缀的图片马:

upload_vuln_upload_normal_picture.png

更改图片名字:

upload_vuln_alter_picture_name.png

截断:

upload_vuln_truncate_picture_name.png

上传成功:

upload_vuln_upload_success.png

.htaccess文件攻击

通过.htaccess文件调用php解析器去解析一个文件名中只要包含"haha"这个字符串的任意文件,无论扩展名是什么(没有也行),都以php的方式来解析,.haccess文件代码如下:

SetHandler application/x-httpd-php

或者如下,上传一个文件名为evil.gif的图片马:

SetHandler application/x-httpd-php

检测文件内容

文件幻数检测

在文件首部加上如下幻数,后面跟一句话木马即可

JFIF FF D8 FF E0 00 10 4A 46 49 46

GIF89a 47 49 46 38 39 61

PNG 89 50 4E 47

文件相关信息检测

通常用的getimagesize()函数,只需要在幻数基础上加一些文件信息就行了,如下:

GIF89a

(...some binary data for image...)

(... skipping the rest of binary data ...)

文件加载检测

服务端会调用API或函数对文件进行加载测试,常见的是图像渲染测试,变态的甚至是二次渲染:

对渲染/加载测试的攻击方式是代码注入绕过

对二次渲染的攻击方式是攻击文件加载器本身

补充

除了上述的.htaccess文件攻击,还可以用.user.ini进行文件攻击

当中间键是以fastcgi运行的php都可以用这个方法,.user.ini能被动态加载,它也有两个配置项:

auto_append_file和auto_prepend_file,只要在.user.ini中添加auto_prepend_file=aa.jpg

这句话,就可以让其他php文件执行前自动包含aa.jpg,和require()类似。

upload_vuln_file_attack1.png

upload_vuln_file_attack2.png

is_file php 绕过,文件上传之绕过相关推荐

  1. php 上传绕过,文件上传验证绕过技术总结

    1.客户端验证绕过 很简单啦,直接使用webscarab或者burp修改一下后缀名就行. 2.服务端验证绕过-Content-type检测 若服务端检测文件类型时是检测Content-type的值,也 ...

  2. php上传禁止php_文件上传限制绕过技巧

    原标题:文件上传限制绕过技巧 严正声明:本文仅限于技术讨论,严禁用于其他用途. 简介 文件上传漏洞是web安全中经常利用到的一种漏洞形式.一些web应用程序中允许上传图片,文本或者其他资源到指定的位置 ...

  3. 【文件上传漏洞绕过方式】

    目录 前言 正文 总结 前言 目前,文件上传往往在业务中不可避免,也是极其容易出现上传漏洞.根据owasptop10中的排名,文件上传漏洞(属于攻击检测和防范不足)高居其中.今天和大家分享常见的文件上 ...

  4. php文件上传绕过mime类型,文件上传限制绕过技巧

    严正声明:本文仅限于技术讨论,严禁用于其他用途. 简介 文件上传漏洞是web安全中经常利用到的一种漏洞形式.一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以 ...

  5. html 上传文件_【实战篇】记一次文件上传漏洞绕过

    点击上方"公众号" 可以订阅哦! Hello,各位小伙伴大家好~ 最近有点高产似母猪~ 那今天就少写点,简单记录一个文件上传漏洞的绕过吧~(机智如我..) 之前也介绍过一期文件上传 ...

  6. 文件上传常见绕过分析

    文件上传:文件上传校验 1.客户端校验(javascript校验) 2.服务器端校验(Content-Type检验) 3.服务端校验(黑名单) 4.服务端校验:%00截断(0x00),也就是空字符 5 ...

  7. 任意文件上传之绕过云waf+本地防火墙双重防护

    0x01 waf拦截 在打某市 Hvv 第一天就找到一个文件上传的点,经过测试,可以直接任意文件上传,没有什么道理. 直接尝试上传 Php 文件,被 waf 拦截了 不知道这是哪家的waf,知道的师傅 ...

  8. php黑名单绕过,文件上传漏洞之黑名单检测绕过

    0x00 前言 文件上传是一个很常见的功能,文件上传漏洞也比较普遍,原理简单,造成的危害却很大,是一个入门级别的漏洞.这篇文章主要针对文件上传漏洞中的 黑名单检测绕过 这个点,结合upload-lab ...

  9. 文件上传漏洞绕过手法

    目录 1.文件上传原理 2.文件上传检测方法 3.后端检测绕过 3.1类型检测绕过 3.2文件头检测绕过 3.3 文件内容检测绕过 3.4黑名单检测绕过 3.4.1 对于.htaccess后缀名没有过 ...

最新文章

  1. Apache关掉Etag和Last-Modified的方法
  2. Excel常用英文字母快捷键:
  3. excel常用公式整理
  4. 技术与管理并重才能走的更远
  5. 通过MapReduce统计每个单子在每个文件中出现的次数(FileSplit的使用),单词作为key,所在文本和次数作为value进行统计
  6. 小学奥数 7827 质数的和与积 python
  7. Python实现web动态服务器
  8. C#图片处理之:亮度和对比度的校正
  9. 列举ASP.NET 页面之间传递值的几种方式
  10. MySQL 时间戳(TimeStamp)自动更新
  11. C语言库函数源码在线,C语言库函数(包括所有函数)
  12. Eclipse离线安装包下载地址
  13. pdf转word转换器绿色版
  14. 供应链金融业务信息化平台搭建要点分享
  15. html 导航栏颜色代码,CSS实现五颜六色按钮组成的导航条效果代码
  16. 数据分析课设(SPSS,EVIEWS,R)【理论】
  17. 点到直线的距离公式和平行线的距离公式
  18. 技术宅学会几招FFmpeg
  19. printk在应用层的设置方式及读取内核打印信息的方法
  20. 如何更改IP地址使用代理ip软件

热门文章

  1. python中print函数的输出问题(空格,制表符)
  2. OpenGL基本图元的绘制
  3. PowerDesigner导出表结构到word(RTF格式)
  4. Mysql8.0.17压缩包安装——超详细简单教程
  5. xml文件解析(使用解析器)
  6. 你在日常的测试工作中遇到过哪些困境呢?
  7. 视频处理之浮雕效果【附源码】
  8. C语言常见英文词汇表
  9. Swift iOS macOS 如何 Localize StoryBoard,StoryBoard 本地化,添加多语言支持,基于 String
  10. 2019年,把时间分给靠谱的人和事!(三月复盘)