文件上传攻击
原理
文件上传攻击指攻击者利用web引用对上传文件过滤不严的漏洞,将木马等文件上传到web服务器,以获取webshell
例如,一个PHP服务器,我们想要获取webshell最简单的方式就是将一个PHP木马上传到其上,并要求木马在服务器中以后缀为.PHP保存,之后攻击者就可以访问这个木马文件
上图为文件上传的整个过程和可能存在攻防的地方
上传主要分为三大步骤:
客户端上传功能:用户提交上传表单,利用HTML格式,实现上传格式的编制,再封装到HTTP包中,开始传输
中间件:
接收客户端提交的HTML表单————将表单内容存储为临时文件————根据安全规范,将临时文件保存为正式文件
服务器:存储和调用
一段中规中矩的客户端文件上传功能的代码
<form id="upload-form" action="upload.php" method="post" enctype="multipart/form-data" >
<input type="file" id="upload" name="upload" /> <br />
<input type="submit" value="Upload" />
</form>
服务器端功能代码
<?PHP
if(is_upload_file($_FILES["file"]["tmp_name"]))
{
$upfile=$_FILES["file"];
$name=$upfile["name"];
$type=$upfile["type"];
$size=$upfile["size"];
$tmp_name=$upfile["tmp_name"];
$destination="../file/".$name;
move_uploaded_file($tmp_name,$destination);
}
elese
{
echo "上传失败";
}
?>
想要进行文件上传攻击需要满足几个条件:
- 目标网站具有上传功能
- 上传文件能够被web服务器解析执行
- 知道文件上传后的存放路径和文件名称
- 目标文件可被访问
绕过技术
使用JS脚本进行防护的:
- 直接在控制台删除、修改相关代码
- 浏览器禁用JS
Apache文件后缀绕过攻击:
Apache的解析顺序是从右往左开始解析文件后缀的,例如1.php.xxsxxx,xxsxxx他不认识,就会继续往左读取php
能够替代使用的后缀名:
.php .php3 .php4 .php5 .pht .phtml -> php文件来执行
.asp .aspx .cer -> asp
IIS、Nginx解析漏洞
IIS6.0中,对于目录名中包含.asp字符串的,那么这个目录下所有文件都会按照asp格式解析,如xxx.asp/ccc.jpg,ccc就会给当成asp文件;;;另外,只要文件名中含有.asp;那么这个文件就会被当做asp文件,如xx.asp;.jpg
IIS7.0/IIS7.5/Nginx0.5.*/Nginx0.6.*/Nginx0.7-0.7.65/Nginx0.8-0.8.37中,(IIS:当Fast-CGI开启,)只要任意文件名的URL后面追加字符串/任意文件.php,那么这个文件就会被当成php来解析,可以利用这个来执行代码在当前服务器生成一个木马
另外低版本Nginx可以通过添加%00.php来进行解析攻击
文件类型绕过攻击:
当用户端上传文件的时候,进行抓包,可以看到HTTP包里面有一个Content-Type这个数据段,这个用于定义网络文件的类型和编码,决定浏览器将以什么形式来读取这个文件。
如果服务器端的代码是通过这个来判断文件类型的(使用$_Files"file"),那么可以通过篡改这个值来达成绕过效果
格式:
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
常用格式:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
另外PHP有一种类似的手法,如果网站使用getimeagesize()来获取图片的长宽高信息,但是非图片没有这些信息,也即如果获取不到想要的信息就会认定他不是图片,不允许上传。我们可以把一个图片的消息和一个webshell合并为一个文件,例如
cat 1.jpg 2.php > 3.php /linux
copy xxx.jpg /a + xxxxx.php /b mm.php
这样函数就能识别到信息然后放行,同时webshell的后缀php也能被解析成脚本文件
大小写混写:
例如将php写成Php,windows不区分大小写,但是linux严格区分,这点需要注意
00文件截断
PHP中%00表示结束符,会把00之后的所有字符都删除,当PHP版本小于5.3.4且magic_quotes_gpc为off状态,我们可以使用这种方式来绕过,例如1.php%00.jpg,在大多数情况下,我们会使用hex形式的%00(bp右键--convert selection--url--url-decode),但是需要注意,这种方法写的文件名在到达$_FILES"file"的时候,00后面的内容已经被截断了,所以过不了这里的检测,所以00截断只能过前面的,过不了后端的检测
但是如果我们在抓包的时候发现文件保存路径暴露了,那我们可以在此处进行截断,例如uploads/xxx.php%00,这里才是决定文件最终命名的地方
另外在php5.3.7之前,shell.php空格.jpg,这里的空格也会被当做终止符号
竞争条件攻击
如果一个网站的判断逻辑是先上传再检查,那么,可以利用这个时间差来进行上传漏洞攻击
<?PHP
fputs(fopen('../shell.php','w'),'<?PHP @eval($_POST[a])?>');
?>
@是忽略错误,eval()可以把字符串作为脚本来执行。
这个脚本的意思是,打开shell.php并把后面的那句马写进去
特殊文件名构造
构造shell.php.空格、shell.php.、shell.php_,windows并不能识别上述后缀机制,后自动去掉.和_,这样可以帮助绕过黑名单
图片木马:
针对对于文件内容的检测,一种是类似上面文件类型绕过类似的,另外,如果检测的是文件头,那么,我们可以修改文件头,先对前面20字节进行替换,后面再插入一句话木马,例如在内容前面添加GIF89a,可以被判定为gif类型
如果当服务器会对文件进行二次渲染,那么需要利用特性来构造木马
.htaccess文件解析攻击
apache独有,可以配置使得其他一些奇奇怪怪的东西也能被当做php来解析执行
<FileMatch "xx">
SetHandler application/x-httpd-php
</FileMatch>
做出这种修改后,xx便能够被当做php来执行
评论已关闭