查閱大量資料後,列出的常見代碼審計漏洞。php
代碼審計 =================================================================================================== * sql注入 ** 變量未過濾致使 *** http://www.test404.com/post-811.html - $_SERVER變量未過濾,請求頭中X_FORWARDED_FOR,CLIENT_IP,HTTP_HOST,ACCEPT_LANGUAGE - 傳入的參數未強制轉爲int - 數組只過濾了value未過濾key,但key也會代入到sql中 - $_FILES變量未過濾( http://www.test404.com/post-815.html ) ** 過濾函數的誤用 *** http://www.test404.com/post-809.html - str_replace將單引號去掉了,結果轉義符反斜槓留下了,致使在sql語句中將真正的單引號轉義了 - 在帶入sql語句前,stripslashes將轉義符去掉了 - 多餘的urldecode,致使單引號的「二次編碼」%2527能夠繞過單引號過濾 ( http://www.test404.com/post-808.html ) ** 二次注入 - 單引號被轉義後入庫或入文件,再次以該字段爲查詢條件時觸發 ** 寬字節注入 - gpc或addslash添加了轉義符%5c * 命令注入 - popen - proc_open - exec - system - passthru - 反引號 * 代碼注入 ** pgrep_replace ** eval ** assert ** 雙引號 - php -r '$a = "${${eval(phpinfo())}}";' - php -r '$a = "${@eval(phpinfo())}";' - php -r '$a = ${@eval("phpinfo();")}; - php -r '$a = ${${eval("phpinfo();")}};' * xss反射 ** 直接回顯 $_SERVER['HTTP_REFFER'] ** $_SERVER['PHP_SELF'] ** $_SERVER['HTTP_URI'] ** $_SERVER['USER_AGENT'] * xss存儲 ** 留言板未使用 htmlspecialchars 過濾 * CSRF 利用了網站對用戶的信任 ** 敏感表單未加token驗證 ** 防護 - 不要採用get方式提交 - 添加令牌驗證 - 驗證請求來源,http_reffer,但可被繞過 - 在http頭部添加自定義屬性來驗證 * 文件包含 ** 本地包含,受gpc影響 - 技巧 %00截斷 ** 遠程包含,須要php.ini中 allow_url_include 與 allow_url_fopen 開啓 - 技巧:追加 ? # 等字符 ** 僞協議 - php://input,並post提交<?php phpinfo();?>, 須要allow_url_inlcude開啓且php>5.2.0 - php://filter/read=convert.base64-encode/resource=based64-php-code.txt, 無需什麼條件 * 動態函數執行與匿名函數執行 ** 動態函數:函數名以參數形式傳進來,直接跟括號獲得調用。 ** 匿名函數:相似lambda函數,但函數體在在定義時引入了外部字符串變量,使得能夠注入惡意代碼。 * 反序列化漏洞 ** 構造的序列化字符串在反序列化後會覆蓋類的成員變量。結合其餘代碼執行漏洞,獲得利用。 * 變量覆蓋漏洞 ** 若是自動註冊全局變量默認開啓,地址欄提交的參數會被定義成變量。 - 變量未初始化時,會被覆蓋,可致使修改module之類的變量,致使文件包含漏洞; ** 動態定義變量 - http://www.test404.com/post-815.html - 使用雙美圓符$$,動態定義變量時。 - 危險函數extract,會從字典中動態提取鍵值對來定義變量 * 文件管理漏洞 ** 危險函數copy、unlink,存在時間競爭漏洞。 - http://www.test404.com/post-875.html - 上傳頭像-->生成臨時文件(tmp.php)-->不斷請求tmp.php(在上層目錄生成shell.php文件)-->刪除當前目錄下tmp.php等非jpg文件,但留下了上層目錄下的shell.php文件-->成功! * 上傳漏洞 ** 危險函數:好比getimagesize,若是文件頭部以GIF89a開頭,那麼該文件就被判斷爲圖片文件。 - 參見 http://www.test404.com/post-875.html ** 未受權引用:好比直接訪問上傳接口 * 驗證碼漏洞 ** 抓包構造sid,發送空驗證碼,可繞過條件判斷 - 不經過頁面訪問時,沒生成驗證碼,弱類型比較時NULL==''爲真 ** 第一次經過頁面刷新獲取驗證碼,後續抓包反覆提交該驗證碼 - 不管驗證碼是否輸入正確與否,後臺都應該從新生成驗證碼 * php中的奇怪現象 ** 弱類型比較時存在繞過判斷條件的漏洞 *** 傳遞的參數爲數組時,函數通常返回爲NULL。 - ?goods[]=92%004&goods[]=967&goods[]=993 $_GET: array(1) { ["goods"]=> array(3) { [0]=> string(4) "924" [1]=> string(3) "967" [2]=> string(3) "993" } } $_GET["goods"]: array(3) { [0]=> string(4) "924" [1]=> string(3) "967" [2]=> string(3) "993" } ereg('123', '456'): bool(false) ereg("^[0-9a-zA-Z]+$", $_GET["goods"]): NULL ereg("^[0-9a-zA-Z]+$", $_GET["goods"])!==False: bool(true) ereg("^[0-9a-zA-Z]+$", $_GET["goods"])!=False: bool(false) $_GET["goods"]>9999999: bool(true) strcmp($_GET["goods"], "123123"): NULL strcmp($_GET["goods"], "123123")==0: bool(true) *** 弱類型的比較 - var_dump("1e8">999): bool(true) - var_dump("1e8">"999"): bool(true) - var_dump("1e8asdfasdf">999): bool(true) - var_dump("1e8asasdf">"999"): bool(false) - var_dump("0e8"==0): bool(true) - var_dump("0e8"=="0"): bool(true) - var_dump(true=="asfasdfsfsadf"): bool(true)