ACTF2020新生赛Include1
Q7nl1s admin

[ACTF2020 新生赛]Include 1

作为一个小白,第一次解出了buu上的题目,为了勉励自己,就把以后我觉得有趣的题目的wp都写出来,锻炼自己,变得更好。

进入靶机

include

看到tips点进去

include2

检查网页源代码没有发现有用的东西,打开dirsearch扫描后台,也没发现有用文件。

这时看到?file=flag.php,联系题目文件包含,意识到这是个文件上传漏洞。

那么首先考虑 “php://input”伪协议 + POST发送PHP代码 的经典套路

include3

发现php://input已经被过滤,这时我想到P神的一篇文章

谈一谈php://filter的妙用

这里引用一下他的话

XXE中的使用

php://filter之前最常出镜的地方是XXE。由于XXE漏洞的特殊性,我们在读取HTML、PHP等文件时可能会抛出此类错误parser error : StartTag: invalid element name 。其原因是,PHP是基于标签的脚本语言,<?php ... ?>这个语法也与XML相符合,所以在解析XML的时候会被误认为是XML,而其中内容(比如特殊字符)又有可能和标准XML冲突,所以导致了出错。

那么,为了读取包含有敏感信息的PHP等源文件,我们就要先将“可能引发冲突的PHP代码”编码一遍,这里就会用到php://filter。

php://filter是PHP语言中特有的协议流,作用是作为一个“中间流”来处理其他流。比如,我们可以用如下一行代码将POST内容转换成base64编码并输出:

1
readfile("php://filter/read=convert.base64-encode/resource=php://input");

如下:

thum-0f851469385893

所以,在XXE中,我们也可以将PHP等容易引发冲突的文件流用php://filter协议流处理一遍,这样就能有效规避特殊字符造成混乱。

如下,我们使用的是php://filter/read=convert.base64-encode/resource=./xxe.php

thum-693b1469385893

对于通过巧用编码和解码来绕过死亡exit()P神在文章里已经写的很明白了

我特意查了一下base64_decode()的参数和返回值,如下

1
string base64_decode(string $data[, bool $strict = false] )

include4

看见输入的数据超出base64字母表,将被静默丢弃无效就懂了

注意:是在strict为TRUE时才丢弃,否则返回FALSE!!!

此时又想到超出base64的字符又有哪些

百度一搜得到

include5

Base64索引表,字符选用了”A-Z、a-z、0-9、+、/“ 64个可打印字符。只有64个……


以上与本题无关

上述说明在有可控变量,且存在重要死亡函数无法绕过时,可以参考php://filter流的base64-decode方法,将变量解码,利用php base64_decode函数特性去除“死亡exit”。

本题重在php://filter伪协议的运用

知道原理后测试

include6

成功打印出flag.php的base64加密值

解码后找到flag

include7

看到//一切了然于胸

 Comments
Comment plugin failed to load
Loading comment plugin
Powered by Hexo & Theme Keep
Unique Visitor Page View