漏洞概述
很多web站点都有文件上传的接口(比如注册时上传头像等)由于没有对上传的文件类型进行严格限制,导致攻击者可以上传一些恶意文件(比如Webshell)。
文件上传的本质是为了让上传的文件可以任意代码执行,达到对目标的控制。(Getshell)
检测手段
1.客户端检测
2.服务器检测
3.黑白名单检测
客户端检测
常见手段:一般是在网页上写一段js脚本,用js检测,检测上传文件的后缀名,有白名单也有黑名单。
怎么判断是前端检测?
可以抓一个包来看,看一看点击上传之后,bp能否抓的到包,如果抓不到,并且弹出了不允许上传的提示,说明是进行了前端的检测。
前端验证的绕过只需要抓包传正常文件就可以进行绕过。
黑白名单机制
- 黑名单:不允许上传什么
- 白名单:只允许上传什么
- 白名单比黑名单更安全
服务端检测
几个常见的手段:
- 检查Content-Type(上传的是什么类型就会是什么类型)
- 检查后缀(检查后缀是主流)
- 检查文件头(绕过检查文件头的主要方法是藏东西在里面)
图片马的制作
windows命令:
copy qs.jpg/b+mua.asp asp_mua.jpg
qs.jpg 是图片的名字
mua.asp 是木马的名字
asp_mua.jpg 是图片马的名字
图片马的利用是有条件的:
图片马的执行一定要被中间件解析。
php3,.php4,.php5,.phtml 都是会被解析为php的
什么是中间件?
中间件:提供网站服务的,并且能够解析asp、php、jsp等后缀的文件。
Nginx、apacha、iis等都是中间件。
iis6.0漏洞:能够将cer、cdx、asa后缀的文件,统一当成asp进行解析。
.htaccess文件
.htaccess文件是apache服务器下的一个配置文件,其主要负责相关目录下的网页配置,即:在一个特定的文档目录中放置一个包含一个或多个指令的文件来对网页进行配置。
不过需要注意的是,.htaccess文件的作用域为其所在目录与其所有的子目录,不过若是子目录也存在.htaccess文件,则会覆盖父目录的.htaccess效果。
一个htaccess实例文件如下:
1 | <ifModule mime_module> |
Sethandler:
将该目录以及子目录的所有文件均解析为php文件类型。
Addhandler:
使用php5-script 处理器来解析所匹配到的文件。
addtype指令
将特定扩展名文件映射为php文件类型
.htaccess上传漏洞形成条件:
- apache服务器
- 能够上传.htaccess文件,一般为黑名单限制
- AllowOverRide all,默认配置为none
- LoadModule rewrite_module modules/mod_rewrite.so #模块为开启状态
- 上传目录具有可执行权限。
windows系统中一些文件上传漏洞的特性
::$DATA
在windows的时候如果文件名+”::$DATA”会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,它的目的就是不检查后缀名。
例如:phpinfo.php::$DATA
windows会自动去掉末尾的::$DATA变成phpinfo.php
文件后缀加空格或者加点
windows系统中在创建后缀加空格或者加点的文件都会自动取消。
提权
提权属于后渗透的部分,需要授权。
web容器(web中间件)权限
原因:我们上传的木马是被中间件解析的,所以中间件是什么权限,我们就是什么权限。
遇到连命令都无法执行的情况,我们可以上传一个cmd.exe(windwos系统)
针对windows+iis6.0的提权:
可以上传一个iis6.exe的提权软件。
关于用户的命令:
net user qiesi abc123 /add:添加用户 账户名:
net user qiesi /delete :删除用户
初次生成的账号是一个普通账号,普通账号没有远程登录服务器的权限。
将用户添加进管理员组:
net localgroup administrators qiesi /add:加入到管理员组
00截断
php文件上传流程:
- 上传到临时文件目录
- 拼接要移动到的目录
- 移动过去重命名(注意这个重命名过程,是我们注入得关键)
例子:
假如我们要移动1.php到目录/upload/
,服务器白名单不允许上传php,只准允许jpg等格式。我们可以更改我们的上传路径为/upload/1.php%00/....
我们的文件名在移动过去重命名的阶段时,因为编译器读到了%00,会认为程序终止,最终构造到/upload/1.php
就停止了所以就可以上传造成文件上传漏洞。
%00是URL编码后的东西。(URL编码其实是就是为了表示16进制。)
Get传参会有URL解码,post传参正常不会有URL解码。
所有在post传参得时候,我们可以通过修改post数据包中得二进制来做00截断修改。
gif图片攻击二次渲染
二次渲染是指服务器会对上传的图片作出一些十六进制的改动。
面对二次渲染我们是通过gif图片(gif在经过二次渲染的时候,不会有太大的改变。),往里面加一句话木马来进行。
条件竞争绕过
条件竞争是为了对付服务器先上传文件,然后检测,删除的情况。
什么是条件竞争
条件竞争发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
一般而言我们是上传了文件,上传了但是最后却因为函数过滤或者其他原因被删除了,那么我们可以使用条件竞争,我们实际上是和unlink,是和删除文件的函数进行竞争。
假如我不断的上传发包,然后我同时也不断的访问那个我们上传上去的文件的地址,我们就开始和服务器的函数比手速了,函数执行都是要时间的,如果我这边上传上去,且没有删除,那个时间可能很短,然后被我访问到了,岂不是就可以执行PHP了我就比服务器手速快了
你可以上传一个php然后访问后,由这个php去写一个马
‘;file_put_contents(‘1.php’,$a)?>
文件解析漏洞
解析漏洞正如其名,一般大家常说的是,文件在某种格式下,会被执行为该脚本语言的文件。
ISS他是个中间件/容器可以搭建各种语言。容器的作用是检测扩展名,然后交给了可执行文件处理。
IIS6.0畸形解析漏洞(只影响IIS6.0这个版本)
asa cdx cer 都会被当作asp解析。【默认设置】
ISS6.0在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。这一漏洞有两种完全不同的利用方式:
test.asp;.jpg 它当作asp进行解析。
test.asp/123.jpg 他当做asp进行解析。
文件夹名字如果是x.asp那么这个文件夹下任意文件都当作asp执行。
CGI解析漏洞
适用范围:PHP
中间件任意:Iis7.5,Nginx,lighttpd等web容器中也经常会出现这样的解析漏洞。
在默认Fast-CGI开启状况下,上传一个名字为1.jpg,访问时候1.jpg/.php会以php来解析。
IIS和Nginx在这一点上是一样的,一看到URL中文件后缀是.php,便无论该文件是否存在,都直接交给php处理,而php又默认开启“cgi.fix_pathinfo”,会对文件路径进行“修理”,何谓“修理”?举个例子,当php遇到文件路径“/aaa.xxx/bbb.yyy/ccc.zzz”时,若“/aaa.xxx/bbb.yyy/ccc.zzz”不存在,则会去掉最后的“/ccc.zzz”,然后判断“/aaa.xxx/bbb.yyy”是否存在,若存在,则把“/aaa.xxx/bbb.yyy”当做文件“/aaa.xxx/bbb.yyy/ccc.zzz”,若“/aaa.xxx/bbb.yyy”仍不存在,则继续去掉“/bbb.yyy”,以此类推。
若有文件test.jpg,访问时在其后加/.php,便可以让IIS把“test.jpg/.php”交给php,php“修理”文件路径“test.jpg/.php”得到“test.jpg”。
nginx<8.03空字节代码执行漏洞
Xxx.jpg%00.php该文件会被当做脚本文件php执行。这个漏洞是CGI漏洞的一个关联。
Apache解析漏洞
Apache是从右到左开始判断解析,如果为不可识别解析,就在往左边读。
例如v01cano.php.zzz,后缀名zzz是apache做不能识别的文件后缀名,则继续向左读取,直到读取到了php,apache能够识别,则该文件就被解析成为了php类型的文件。