PHP是怎样剖析JSON的 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

PHP是怎样剖析JSON的

申博_安全防护 申博 169次浏览 未收录 0个评论

canary的各种姿势—-pwn题解版

这是做栈的题目遇到的各种有关于canary的操作,适合萌新收藏,大佬们请出门右拐,谢谢~ 题目都在附件中,下面直接开始介绍吧。 题目1:bin 方法介绍:leak canary 利用格式化字符串漏洞,泄露出canary的值,然后填到canary相应的位置从而

Info

json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] ) : mixed

(PHP 5 >= 5.2.0, PHP 7, PECL json >= 1.2.0)
json_decode — 对 JSON 花样的字符串举行解码

参数 申明
json 待解码的 json string 花样的字符串。(RFC 7159)
assoc 当该参数为 TRUE 时,将返回 array 而非 object。
depth 指定递归深度。
options JSON解码的掩码选项。 如今有两个支撑的选项。
JSON_BIGINT_AS_STRING,大整数转为字符串(默许float范例)。
JSON_OBJECT_AS_ARRAY,与将assoc设置为 TRUE 有雷同的结果。

转变

  • 自 PHP 5.2.0 起,JSON 扩大默许内置并编译进了 PHP。
  • PHP 5 JSON_checker – Douglas Crockford
    • a Pushdown Automaton that very quickly determines.
  • PHP 7 中是革新的全新剖析器,特地为 PHP 订制,软件许可证为 PHP license。
    • re2c 0.16
    • Bison 3.0.4

PHP 版本申明

  • PHP 5 5.6.40
  • PHP 7 7.3.4

PHP 5 : Call Stack of json_decode (zif_json_decode)

究竟结果5已住手更新了,就简朴说起一下

  • zif_json_decode ext/json/json.c:831-857
    • php_json_decode_ex ext/json/json.c:680-796
      • json_utf8_to_utf16 utf8 转 utf16
      • new_JSON_parser 初始化
      • parse_JSON_ex 剖析 ext/json/JSON_parser.c:439-750

JSON_parser.c 就是 JSON_checker 的

PHP 7 : Call Stack of json_decode (zif_json_decode)

zif_json_decode

ext/json/json.c:312-362

默许嵌套深度 :depth = PHP_JSON_PARSER_DEFAULT_DEPTH (= 512 [php_json.h])
最大嵌套深度 :depth > INT_MAX (= 2147483647 [php.h])

接收参数并挪用php_json_decode_ex

php_json_decode_ex

ext/json/json.c:246-264

  1. 初始化 PHP 的json剖析器 php_json_parser_init
  2. 剖析 json 字符串 php_json_yyparse
  3. 若是剖析毛病,抛出非常及毛病信息
  4. 返回 PHP Object

php_json_yyparse (yyparse)

ext/json/json_parser.tab.c:115

#define yyparse php_json_yyparse

ext/json/json_parser.tab.c:1194-843

int yyparse(php_json_parser *parser)

// L:1359
if (yychar == YYEMPTY)
  {
    YYDPRINTF((stderr, "Reading a token: "));
    yychar = yylex(&yylval, parser);
  }

yylex (php_json_yylex)

ext/json/json_parser.tab.c:116

#define yylex php_json_yylex

ext/json/json_parser.tab.c:1899-1904

static int php_json_yylex(union YYSTYPE *value, php_json_parser *parser)
{
  int token = php_json_scan(&parser->scanner);
  value->value = parser->scanner.value;
  return token;
}

php_json_scan

ext/json/json_scanner.c:106-end

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

婚配并剖析字符串(包孕\uXXXX,\r等)

Flowchart

PHP是怎样剖析JSON的

Example Parser Unicode(\u003e)

Source Code json.php

<?php
print_r("===== Unicode \\u003e ===== ");
$str = '{"vk":"vir\u003eink"}';
$obj = json_decode($str);
print_r($str . "\r\n");
print_r($obj);
/* Output
===== Unicode \u003e ===== 
{"vk":"vir\u003eink"}
stdClass Object
(
    [vk] => vir>ink
)
*/

完全文件 – PHP是怎样剖析JSON的 – 测试文件 – Gist

Call Stack

进入剖析

  1. php_json_scan (ext/json/json_scanner.c)

JSON字符 婚配 value “\u003e”

  1. 省略 vir…
  2. if (yych <= '\\') goto yy77; (L:553) // \
  3. if (yych <= 'u') goto yy90; (L:625) // u
  4. if (yych <= '0') goto yy94; (L:706) // 0
  5. if (yych <= '0') goto yy97; (L:747) // 0
  6. if (yych <= '7') goto yy102; (L:797) // 3
  7. if (yych <= 'f') goto yy107; (L:863) // e
  8. s->str_esc += 5; (L:917) // \u003e -> >
  9. size_t len = s->cursor - s->str_start - s->str_esc - 1 + s->utf8_invalid_count; (L:583) // 长度处置惩罚
  10. 省略ink

PHP是怎样剖析JSON的

Unicode婚配并剖析(\u003e)

  1. if (yych == '\\') goto yy175; (L:1369) // \
  2. if (yych == 'u') goto yy177; (L:1381) // u
  3. if (yych <= '0') goto yy179; (L:1420) // 0
  4. if (yych <= '0') goto yy182; (L:1443) // 0
  5. if (yych <= '7') goto yy186; (L:1485) // 3
  6. if (yych <= 'f') goto yy190; (L:1539) // e

转换 Unicode 为 Char

  1. int utf16 = php_json_ucs2_to_int(s, 2); (L:1581->92)
  2. return php_json_ucs2_to_int_ex(s, size, 1); (L:94) // return 62

PHP是怎样剖析JSON的

从静态到动态

静态剖析

代码浏览对象

  • Sublime Text 3
  • Visual Studio Code
    • ext: Lex Flex Yacc Bison
  • Understand

剖析

  • 目的 : JSON 扩大
  • 目次 : ext/json/
  • 文件 : ext/json/json.c
  • 函数 : static PHP_FUNCTION(json_decode)

函数称号都对照轻易看懂,编辑器大多数都有转到界说功用

  • php_json_decode_ex
    • php_json_parser_init
    • php_json_yyparse
    • …etc

上文(PHP 7 : Call Stack of json_decode )列的也对照详细了

一个字就是

ext/json/README也是要先看看的

The parser is implemented using re2c and Bison. The used versions
of both tools for generating files in the repository are following:

re2c 0.16
Bison 3.0.4

固然,后缀为*.y*.re的文件也申清楚明了这个剖析触及扫描顺序(scanner)语法剖析(parser)

PS. 编译道理。。。横竖我不懂

动态剖析

经由过程静态剖析,我们能够获得一些症结函数

  • php_json_decode_ex
  • php_json_yyparse
  • yylex
  • php_json_scan

php_json_scan下断点,单步进入一把唆,调试过程当中随时加断点

  • php_json_scan
  • std: (ext/json/json_parser.tab.c:115)
  • yyc_JS: (ext/json/json_parser.tab.c:167)
  • yyc_STR_P1: (ext/json/json_parser.tab.c:547)
  • php_json_ucs2_to_int_ex
  • php_json_hex_to_int

PS. 单步跳过有点坑,尽可能用单步调试单步跳出

canary的各种姿势—-pwn题解版

这是做栈的题目遇到的各种有关于canary的操作,适合萌新收藏,大佬们请出门右拐,谢谢~ 题目都在附件中,下面直接开始介绍吧。 题目1:bin 方法介绍:leak canary 利用格式化字符串漏洞,泄露出canary的值,然后填到canary相应的位置从而


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明PHP是怎样剖析JSON的
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址