文件上传剖析
文件上传漏洞
漏洞成因
由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件。打个比方来说,如果你使用php作为服务器端的动态网站环境,那么你的上传功能出就一定不能让用户上传php类型的文件,否则黑客上传一个webshell,那么你的服务器上的文件就可以被任意修改了。
文件上传的危害
上传文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致恶意代码被执行
上传文件是flash的策略文件crossdomain.xml,黑客用以控制flash在该域下的行为(其他通过类似方式控制策略文件的情况类似)
上传的文件是病毒、木马文件、黑客用以诱骗用户或者管理员下载执行 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈
常见的绕过方式
前端js绕过
判断方法:在请求未到服务器之前,页面上有一个弹窗,上面显示你的文件类型不合格。
绕过方法:最简单的方法就是禁用浏览器的js功能以及中间人绕过攻击。
Type绕过
判断方法:上传文件时,提示该后缀无法上传,且burp可以抓到post包
绕过方法:上传一个php文件,并使用burp拦截,将请求中的Content-Type修改为允许上传的类型,这样就可以通过程序验证
黑名单绕过
绕过方法:大小写(Php),双写绕过(pphphp),“ .空格 ”(. php)
白名单绕过:
绕过方法:图片马绕过(结合解析漏洞)0x00截断绕过(.%00php)
常见的防御手段:
1、 文件上传的目录设置为不可执行,只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
2、判断文件类型,在判断文件类型时,可以结合使用MIME
Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3、使用随机数改写文件名和文件路径,文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4、单独设置文件服务器的域名,由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。
说到文件上传要讲中间件解析漏洞,因为服务器应用程序在解析某些精心构造的后缀文件时,会将其解析成网页脚本,从而导致网站的沦陷。大部分解析漏洞的产生都是由应用程序本身的漏洞导致的。
服务器解析漏洞
Apache解析漏洞:apache解析文件的规则是从右到左判断,如果后缀名不可识别,就再往左判断,如1.php.xxx就会被解析为1.php
IIS解析漏洞:iis6.0在解析asp是,任意包含.asp字符串,那么这个目录就会按asp解析。Iis7.0/7.5对php解析有类似Nginx的解析漏洞,只要对任意文件在url后面加上字符串/任意文件名.php就会按照php去解析。
php短标签
特点
利用短标签写法可以绕过一些对php字符的过滤
Windows环境中短标签默认是打开的,Linux下 默认是关闭的。
ctf秀web入门154,155都是这种情况
php四种常见风格标签写法
//第一种
<?php echo '1111';?>
<?echo '1111';?>
//比<?php ?>更灵活调用的方法
<? /*程序操作*/ ?>
//第二种
<?=/*函数*/?>
<?=$a?>
<?=(表达式)?>
就相当于
<?php echo $a?>
<?php echo (表达式)?>
//第三种
<% echo '1111'; %>
#这种写法在php配置中默认关闭了的,如果要正常输出,需要配置php.ini文件。在配置文件中找到asp_tags=off ,将off改为on。改动配置文件后需要重启apache。
//第四种
<script language=”php”> echo '1111';</script>
以上四种标签的区别:
第一种属于XML风格,当php代码需要嵌入XML文件中时需要使用这种形式的标签。第一种风格标签在配置文件中是不能被禁止的,其他的可以设置禁止或开启。
第二种当嵌入在XML文件中时它会干扰XML文档声明,所以要禁止使用。
第三种是asp.net的习惯写法
第四种是JS、VBscript等脚本程序员喜欢的风格。一般出租的服务器,后三种风格标签都是被禁止的,所以写成后三种形式的可能导致php无法动态输出。所以,建议最好使用第一种风格标签。
前提条件
<? echo '123';?> //前提是开启配置参数short_open_tags=on
<?=(表达式)?> //不需要开启参数设置
<% echo '123';%> //前提是开启配置参数asp_tags=on
<script language="php">echo '1'; </script> //不需要修改参数开关
建议使用
<?=(表达式)?>
<script language="php">echo '1'; </script>
php语言特性
中括号
php语言中[]可以使用{}来代替
<?=eval($_POST[x]);?>
<?=eval($_POST{x});?>
反引号
PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。
使用反引号运算符( `` )的效果与函数 shell_exec ( ) 相同。
- 反引号运算符在激活了安全模式或者关闭了 shell_exec () 时是无效的.
- 与其它某些语言不同,反引号不能在双引号字符串中使用。
<?=system('tac ../fl*')?>
<?=`cat ../flag*`>
中间件特性
php.ini是php的全局配置文件,对整个web服务起作用,.user.ini和.htaccess都是目录的配置文件,.user.ini是用户自定义的php.ini,通常构造后门和隐藏后门。
就是把你上传的文件当作php进行解析
auto_prepend_file=test.png
函数名=你上传的文件名
文件头校验
gif的图片头通常为
GIF89a
(php)gif 文件头欺骗,gif89a文件头检测是指程序为了他人将asp等文件后缀改为gif后上传,读取gif文件头,检测是否有gif87a或gif89a标记,是就允许上传,不是就说明不是gif文件。 而欺骗刚好是利用检测这两个标记,只要在木马代码前加gif87a/gif89a就能骗过去。

ip地址

之所以转换ip地址是因为在CTFshow里面162关,过滤了.
为了实现文件上传利用了这个IP地址转换为长数字的方法,利用远程文件包含来做这道题目
二次渲染
在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),处理后在放到网站对应的标签进行显示。
如何判断图片是否进行了二次处理?
对比要上传图片与上传后的图片大小,编辑器打开图片查看上传后保留了拿些数据
绕过
这里需要配合文件包含漏洞
将一句话 木马 插入到网站二次处理后的图片中,也就是把一句话插入图片在二次渲染后会保留的那部分数据里,确保不会在二次处理时删除掉。这样二次渲染后的图片中就存在了一句话,在配合文件包含漏洞获取webshell
日志包含
利用文件包含漏洞进行获取shell
(1) apache+Linux日志默认路径
/etc/httpd/logs/access_log
或者
/var/log/httpd/access_log
(2) apache+win2003日志默认路径
D:\xampp\apache\logs\access.log
D:\xampp\apache\logs\error.log
(3) IIS6.0+win2003默认日志文件
C:\WINDOWS\system32\Logfiles
(4) IIS7.0+win2003 默认日志文件
%SystemDrive%\inetpub\logs\LogFiles
(5) nginx 日志文件
日志文件在用户安装目录logs目录下
以我的安装路径为例/usr/local/nginx,
那我的日志目录就是在/usr/local/nginx/logs里
中间件解析
IIS
IIS 6.0/7.0/7.5 文件名 目录名
6.0一般是win2003
7.0/7.5一般是win2008
IIS5.x-6.x:
1、目录解析(6.0):/1.asp/1.jpg 在此目录下的任意文件,服务器都解析为asp文件
2、文件解析:1.asp;.jpg
3、文件类型:1.asa,a.cer,1.cdx
IIS7.5:
IIS7.5是由于php配置文件中,开启了cgi.fix_pathinf
CGI解析漏洞
用户配置不当,对于任意文件名,在后面加上 /任意文件名.php 后该文件就会以php格式进行解析。
示例:tx.jpg/.php它将当做php进行解析。
3、IIS7.X与Nginx解析漏洞一致
Apache
1、换行解析-CVE-2017-15715
%0a
其2.4.0~2.4.29版本中存在一个解析漏洞
2、配置不当-.htaccess配置不当
AddHandler application/x-httpd-php .php
从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断
后缀不识别:1.php.php123
配置错误:1.php.jpg
Nginx
1、文件名逻辑-CVE-2013-4547 和IIS7.5一样开启了cgi.fix_pathinf
影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
2、解析漏洞-nginx.conf配置不当
由此可知,该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。
思路总结
如果当前目录上传了后门但是无法连接可能是因为.htaccess配置了不能解析,并且文件名随机命名,假设上传目录可以控制试试向上级目录写入
如果,没有随机命名规则,嘿嘿ヾ(≧▽≦*)o ,直接覆盖.htaccess
黑盒主要还是看功能,有上传就试试,上传头像,上传文件
学完才发现的大佬博文

浙公网安备 33010602011771号