PHP安全:简谈文件包含漏洞

简谈文件包含漏洞

  • 前言
  • 0x01 危险的函数
  • 0x02 四种函数的区别
  • 0x03 本地文件包含和远程文件包含
  • 0x04 练练手吧
  • 总结


前言

文件包含,算是“注入攻击”中的典型代表之一了,这种漏洞在PHP语言上出现比较多,因为PHP语言在设计上一开始没有过多地考虑安全性,时至今日,尽管PHP社区和开发者一直在安全性上做出努力,不过遗留下来的问题还是不少。
本篇主要讲解PHP文件包含漏洞的相关知识。

PHP安全:简谈文件包含漏洞_第1张图片
(替兄弟默哀三分钟= =、)


0x01 危险的函数

文件包含可能出现在JSP、PHP、ASP等语言中,常见的导致文件包含的函数主要有以下几种:

PHP:include(),include_once(),require(),require_once(),fopen(),readfile()
JSP/Servlet:ava.io.File(),java.io.FileReader()
ASP:include file,include virtual

当使用这4个函数包含一个新的文件时,该文件将作为PHP代码执行PHP内核并不会在意包含的文件是什么类型。所以如果被包含的是txt文件、图片文件、远程url,都将作为PHP代码执行。

0x02 四种函数的区别

Include:找不到被包含的文件时只会产生警告,脚本将继续执行。
include_once:与include类似,区别在于如果该文件中的代码已经被包含,则不会再次包含。
require:require 找不到被包含的文件会产生致命错误,并停止脚本。
require_once:与require类似,区别在于如果该文件中的代码已经被包含,则不会再次包含。

听起来可能有点晕,写一个简单的php演示一下把~
先在服务器根目录下建一个用来包含的文本:
PHP安全:简谈文件包含漏洞_第2张图片

  1. 比较include和include_once的区别:
    include:
    PHP安全:简谈文件包含漏洞_第3张图片
    引入同目录下的文件时,include包含了两遍。
    PHP安全:简谈文件包含漏洞_第4张图片
    引入不存在的文件时,报错两次。
    PHP安全:简谈文件包含漏洞_第5张图片
    include_once:
    PHP安全:简谈文件包含漏洞_第6张图片
    include_once只包含了一遍:
    PHP安全:简谈文件包含漏洞_第7张图片
    引入不存在的文件时,同样报错两次。
    PHP安全:简谈文件包含漏洞_第8张图片

  2. require和require_once
    require:
    PHP安全:简谈文件包含漏洞_第9张图片
    引入存在文件,包含了两次:
    PHP安全:简谈文件包含漏洞_第10张图片
    引入不存在的文件,发现错误后操作立刻终止:
    PHP安全:简谈文件包含漏洞_第11张图片
    require_once:
    PHP安全:简谈文件包含漏洞_第12张图片
    引入存在文件,只包含一次:
    PHP安全:简谈文件包含漏洞_第13张图片
    引入不存在文件,发现错误后同样操作立刻终止:
    PHP安全:简谈文件包含漏洞_第14张图片

0x03 本地文件包含和远程文件包含

上面举的例子就是本地文件包含,如果allow_url_include为ON的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞。
配置在php根目录下.ini。
PHP安全:简谈文件包含漏洞_第15张图片
尝试用url作为参数引入其他服务器的脚本,假设攻击者的服务器上有一个脚本:
PHP安全:简谈文件包含漏洞_第16张图片
利用远程文件包含导入。
PHP安全:简谈文件包含漏洞_第17张图片

0x04 练练手吧

这边有一道ctf题,网址打开是这样的
PHP安全:简谈文件包含漏洞_第18张图片
很明显就是要用到文件包含,但是文件目录不知道啊,怎么办?先盲猜一波,试试常见的“flag.txt”或者“flag.php”。
无果。。。
PHP安全:简谈文件包含漏洞_第19张图片
没事,这边还有PLAN B!PHP伪协议

文件包含实际就是默认使用了`file://`协议

*file://协议通常用来读取本地文件,且不受allow_url_open和allow_url_include的影响。*

这里用到php://input的伪协议来获取当前文件目录。
参数输入php://input,POST数据输入:,回显内容中显示目录。
PHP安全:简谈文件包含漏洞_第20张图片
OK,知道文件名是ctf_go_go_go后直接读取获得flag。
PHP安全:简谈文件包含漏洞_第21张图片


总结

PHP伪协议是常常结合文件包含使用的,所以也应该要好好学习这方面的内容,这边就不再大篇幅地介绍PHP伪协议了,想详细了解伪协议的可以到这里:PHP伪协议总结
这个在线靶机包含了CTF和AWD的大量题型,推荐小伙伴可以注册一个账号去练练手,毕竟安全更加重视的是操作AND实战!

ctfshow在线靶场:ctf.show

你可能感兴趣的:(web安全,php,安全漏洞)