今天做bugku的基础题遇见的……很神奇,真心涨姿势(好吧其实我现在每做一道题都是涨知识)
题目:flag在index里
链接:呼哈哈
题解:
可以看到题目打开的界面里
注意这里:?file=show.php;可以联想到文件包含漏洞,然后我们就可以用php://filter协议来查看源文件内容;
构造:php://filter/read=convert.base64-encode/recource=index.php;
这句话的意思是我们用base64编码的方式来读文件index.php;这时页面会显示出源文件index.php经过base64编码后的内容,然后经过base64解码就可以看到flag;
--------------------------------------------------------------------------------------------------------------------我是分割线哇----------------------
php://filter简单理解:
php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字,filter,可以很容易想到这个协议可以用来过滤一些东西;
使用不同的参数可以达到不同的目的和效果:
名称 | 描述 | 备注 |
---|---|---|
resource=<要过滤的数据流> | 指定了你要筛选过滤的数据流。 | 必选 |
read=<读链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符(|)分隔。 | 可选 |
write=<写链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符(|)分隔。 | 可选 |
<;两个链的筛选列表> | 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。 |
另外用read的解释:
上例中我们应用了read参数和resource参数,当然还可以用write参数,这时我们可以通过指定写的方式来对文件进行一些改变;
例如我们想对一些php的内容进行编码的转换(目的一般是为了各种绕过):
下面来自:这里
看下面一段代码:
<?php
$content = '<?php exit; ?>';
$content .= $_POST['txt'];
file_put_contents($_POST['filename'], $content);
这里的$content在开头增加了exit,使得我们即使可以成功写入一句话,也无法执行。
我们通过php://filter巧妙绕过这里的限制
1.对我们想要写入的一句话进行base64encode
2.php://filter/read=convert.base64-decode进行解码
那么\<\?php exit;?>这一部分在经过解码后,php不对其解析,而我们想要写入的一句话正好被成功解码。因此得以成功上传webshell。
思路二
上面的题目除了base64外,还有另一种做法。
我们可以发现我们想要去除的代码片其实是一个XML标签,因此我们可以想到一个函数去去除它:strip_tags
如果这样进行处理的话,我们想要写入的一句话也会被处理。
不过,我们的php://filter是可以使用多个过滤器的,因此我们可以先对我们想要的一句话进行编码,过滤器中先使用strip_tags函数进行处理再使用对应的解码方法即可!(如base64,rot-13
如果使用rot-13,则该方法仅限于当short_open_tag不开启的时候;
----------------------------------------------------------------------------------------------------------我是分割线哇
总之呢,php://filter协议有一下几个应用:
1、利用base64获得源码
2、通过读写编码实行绕过操作
更多推荐
php://filter 的使用
发布评论