先打开靶机,
ctrl+u查看一下页面源代码:
“?file=flag.php”表示这里应该有文件包含漏洞 ,页面调用了include语句,那么我们使用php伪协议中的php://filter
php://filter可以获取指定文件源码。当它与include函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致任意文件读取。
php://filter可以使用不同的参数来达到不同的作用:
resource(要过滤的数据流):必写,指定了要筛选过滤的数据流。
read(读链的筛选列表):可选,可以设定一个或多个过滤器名称
write(写链的筛选列表):可选,可以设定一个或多个过滤器名称
这里我们选择把flag.php转换base64编码进行输出,因为base64编码中只包含64个可打印字符,当php遇到不可解码的字符时,会选择性的跳过,就能看到源代码。
采用过滤器:convert.base64-encode.
最终由:?file=php://filter/convert.base64-encode/resource=flag.php
即可获得base64加密后的flag.php,代入base解码即可得到flag。
base64解密网址:base64解码 base64编码 在线base64解码/编码工具 (ip138.com)
拓展:
文件包含漏洞:服务器执行PHP文件时,可以通过文件include或require函数加载另一个文件中的PHP代码,并且当PHP来执行。
比如建立了一个foot.php,里面包含了信息,在另一个页面只需要使用include(foot.php)即可引用这些信息,更方便修改,但也容易导致漏洞。
php伪协议:php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取,可以获取指定文件源码.
协议常见参数:resource,write,read
过滤器:
转换过滤器 | 字符串过滤器 | 压缩过滤器 |
对数据流进行编码,通常用来读取文件源码。 | 用来处理掉读入的所有标签 | 压缩和解压数据流中的有效载荷部分 |
convert.base64-encode & convert.base64-decode base64加密解密 | string.rot13,string.toupper, string.tolower, string.strip_tags | zlib.deflate(压缩)和zlib.inflate(解压) |