PHP SQL Injection 和 XSS 的偵測程式 和 程式撰寫注意事項 – 2008
作者:jon
程式的安全, 除了本身自己該注意的事項外, 還有不少偵測程式, 可以幫你避免掉意外狀況.
此文章加上年份的資料, 主要是因為安全性會隨著時間演變, 原本安全的程式也會變的不安全(ex: XSS), 所以本篇文章是 2008 年寫的, 或許到 2009 年就過時囉, 請把此篇當參考, 再去看最新的安全資訊會比較保險.(不過就算過時, 請還是不要把它遺漏掉, 過時的漏洞還是漏洞, 還是會有安全性的問題產生)
關於安全的資訊, 先講結論就是: 網路是危險的.
大家能做到的就是盡可能的保護, 但是無法保證絕對的安全.(另外 安全
和 方便
通常是呈反比的)
這兩篇文章/簡報都蠻值得看看, 有助於瞭解下面為何要做那些事, 和其它的防範:
- TWCERT/CC 的文章: SQL Injection 簡介與相關防護, 這邊有人將此文章做過美化整理的版本: 網站安全相關 : SQL Injection 簡介與相關防護
- 2008 八月份的 SA@Taipei – LAMP 之攻防演練及安全強化實作 (08/16) – 簡報下載(推薦此簡報要看) 簡報備份
下述先就幾方面做整理:
- PHP 程式撰寫上該注意到的事項
- SQL Injection/XSS(Cross-site scripting attacks) 偵測程式(白箱/黑箱測試)
- PHP 系統上的注意事項
- 相關文章整理
PHP 程式撰寫上該注意到的事項
首先對於安全的認知, 就是 外部拉到的資料(使用者送出的資料), 都是不安全的, 都要做嚴謹的檢查.
哪些是外部拉到的資料(使用者送出的資料)?
- GET: $_GET (Form submit/網址列參數)
- POST: $_POST
- REQUEST: $_REQUEST
- COOKIE: $_COOKIE
- JSON/AJAX/合作廠商送的資料/讀取檔案, 要將資料寫入 DB 的 Data 等.
有人常會說用 Framework 就可以避免掉這種事情, 個人認為這是不太正確的想法, 因為太依賴 Framework, 反而有可能造成安全上的漏洞.(註: 並不是指不要用 Framework, 而是用 Framework 還是要注意下述的安全問題)
ex: Framework 通常會幫你做好 SQL Injection 預防的處理, 但是於 XSS 的處理上, 這通常還是得要有自己的認知, 哪些地方能使用 HTML, 秀出來的 HTML 要做過哪些處理? 允許哪些 HTML Tag? 要怎麼過濾? 這些一般 Framework 並沒辦法幫你做決定, 處理上也沒那麼容易.
PHP 本身已經提供預防各類安全問題的處理方法, 下述就簡單列出來, 不過隨時代演進, 會跟著改變, 就看當下的狀況來處理囉~
PHP 設定檔(php.ini)
- 轉載 LAMP 攻防簡報裡的內容, 不過 magic_quotes_gpc 做個修改
- register_global = off (全域變數)
- magic_quotes_gpc = off (‘ => \’ , ” => \” , %00 => \ 0) (建議 magic_quotes_gpc = off 自己處理)
- display_error = off (在網頁上顯示錯誤訊息)
- log_error = on (紀錄錯誤訊息)
- allow_url_fopen = off (可開啟遠端網頁)
- expose_php = off (顯示PHP 版本資訊)
- open_basedir = (允許開啟的目錄)
- safe_mode = on (安全模式)
- disable_function = (禁止使用的函數)
- safe_mode_include_dir = (允許include的目錄)
PHP 接收參數 GET/POST/REQUEST/COOKIE/SERVER/ENV.
PHP Filter Functions(要安裝 Pecl filter)
沒有使用此 Filter 也無所謂, 重點是要做嚴謹的檢查.(ex: integer, 年月日.. 等)
PHP 於寫入 DB 階段:(SQL Injection)
- mysql_escape_string
- mysql_real_escape_string
- prepare + execute(PDO)
PHP 於 HTML 頁面的呈現(無法讓 User 使用 HTML 情況)
- htmlspecialchars
- htmlentities ex: htmlentities($str, ENT_QUOTES, ‘UTF-8’);
PHP 於 HTML 頁面的呈現(讓 User 使用 HTML 情況)
- HTML Purifier: HTML Purifier is a standards-compliant HTML filter library written in PHP.
- PHP HTML Sanitizer: Remove unsafe tags and attributes from HTML code
- htmLawed: PHP code to purify & filter HTML
PHP 於 Shell script command(呼叫外部程式帶入參數, ex: system, exec)
瀏覽器 URL列 GET 的參數傳送
urlencode: 將要傳的參數值都要經過 urlencode, 這主要是符合標準 (RFC 1738).
PHP Source code 加密(Encrypt), 某些商業用途採用
- Zend Encoder + Optimizer
- ionCube Standalone Encoder 相關參考: ionCube、SourceCop、SourceGuardian、phpShield 四款 PHP 原始碼加密軟體測試
- eAccelerator 相關參考: eAccelerator 安裝(前身為 Turck MMCache)
- phpShield
- SourceCop
- SourceGuardian
- PHP Encoder
- PHTML Encoder
SQL Injection/XSS(Cross-site scripting attacks) 偵測程式(白箱/黑箱測試)
註: 這些工具請不要拿去玩其它網站, 只做自己程式/網站的掃描測試用.
程式本身需要加 mysql_escape_string/htmlspecialchars 等(上述挑其一方法做), 總會有不小心漏掉, 或者那是外來程式 等, 下述的工具可以來做簡單的檢測~ (我目前使用 Wapiti 和 Pixy, 其它就不太熟了.)
- Wapiti – Web application security auditor(相關文章: Wapiti – 小巧的網站漏洞檢測工具) (可檢測 SQL injection/XSS)
安裝/使用方法:
- apt-get install libtidy-0.99-0 python-ctypes python-utidylib
- python wapiti.py http://Your Website URL/ -m GET_XSS
- Pixy: XSS and SQLI Scanner for PHP(相關文章: Pixy – PHP 原始碼的弱點分析工具)
使用前要先安裝: apt-get install default-jdk
- Remote PHP Vulnerability Scanner(檢測PHP網頁問題: 自動化進行檢測 PHP 網頁的弱點, 對於 XSS 檢測能力較強)
- DeXSS (找 XSS 漏洞)
- Top 15 free SQL Injection Scanners
- check_websites: check_websites is a very simple virus scanner for Web sites.
PHP 系統上的注意事項
系統上該注意的, 就是本身系統要更新, 然後 PHP 部份, 就是把 Suhosin 裝起來.
安裝方法有下述兩種:
- 使用 PHP Suhosin extenstion: apt-get install php5-suhosin
- 將 Suhosin 編進 PHP: How To Harden PHP5 With Suhosin (Debian Etch/Ubuntu)
相關文章整理
上述感覺不到危險的, 這幾篇文章可以自己試著測試自己寫的程式看看.(請不要拿來測試非自己的網站/程式)
- SQL Injection規避入侵檢測技術
- XSS測試語法大全
- CGI漏洞攻擊整理
- SQL Injection Attacks and Some Tips on How to Prevent Them
- 檢查 CGI 安全漏洞
- 300+ PHP Presentations Online (推薦此篇的 ppt 都要看)
- Form 的安全性問題
下述就比較偏向其它相關文章整理