目录
1、本题详解
2、延伸拓展
1、本题详解
访问题目链接
有一个tips的链接,我们点击
请求了file,内容是flag.php的内容:Can you find out the flag?
尝试请求一下index.php
并没有发现什么信息
flag.php也没发现什么
尝试爆破一下它的目录和一些敏感文件名
但是遇到429报错,请求被服务器拒绝,因为发送了太多请求
想起题目名叫Include,应该考察的是文件包含,因此尝试使用伪协议进行文件读取
首先使用 php://filter(用于读取源码)
这里直接尝试读取当前目录下的flag.php
进行base64编码输出,构造payload:
?file=php://filter/read=convert.base64-encode/resource=flag.php
读取成功
进行base64解码
拿到 flag{f88d4b88-a1d0-4245-9c11-69da16affdac}
2、延伸拓展
关于php://filter的用法:
php://filter/read=convert.base64-encode/resource=[文件名]
读取文件源码(针对php文件需要base64编码)
当然有时候会对编码进行过滤和限制,这时我们就需要使用一些其他的编码方式
比如使用utf8和utf16
/?file=php://filter/convert.iconv.utf8.utf16/resource=flag.php
读取出来的内容就不需要解base64了
这里说一下这个iconv函数:完成各种字符集间的转换
比如 iconv("utf8","gbk",$string) :将字符串string 编码由utf8转变成gbk
以及convert.iconv.的用法:
convert.iconv.<input-encoding>.<output-encoding>
或者
convert.iconv.<input-encoding>/<output-encoding>
<input-encoding>和<output-encoding> 就是编码方式
常用的编码方式有:
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
EUC-JP*
SJIS*
eucJP-win*
SJIS-win*
比如我们的payload还可以是:
?file=php://filter//convert.iconv.SJIS*.UCS-4*/resource=flag.php
但是这种编码读取php文件似乎不行,不过我们可以读其他的,比如etc下的passwd
?file=php://filter//convert.iconv.SJIS*.UCS-4*/resource=/etc/passwd
尝试使用 php://input (用于执行PHP代码)进行代码执行:
回显 hacker!
应该是被检测了,我们读取一下index.php的源码看看
/?file=php://filter/convert.iconv.utf8.utf16/resource=index.php
确实过滤掉了很多伪协议,但是 php://filter 是可以使用的,这也是为什么我们能读取到flag.php