首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 註釋繞過技巧:利用標籤閉合打破單行註釋執行代碼

     編輯:PHP 相關知識

原理

PHP 解析器遇到 // 或 # 後,**忽略後續內容直到行尾或 PHP 標籤結束 ?>**。若在註釋中插入 ?> 結束標籤,後續代碼將脫離 PHP 模式以 HTML 輸出,或遇到 <?php/<?= 重新進入 PHP 模式**繼續執行**。

可執行 Payload

<?php
// 註釋?><?= 'hello' ?>
// 解析流程:
// 1. // 註釋  → 忽略 "註釋"
// 2. ?>      → 結束 PHP 模式
// 3. <?= 'hello' ?> → 重新進入 PHP,執行 echo 'hello'
// 4. 輸出:hello
?>

四種變體

//comment?><?='hello'#comment?><?='hello'//comment%><%='hello'#comment%><%='hello'
Payload條件結果
默認輸出 hello
默認輸出 hello
asp_tags=On (PHP 7 移除)輸出 hello
asp_tags=On輸出 hello

應用場景與風險

  • CTF 繞過 WAF/過濾器:過濾了 phpinfo、system 等關鍵字,但可通過註釋閉合注入代碼片段。
  • 代碼審計盲點:靜態分析工具可能誤以為整行被註釋,實則執行。
  • 模板注入:用戶輸入被直接放入 PHP 文件作註釋部分(極罕見但理論可能)。

防範與最佳實踐

  1. 不要將用戶輸入直接寫入 PHP 代碼文件(包括註釋區)。配置文件用 include/require 載入純數據文件(JSON/INI/PHP 返回陣列)。
  2. 禁用短標籤 short_open_tag、ASP 標籤(現代 PHP 預設關閉)。
  3. 代碼審計關注 ?>、<?php、<?= 在字符串/註釋中出現的情況。
  4. 使用 token_get_all() 詞法分析而非正則匹配註釋。

總結

PHP 註釋以 ?> 結束為邊界,**而非換行符**。這一特性構成「註釋繞過」技巧,屬於語言解析器邊界行為。現代框架/模板引擎已徹底隔離代碼與數據,實際業務開發中極少遇到,但在**舊系統遷移、CTF、靜態分析規則編寫**時必須了解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved