[ACTF2020 新生赛]Include 1
作为一个小白,第一次解出了buu上的题目,为了勉励自己,就把以后我觉得有趣的题目的wp都写出来,锻炼自己,变得更好。
进入靶机
看到tips点进去
检查网页源代码没有发现有用的东西,打开dirsearch扫描后台,也没发现有用文件。
这时看到?file=flag.php,联系题目文件包含,意识到这是个文件上传漏洞。
那么首先考虑 “php://input”伪协议 + POST发送PHP代码 的经典套路
发现php://input
已经被过滤,这时我想到P神的一篇文章
这里引用一下他的话
php://filter
之前最常出镜的地方是XXE。由于XXE漏洞的特殊性,我们在读取HTML、PHP等文件时可能会抛出此类错误parser error : StartTag: invalid element name
。其原因是,PHP是基于标签的脚本语言,<?php ... ?>
这个语法也与XML相符合,所以在解析XML的时候会被误认为是XML,而其中内容(比如特殊字符)又有可能和标准XML冲突,所以导致了出错。那么,为了读取包含有敏感信息的PHP等源文件,我们就要先将“可能引发冲突的PHP代码”编码一遍,这里就会用到
php://filter。
php://filter是PHP语言中特有的协议流,作用是作为一个“中间流”来处理其他流。比如,我们可以用如下一行代码将POST内容转换成base64编码并输出:
1 readfile("php://filter/read=convert.base64-encode/resource=php://input");如下:
所以,在XXE中,我们也可以将PHP等容易引发冲突的文件流用php://filter协议流处理一遍,这样就能有效规避特殊字符造成混乱。
如下,我们使用的是
php://filter/read=convert.base64-encode/resource=./xxe.php
对于通过巧用编码和解码来绕过死亡exit()
P神在文章里已经写的很明白了
我特意查了一下base64_decode()
的参数和返回值,如下
1 | string base64_decode(string $data[, bool $strict = false] ) |
看见输入的数据超出base64字母表,将被静默丢弃无效就懂了
注意:是在strict为TRUE时才丢弃,否则返回FALSE!!!
此时又想到超出base64的字符又有哪些
百度一搜得到
Base64索引表,字符选用了”A-Z、a-z、0-9、+、/“ 64个可打印字符。只有64个……
以上与本题无关
上述说明在有可控变量
,且存在重要死亡函数无法绕过时,可以参考php://filter
流的base64-decode
方法,将变量
解码,利用php base64_decode
函数特性去除“死亡exit”。
本题重在php://filter
伪协议的运用
知道原理后测试
成功打印出flag.php的base64加密值
解码后找到flag
看到//一切了然于胸