PHP偽協議
PHP偽協議事實上是其支持的協議與封裝協議,支持的種類有以下12種。
* file:// — 訪問本地文件系統
* http:// — 訪問 HTTP(s) 網址
* ftp:// — 訪問 FTP(s) URLs
* php:// — 訪問各個輸入/輸出流(I/O streams)
* zlib:// — 壓縮流
* data:// — 數據(RFC 2397)
* glob:// — 查找匹配的文件路徑模式
* phar:// — PHP 歸檔
* ssh2:// — Secure Shell 2
* rar:// — RAR
* ogg:// — 音頻流
* expect:// — 處理交互式的流
?
把握大局
- 網站結構:瀏覽源碼文件夾,了解程序大致目錄。
- 入口文件:index.php、admin.php文件一般是整個程序的入口,詳細讀一下index文
件可以知道程序的架構,運行流程、包含的哪些配置文件,包含了哪些過濾文件以及包含哪些安全過濾文件,了解程序的業務邏輯。
- 配置文件:類似config.php文件,包含了數據庫的配置信息,程序的一些信息。先看看數據庫編碼,如果是gbk則可能存在寬字節注入。如果變量的值用雙引號、則可能存在雙引號解析代碼執行的問題。
- 過濾功能:通過祥讀公共函數文件(lib.php)和安全過濾文件等文件,清晰掌握用戶輸入的數據,哪些被過濾,哪些沒被過濾,在哪里被過濾,如何過濾的,能否繞過過濾的數據。過濾方式是替換還是正則?有沒有GPC?有沒有使用addslashes()處理。
?
審計方法
- 通讀全文法:把握大局→根據入口文件進入各個功能進行審計。
- 敏感函數參數回溯法:最高效、最常用的方法。
大多數漏洞的產生是因為函數的使用不當導致的。使用軟件查找匹配一些高危漏洞、關鍵函數及敏感關鍵字,如——Seay源代碼審計系統。不推薦使用,誤報率太高,但是可以練習一下,熟悉危險函數、關鍵函數。
- 定向功能分析法:最主要的方法
使用瀏覽器逐個訪問瀏覽,看看這套程序有哪些功能。根據相關功能,大概推測可能存在哪些漏洞。
把握大局——定向功能——敏感函數參數回溯
常見功能漏洞:
程序初始安裝 l? 站點信息泄露(日志、備份文件) l? 文件上傳 l? 模板、文件編輯 l? 模板更改(zip)l? 數據庫備份 l? 找回密碼 l? 修改配置信息
?
常見的INI配置
配置文件
???????? php.ini全局配置文件、.user.ini用戶配置文件,與Apache的.htaccess類似。http.conf會覆蓋php.ini的值。
變量相關
???????? 全局變量:register_globals,會造成變量之間的覆蓋,例如傳遞一個一樣的參數,post會覆蓋掉get的值。
???????? 短標簽:short_open_tag? <? ?>等價于<?php ?>、<?=等價于<? echo。從PHP 5.4.0起。
安全模式
???????? //安全模式:safe_mode,開啟system()無法執行,關閉可以。從5.3.0廢棄,5.4.0移除。
???????? 安全模式下執行程序主目錄:safe_mode_exec_dir = /var/www/html
如果PHP使用了該安全模式,system()和其他程序執行函數將拒絕啟動不在此目錄中的程序。必須使用/作為目錄分隔符,包括Windows中。簡單來說,就是這個目錄下可以執行。
???????? 禁用類/函數:disable_classes= ,disable_functions= ,如disabe_function=opendir,readdir,
scandir,fopen,unlink。接受逗號分隔的函數名列表作為參數。只能設置在php.ini中。
上傳文件及目錄權限
設置上傳及最大上傳文件大小:file_uploads=on,upload_max_filesize=8M
文件上傳臨時目錄:upload_tmp_dir=
上傳臨時文件保存的目錄,需要可寫,如果不設置,則采用系統臨時目錄。(/tmp、C:\window\Temp)
用戶訪問目錄限制:open_basedir=.:/tmp/,open_basedir=.;c:\windows\temp
使用open_basedir選項能夠控制PHP腳本只能訪問指定的目錄,這樣能夠避免PHP腳本訪問不應該訪問的文件,一定程度上限制了phpshell的危害,我們一般可以設置只能訪問網站目錄,表示允許訪問當前目錄(既PHP腳本文件所在之目錄)和/tmp/目錄,有效防止PHP木馬跨站運行。
錯誤信息
???????? 錯誤信息控制:display_error
是否將錯誤信息作為輸出的一部分,站點發布后應該關閉這項功能,以免暴露信息,調試的時候可以開啟。
???????? 設置錯誤報告級別:error_reporting = E_all? 生產環境既發布環境應設置為0
<?php
error_reporting(E_ALL);
……
?>
將錯誤級別設置為最高,可以顯示所有的問題,方便查錯。在php.ini中設置。推薦使用E_ALL|E_STRICT ,即所有級別。
???????? 錯誤日志:
error_log = 錯誤日志的位置,必須對web用戶可寫入,如果不定義則默認寫入到web服務器的錯誤日志中去。
log_error = on 將錯誤日志輸出到文件,而不是直接輸出到前端。
log_errors_max_length = 1024 錯誤日志關聯信息的最大長度,設置為0表示無線長度。
?
魔術引號及遠程文件
魔術引號:magic_quotes_gpc = on、magic_quotes_runtime = off
???????? 為GPC(GET/POST/COOKIE)操作設置magic_quotes狀態。當magic_quotes為on,所有的單引號、雙引號、反斜杠、NULL被一個反斜杠自動轉義
???????? 本特性已自PHP 5.3.0起廢棄并將自5.4.0移除。
是否允許打開遠程文件:allow_url_fopen = on(默認)
???????? 本選項激活了URL形式的fopen封裝協議使得可以訪問URL對象例如文件。默認地封裝協議提供ftp和http協議來訪問遠程文件。
是否允許包含遠程文件:allow_url_include =off(默認)
???????? 本選項激活允許include、inclu_once、require、require_once等函數使用URL形式的fopen封裝協議。簡單來說就是可以包含遠程文件。
隨記
erroe_reporting(0);???????? //關閉網站錯誤信息(不報錯)
Print、echo、print_r()(顯示數組內容)、var_dump()(比print_r多顯示了參數類型)、exit();
???????? 雙引號解析變量、單引號不解析變量;
???????? 超級全局變量:
$GLOBALS ????? 引用全局作用域中可用的全部變量,但該變量必須是全局作用域。
$_SERVER??????? 服務器和執行腳本環境信息
$_REQUEST???? 可以引用$_GET、$_POST、$COOKIE變量
$_ENV????????????? 環境變量
$_FILES??????????? 文件上傳變量,注意要有S
?
笨鳥先飛早入林,笨人勤學早成材。轉載請注明出處:
撰寫人:fox-yu http://www.cnblogs.com/fox-yu/