最新公告
  • 欢迎您光临站壳网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • PHP序列化和反序列化语法差异问题

    正文概述 webmaster   2019-11-20   483

    介绍

    官方文档中介绍PHP序列化和反序列化如下:

    所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。 为了能够unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。

    简单说序列化是对象转化字符串的过程,反序列化是字符串还原对象的过程。

    PHP序列化和反序列化语法差异问题

    环境

    文章中所述内容使用环境如下:

    • PHP7.3.1、SDK
    • VSCode
    • C++和C

    在网上公开参数反序列化执行流程已经非常详细,但是对于一些细节地方有一些不足,其中就包括序列化和反序列化之间的语法差异问题。

    差异问题

    1. 序列化

    我们通过编译PHP内核源码分析,发现PHP序列化在默认情况下在对象转换中加入:{和}用来拼接成字符串。

    1. [var.c] 
    2. Line:882 
    3. static void php_var_serialize_intern() 
    4.  
    5. Line:896 
    6. if (ce->serialize(struc, &serialized_data, &serialized_length, (zend_serialize_data *)var_hash) == SUCCESS) { 
    7.                         smart_str_appendl(buf, "C:", 2); 
    8.                         smart_str_append_unsigned(buf, ZSTR_LEN(Z_OBJCE_P(struc)->name)); 
    9.                         smart_str_appendl(buf, ":"", 2); 
    10.                         smart_str_append(buf, Z_OBJCE_P(struc)->name); 
    11.                         smart_str_appendl(buf, "":", 2); 
    12.  
    13.                         smart_str_append_unsigned(buf, serialized_length); 
    14.                         smart_str_appendl(buf, ":{", 2); 
    15.                         smart_str_appendl(buf, (char *) serialized_data, serialized_length); 
    16.                         smart_str_appendc(buf, '}'); 
    17.                     } 
    18.  
    19. Line:952 
    20. smart_str_appendl(buf, ":{", 2); 
    21.  
    22. Line:995 
    23. smart_str_appendc(buf, '}'); 

    咱们来看上面这段代码,PHP会使用smart_str_appendl为序列化字符串前后拼接:{和},从var.c的第882行开始进入序列化逻辑。在第896行进行序列化字符串拼接,第952行和第995行,对于内嵌方法进行拼接。

    2. 反序列化

    反序列化是将序列化的字符串,按照一定语法规则进行转化还原。

    1. [var_unserialize.c] 
    2. Line:655 
    3. static int php_var_unserialize_internal() 
    4.  
    5. Line:674 
    6.     YYCTYPE yych; 
    7.     static const unsigned char yybm[] = { 
    8.           0,   0,   0,   0,   0,   0,   0,   0,  
    9.           0,   0,   0,   0,   0,   0,   0,   0,  
    10.           0,   0,   0,   0,   0,   0,   0,   0,  
    11.           0,   0,   0,   0,   0,   0,   0,   0,  
    12.           0,   0,   0,   0,   0,   0,   0,   0,  
    13.           0,   0,   0,   0,   0,   0,   0,   0,  
    14.         128, 128, 128, 128, 128, 128, 128, 128,  
    15.         128, 128,   0,   0,   0,   0,   0,   0,  
    16.           0,   0,   0,   0,   0,   0,   0,   0,  
    17.           0,   0,   0,   0,   0,   0,   0,   0,  
    18.           0,   0,   0,   0,   0,   0,   0,   0,  
    19.           0,   0,   0,   0,   0,   0,   0,   0,  
    20.           0,   0,   0,   0,   0,   0,   0,   0,  
    21.           0,   0,   0,   0,   0,   0,   0,   0,  
    22.           0,   0,   0,   0,   0,   0,   0,   0,  
    23.           0,   0,   0,   0,   0,   0,   0,   0,  
    24.           0,   0,   0,   0,   0,   0,   0,   0,  
    25.           0,   0,   0,   0,   0,   0,   0,   0,  
    26.           0,   0,   0,   0,   0,   0,   0,   0,  
    27.           0,   0,   0,   0,   0,   0,   0,   0,  
    28.           0,   0,   0,   0,   0,   0,   0,   0,  
    29.           0,   0,   0,   0,   0,   0,   0,   0,  
    30.           0,   0,   0,   0,   0,   0,   0,   0,  
    31.           0,   0,   0,   0,   0,   0,   0,   0,  
    32.           0,   0,   0,   0,   0,   0,   0,   0,  
    33.           0,   0,   0,   0,   0,   0,   0,   0,  
    34.           0,   0,   0,   0,   0,   0,   0,   0,  
    35.           0,   0,   0,   0,   0,   0,   0,   0,  
    36.           0,   0,   0,   0,   0,   0,   0,   0,  
    37.           0,   0,   0,   0,   0,   0,   0,   0,  
    38.           0,   0,   0,   0,   0,   0,   0,   0,  
    39.           0,   0,   0,   0,   0,   0,   0,   0,  
    40.     }; 
    41.     if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7); 
    42.     yych = *YYCURSOR; 
    43.     switch (yych) { 
    44.     case 'C': 
    45.     case 'O':    goto yy4; 
    46.     case 'N':    goto yy5; 
    47.     case 'R':    goto yy6; 
    48.     case 'S':    goto yy7; 
    49.     case 'a':    goto yy8; 
    50.     case 'b':    goto yy9; 
    51.     case 'd':    goto yy10; 
    52.     case 'i':    goto yy11; 
    53.     case 'o':    goto yy12; 
    54.     case 'r':    goto yy13; 
    55.     case 's':    goto yy14; 
    56.     case '}':    goto yy15; 
    57.     default:    goto yy2; 
    58.     } 
    59.  
    60. Line:776 
    61. yy15: 
    62.     ++YYCURSOR; 
    63.     { 
    64.     /* this is the case where we have less data than planned */ 
    65.     php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data"); 
    66.     return 0; /* not sure if it should be 0 or 1 here? */ 

    通过内核代码能够看到第655行进入反序列化,反序列化是利用词法扫描,判断各项符号转换对应对象。能够看到反序列化中对于}进行了处理,处理中只是对计数器加一并没有其他操作。

    实际作用

    反序列化语法的差异,对于安全防护设备判断反序列化产生很大的影响。在Snort中,有段规则如下:

    1. alert tcp any any -> any [80,8080,443] (uricontent:".php"; pcre:"/{w:.+?}/"; sid:1; msg:php_serialize;) 

    在攻击载荷中可以使用大多数字符代替{},从而导致规则失效。

    总结

    在红队攻击中可以利用PHP序列化和反序列化语法差异,从而达到绕过防护的目的。

    在蓝队防御中建议考虑定义中所述不会保存对象的方法,只会保存类的名字。,拦截保存类的名字,以及语法中相同的字符比如冒号进行防御。

    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,默认解压密码为"www.yoozai.net",如遇到无法解压的请联系管理员!
    悠哉网 » PHP序列化和反序列化语法差异问题

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    悠哉网 WWW.YOOZAI.NET
    悠哉网,用户消费首选的网站,喜欢你就悠哉一下。

    发表评论

    售后服务:

    • 售后服务范围 1、商业模板使用范围内问题免费咨询
      2、源码安装、模板安装(一般 ¥50-300)服务答疑仅限SVIP用户
      3、单价超过200元的模板免费一次安装,需提供服务器信息。
      付费增值服务 1、提供dedecms模板、WordPress主题、discuz模板优化等服务请详询在线客服
      2、承接 WordPress、DedeCMS、Discuz 等系统建站、仿站、开发、定制等服务
      3、服务器环境配置(一般 ¥50-300)
      4、网站中毒处理(需额外付费,500元/次/质保三个月)
      售后服务时间 周一至周日(法定节假日除外) 9:00-23:00
      免责声明 本站所提供的模板(主题/插件)等资源仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,有部分资源为网上收集或仿制而来,若模板侵犯了您的合法权益,请来信通知我们(Email: 80027422@qq.com),我们会及时删除,给您带来的不便,我们深表歉意!

    Hi, 如果你对这款模板有疑问,可以跟我联系哦!

    联系作者

    发表评论

    售后服务:

    • 售后服务范围 1、商业模板使用范围内问题免费咨询
      2、源码安装、模板安装(一般 ¥50-300)服务答疑仅限SVIP用户
      3、单价超过200元的模板免费一次安装,需提供服务器信息。
      付费增值服务 1、提供dedecms模板、WordPress主题、discuz模板优化等服务请详询在线客服
      2、承接 WordPress、DedeCMS、Discuz 等系统建站、仿站、开发、定制等服务
      3、服务器环境配置(一般 ¥50-300)
      4、网站中毒处理(需额外付费,500元/次/质保三个月)
      售后服务时间 周一至周日(法定节假日除外) 9:00-23:00
      免责声明 本站所提供的模板(主题/插件)等资源仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,有部分资源为网上收集或仿制而来,若模板侵犯了您的合法权益,请来信通知我们(Email: 80027422@qq.com),我们会及时删除,给您带来的不便,我们深表歉意!

    Hi, 如果你对这款模板有疑问,可以跟我联系哦!

    联系作者
    • 593会员总数(位)
    • 4902资源总数(个)
    • 193本周发布(个)
    • 14 今日发布(个)
    • 182稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情