先简单了解一下什么是文件包含:开发人员一般会把重复使用的函数写到单个文件中,当需要使用这个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。那正常来说包含的文件是固定的、写死的就不会存在文件包含漏洞,但是这样的话又不够便捷,所以开发人员为了使代码调用更加灵活,就会将被包含的文件设置为变量,用来进行动态调用。但正是由于这种灵活性,允许用户从客户端提交一个变量值来作为文件包含的变量值,当这个值是段恶意代码时,并且服务端又没有对用户的输入进行一个很好的过滤,就会造成文件包含漏洞。
注:(实现文件包含功能的函数:include、require、include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readline。各种函数作用、用法,大家还是百度吧)
本题的php源代码乍一看就是利用filename参数带一段恶意代码进去,然后include函数执行恶意代码进而找到flag。事实也是这样,不过会遇到很多过滤,要想办绕过去。
.伪协议种类
file:// 访问本地文件系统
http:// 访问http(s)网址
ftp:// 访问ftp
php:// 访问各个输入/输出流
zlib:// 压缩流
data:// 数据
rar:// RAR压缩包
ogg:// 音频流
php://伪协议用法,例如:php://input,用于执行php代码,(需要post请求提交数据)。
php://filter,用于读取源码,?filename=php://filter/read=convert.base64/resource=/etc/passwd