文件上传漏洞原理
一句话木马
<?php@eval($_POST['wuya']);?>
POST用来接收前端的post的请求里面的一个变量值
eval作用把一串字符串作为php的代码去执行,允许执行任意代码
@符号的意思是不报错,即使执行错误,也不报错。
system函数,用来执行操作系统命令
wuya为密码
文件上传漏洞是指用户上传了一个可执行的脚本文件,而且通过这个脚本文件获得了执行服务器端命令的能力。
文件上传前提:
(1)网站上传功能能正常使用 (2)文件类型允许上传 (3)上传路径可以确定 (4)文件可以被访问,可以被执行或者被包含
黑客会上传什么?
后门文件简介
WebShell:网站后门
WebShell就是以asp,php,jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其成为一种网页后门。黑客在入侵了一个网站后,通常会将asp或者php后门文件与网站服务器WEB目录下正常的网页文件混在一起,以达到控制网站服务亲的目的。
了解后门文件WebShell
WebShell分为大马,小马,一句话木马。
大马:体积小,功能全,会调用系统的关键函数,以代码加密进行隐藏
小马:体积小,功能少,只有一个上传功能
一句话木马:代码短,只有一行代码,使用场景大,可单独生成可插入文件,安全性高,隐匿性强,可变形免杀,框架不便,数据执行
了解后门文件 PHP一句话木马
<?php eval($_GET['pass'];?>
防御
uniqid 更改文件名
文件上传绕过
(1)本地限制
(2)突破上传:修改MIME类型检测;修改目录路径检测;修改文件扩展名检测;修改文件内容检测;
(3)服务端防御:服务MIME类型检测;服务端目录路径检测;服务端文件扩展名检测;服务端文件内容检测;
绕过客户端的检测:
原理:通常在上传页面里含有专门检测文件上传的JavaScript代码,最常见的就是检测文件类型和扩展名是否合法
方法:在本地浏览器客户端禁用JS即可
测试题:upload-labs/Pass-01
绕过服务端检测:
服务端的代码通常检测三个点:MIME类型,文件后缀(分为黑名单和白名单),文件内容(文件幻数,文件相关信息,图片渲染,二次渲染)
常见MIME类型:
超文本标记语言。html文件:text/html
普通文本.txt文件:text/plain
PDF文档.pdf:application/pdf
Microsoft.word文档:application/msword
PNG图像.png:image/png
GIF图像.gif:image/gif
MPEG文件.mpg:video/mpeg
AVI文件.avi:video/x-msvideo
绕过文件后缀检查-黑名单
文件扩展名在黑名单中为不合法,一般有个专门的黑名单列表,里面会包含常见的危险脚本文件。
1.后缀大小写绕过:(.Php)
2.空格绕过:(.php )
3.点绕过:(.php.)
4.::$DATA绕过:
如果黑名单没有对后缀名进行去::$DATA处理,可以在后缀名加上::$DATA,绕过黑名单
5.配合Apache漏洞(现在基本没有了)
Apache解析有一个特点,解析文件时是从右往左判断,如果为不可识别解析再往左判断,例如aa.php.owf.rar文件,Apache不可以识别解析‘.owf’和‘.rar’这两种后缀,会解析成.php文件
6. .htaccess文件
配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测(可以自己规定文件解析成什么样子)
.htaccess文件(或者 分布式配置文件),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法,即,在一个特定的文档目录中一个包含一个会多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。
SetHandler application/x-httpd-php //所有的文件当做php文件来解析
AddType application/x-httpd-php .png //.png文件当作php文件解析
7.通过上传特殊文件名来绕过黑名单检测。
如php,php2,php3,php5,phtml,asp,aspx,ascx,ashx,cer,jsp,jspx这些特殊文件名能否被解析,关键查看apache的conf/httpd.conf文件,如果包含AddType application/x-httpd-php.php.phtml.phps.php5.pht等,则这些特殊文件可以被解析。
绕过文件后缀检测-白名单(基本无解,目前最安全)
白名单策略:文件扩展名不在白名单中为不合法
绕过方法:
服务端判断文件类型是从后往前解析,而对文件解析是从前往后解析,可以利用00截断的方式进行绕过,包括%00截断与0x00截断。(00截断的一个条件是PHP必须小于5.3)
绕过文件内容检测:
主要通过两种方法来判断上传文件内容是否合法:
1.通过检测上传文件内容开始处的文件幻数来判断。
通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型
2.文件加载检测
一般是调用API或者函数对文件进行加载测试。常见的是图像渲染测试,在严格点的是进行二次渲染。
绕过文件内容检测-文件幻数检测
常见图片类型的文件幻数如下:
1.要绕过jpg文件幻数检测就要在其文件十六进制开头写上下面的值:
Value=FF D8 FF E0 00 10 4A 46 49 46
2.要绕过gif文件幻数检测就要在其文件十六进制开头写上下面的值:
Value=47 49 46 38 39 61
3.要绕过png文件幻数检测就要在开头写下下面的值:
Value=89 50 4E 47
然后在文件幻数后面加上自己的一句话木马代码就行了
绕过文件内容检测-文件加载检测
一般是调用API或者函数对文件进行加载测试。常见的是图像渲染测试,在严格点的是进行二次渲染。
对渲染/加载测试的攻击方式是:代码注入绕过
对二次渲染的攻击方式是:攻击文件加载器自身
1.对渲染/加载测试攻击 - 代码注入绕过
可以用图像处理软件对一张图片进行代码注入
这类攻击的原理是:在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般是图片的注释区,这样能保证本身文件结构是完整的,对于渲染测试基本上都能绕过。
2.二次渲染的攻击方式 - 攻击文件加载器自身
这种情况下无法用代码注入绕过,二次渲染相当于把原本属于图片数据的部分抓出来,再用自己的API或者函数进行重新渲染,而非图像数据部分直接被隔离开了。
我们可以用溢出攻击对文件加载器进行攻击,上传自己的恶意文件后,服务器上的文件加载器会主动进行加载测试,加载测试时被溢出攻击执行shellcode。
(另外方法:1.用一张大的gif图片找到一个空白的地方写shell然后绕过;2.复制下面这段
#define test_width 16
#define test_height 7
<?php echo 'it worke';?>
static char test_bite[ ]={
0x13, 0x00, 0x93, 0xcd, 0x55, 0xa5, 0x93, 0xc5, 0x00, 0x80, 0x00, 0x60};)