一.assert()函數
例子
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");assert("file_exists('$file')") or die("That file doesn't exist!");
第一個是會檢驗$file是否有.. ,如果有strpos會返回true,true和false不相等會返回false,最后會終止程序返回Detected hacking attempt!
assert()函數是 PHP 中的一個調試函數,用于在代碼中設置斷言檢查。
assert中的參數要是字符串很可能會被當做php代碼進行執行
二.eval()函數
eval()函數在php中會將參數中的字符串當作php代碼執行。
但是開發中很少使用,他的用法很多都會被其他替代,常見的用法是我們去上傳具有該函數的文件,進而去滲透。像我們在面對ssti漏洞(模板注入漏洞)中會去找子類的eval,但是這邊的是python的,而不是php的,但是python中的可以僅限單個表達式,所以還要配合其他函數進行,而php中的可以任意執行。
三.include()函數
內容:include
?是 PHP 中用于包含并運行指定文件的重要函數,它在動態網頁開發中非常常用,但也存在一些安全風險需要注意。
include()的參數一般都是:文件名或者文件路徑(url),常常利用協議去進行滲透
關系對比:
函數構造 | 命令執行 | 代碼執行 | PHP 5.x | PHP 7.2+ |
---|---|---|---|---|
assert(system()') | ? | ? | 雙重執行 | 僅執行命令 |
eval('system()') | ? | ? | 執行命令 | 僅表達評估 |
特性 | eval($_REQUEST['cmd']) | include() |
---|---|---|
執行方式 | 直接執行字符串中的PHP代碼 | 包含并執行指定文件內容 |
輸入要求 | 需要輸入完整PHP代碼 | 需要文件路徑或可解析的URI |
利用復雜度 | 高(需構造有效PHP語法) | 中(需控制文件路徑或利用協議) |
隱蔽性 | 高(無文件落地) | 低(需存在可訪問的惡意文件) |
PHP版本影響 | 全版本有效 | 受allow_url_include 配置影響 |
特性 | eval($_GET['cmd']) | assert($_GET['cmd']) |
---|---|---|
執行機制 | 直接執行字符串中的PHP代碼 | 在傳統模式下會執行字符串代碼 |
PHP 5.x行為 | 執行代碼 | 執行代碼 |
PHP 7.0-7.1行為 | 執行代碼 | 默認執行代碼(傳統模式) |
PHP 7.2+行為 | 執行代碼 | 默認不執行代碼(表達式模式) |
返回值 | 返回執行結果 | 返回布爾值(斷言是否成功) |
設計用途 | 動態代碼執行 | 調試斷言 |
危險等級 | 🔴 極高風險 | PHP <7.2: 🔴 極高風險 PHP ≥7.2: 🟡 中風險 |