PHP代碼審計基礎
阿新 • • 發佈:2018-02-04
之前 命令執行 file 一個 ssi nal arr adf nts
一、GPC
- 整數類型不受GPC影響
- $_SERVER變量不受GPC保護
- $_FILES變量不受GPC保護
- 寬字節註入
- 數據庫操作容易忘記添加單引號的地方如:in()/limit/order by/group by
- 只過濾了變量的值,但沒有過濾key(有的程序會在代碼中使用key,如帶入SQL語句)
- php5.3以後$_REQUEST中不再包含$_COOKIE(可能導致過濾不全)
- GPC為on的時候,在php4和php<5.2.1的情況下GPC不處理數組第一維變量的key
- 在對參數進行過濾後又對其進行了其它的操作,如substr,str_replace等,這可能導致轉義符被刪除
二、特性
函數/語法 | 特性 |
---|---|
in_array | 比較之前會對數據進行類型轉換 |
is_numeric | 十六進制可繞過 |
intval | 會對字符串進行類型轉換,只要第一個字符是數字即可轉換成功 |
iconv | 導致字符串截斷 |
==與=== | 雙等號兩邊如果變量類型不同則會做類型轉換 |
` ` |
反引號命令執行 |
“” | 雙引號變量解析 |
$a($b) | 動態函數執行 |
is_file | 使用通配符(<,>)可繞過 |
三、危險函數
- 代碼執行
- eval
- preg_replace
- assert
- call_user_func
- call_user_func_array
- create_function
- array_map
- 文件包含
- include
- require
- require_once
- include_once
- 文件讀取
- file_get_contents
- highlight_file
- fopen
- readfile
- fread
- fgetss
- fgets
- parse_ini_file
- show_source
- file()
- 文件上傳
- move_uploaded_file
- 命令執行
- exec
- system
- popen
- passthru
- proc_open
- pcntl_exec
- shell_exec
` `
- 變量覆蓋
- $$
- extract
- parse_str
- mb_parse_str
- import_request_variables
- 變量的編碼與解碼
- stripslashes
- base64_decode
- rawurldecode
- urldecode
- unserialize
- iconv
- mb_convert_encoding
- 跨站腳本
- echo
- printf
- sprintf
- print_f
- vprintf
- die
- var_dump
- var_export
- 反序列化
- serialize
- unserialize
- __construct 構造函數
- __destruct 析構函數
- __toString 打印對象時自動調用
- __sleep 序列化時自動調用
- __wakeup 反序列化時自動調用
- 枚舉
- rand 使用rand處理session時,攻擊者很容易暴力破解出session
四、閱讀技巧
- 從index文件讀起,了解程序運行流程
- 檢查程序入口處做了哪些安全處理
- 檢查數據庫入口處做了哪些安全處理
- 檢查數據庫連接處代碼
- 檢查登陸、註冊、找回密碼、綁定郵箱、文件管理和文件上傳等功能點
- 理清程序調用流程以及輸入數據的流向,這樣可以節約很多時間,可以有目的的查找漏洞
五、新技能
- 文件包含截斷新姿勢:http://www.hackersb.cn/hacker/105.html
$a = $_GET[‘file‘]; include $a.‘.html.php‘;
在可以控制協議的情況下,首先新建一個hello.html.php,內容為phpinfo(),然後壓縮成zip,然後訪問http://localhost/test/blog.php?file=zip://test.zip%23hello
註意:變量名需要在開頭以控制協議
- 功能同上,協議更換為phar, 訪問方式為:http://localhost/test/blog.php?file=phar://1.zip/1.php
PHP代碼審計基礎