成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PHP序列化和反序列化語法差異問題

安全 應用安全
在網上公開參數反序列化執行流程已經非常詳細,但是對于一些細節地方有一些不足,其中就包括序列化和反序列化之間的語法差異問題。

介紹

官方文檔中介紹PHP序列化和反序列化如下:

所有php里面的值都可以使用函數serialize()來返回一個包含字節流的字符串來表示。unserialize()函數能夠重新把字符串變回php原來的值。 序列化一個對象將會保存對象的所有變量,但是不會保存對象的方法,只會保存類的名字。 為了能夠unserialize()一個對象,這個對象的類必須已經定義過。如果序列化類A的一個對象,將會返回一個跟類A相關,而且包含了對象所有變量值的字符串。

簡單說序列化是對象轉化字符串的過程,反序列化是字符串還原對象的過程。

[[282947]]

環境

文章中所述內容使用環境如下:

  • 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序列化和反序列化語法差異,從而達到繞過防護的目的。

在藍隊防御中建議考慮定義中所述不會保存對象的方法,只會保存類的名字。,攔截保存類的名字,以及語法中相同的字符比如冒號進行防御。

責任編輯:趙寧寧 來源: FreeBuf
相關推薦

2022-08-06 08:41:18

序列化反序列化Hessian

2011-06-01 15:05:02

序列化反序列化

2009-08-24 17:14:08

C#序列化

2011-05-18 15:20:13

XML

2009-08-06 11:16:25

C#序列化和反序列化

2009-06-14 22:01:27

Java對象序列化反序列化

2009-08-25 14:24:36

C#序列化和反序列化

2023-12-13 13:49:52

Python序列化模塊

2018-03-19 10:20:23

Java序列化反序列化

2021-11-18 07:39:41

Json 序列化Vue

2009-09-09 16:10:11

.NET序列化和反序列

2009-08-25 14:43:26

C#序列化和反序列化

2009-09-09 15:47:27

XML序列化和反序列化

2009-09-09 14:45:41

XML序列化和反序列化

2011-06-01 14:50:48

2010-03-19 15:54:21

Java Socket

2009-07-29 13:39:02

JSON序列化和反序列ASP.NET AJA

2012-04-13 10:45:59

XML

2016-09-21 00:15:27

2016-01-05 15:10:59

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人影院网站ww555久久精品 | 中文字幕人成乱码在线观看 | 欧美激情五月 | 亚洲精品国产成人 | 亚洲精品一区二区三区蜜桃久 | 午夜影院在线观看 | 草樱av| 91免费视频 | 日韩一级 | 中文字幕电影在线观看 | 国产毛片久久久 | 毛片免费观看视频 | 亚洲精品久久 | 欧美成人免费在线视频 | 久久精品视频免费看 | 亚洲免费影院 | 欧美aaa一级片 | 亚洲精品一区二区另类图片 | 免费观看一级特黄欧美大片 | 久久伊人一区二区 | 黄色av网站在线观看 | 一区二区三区四区不卡视频 | 久久久久国产精品人 | 99精品国产一区二区青青牛奶 | 国产资源视频 | 国产日韩精品久久 | 久久最新网址 | 一级高清免费毛片 | 免费久久网 | 亚洲国产精品久久久 | 亚洲免费网 | 99r在线| 蜜桃视频一区二区三区 | 久久亚洲欧美日韩精品专区 | 精品国产乱码久久久久久牛牛 | 久草免费在线视频 | 国产日韩精品在线 | 日韩在线小视频 | 日韩精品一区二区三区久久 | 久久av一区 | av在线免费观看网址 |