標籤:style http color get 使用 檔案
1、命令注入(Command Injection)PHP中可以使用下列5個函數來執行外部的應用程式或函數system、exec、passthru、shell_exec、“(單撇號,與shell_exec功能相同,如<?$results = `wc -w *.txt`; echo $results;?>)例:<?php //ex1.php $dir = $_GET["dir"]; if (isset($dir)){ system("ls -al ".$dir); }?>提交http://www.sectop.com/ex1.php?dir=| cat /etc/passwd提交以後,命令變成了 system("ls -al | cat /etc/passwd");2、eval注入(Eval Injection)$var = "var"; if(isset($_GET["arg"])){ $arg = $_GET["arg"]; eval("\$var = $arg;"); echo "\$var =".$var; }http://www.test.com/index.php?arg=phpinfo() 動態函數:<?php func A(){ dosomething(); } func B(){ dosomething(); } if (isset($_GET["func"])){ $myfunc = $_GET["func"]; echo $myfunc(); } ?> http://www.test.com/index.php?func=phpinfo 防範方法:1、盡量不要執行外部命令 2、使用自訂函數或函數庫來替代外部命令的功能 3、使用escapeshellarg函數來處理命令參數 4、使用safe_mode_exec_dir指定可執行檔的路徑esacpeshellarg函數會將任何引起參數或命令結束的字元轉義,單引號“’”,替換成“\’”,雙引號“"”,替換成“\"”,分號“;”替換成“\;”用safe_mode_exec_dir指定可執行檔的路徑,可以把會使用的命令提前放入此路徑內safe_mode = Onsafe_mode_exec_dir = /usr/local/php/bin/ 3、用戶端指令碼攻擊(Script Insertion)用戶端指令碼植入的攻擊步驟a、攻擊者註冊普通使用者後登陸網站b、開啟留言頁面,插入攻擊的js代碼,如插入 <script>while(1){windows.open();}</script> 無限彈框、插入<script>location.href="http://www.sectop.com";</script> 跳轉釣魚頁面c、其他使用者登入網站(包括管理員),瀏覽此留言的內容d、隱藏在留言內容中的js代碼被執行,攻擊成功解決方案:htmlspecialchars(nl2br($row[‘question‘]), ENT_QUOTES); 轉義特殊字元
4、跨網站指令碼攻擊(Cross Site Scripting, XSS)跨站指令碼主要被攻擊者利用來讀取網站使用者的cookies或者其他個人資料,一旦攻擊者得到這些資料,那麼他就可以偽裝成此使用者來登入網站,獲得此使用者的許可權。一般步驟:a、攻擊者以某種方式發送xss的http連結給目標使用者b、目標使用者登入此網站,在登陸期間開啟了攻擊者發送的xss連結c、網站執行了此xss攻擊指令碼d、目標使用者頁面跳轉到攻擊者的網站,攻擊者取得了目標使用者的資訊e、攻擊者使用目標使用者的資訊登入網站,完成攻擊 5、SQL注入攻擊(SQL injection) 6、跨網站偽造要求攻擊(Cross Site Request Forgeries, CSRF)a、檢查網頁的來源$_SERVER["HTTP_REFERER"]中的網域名稱和$_SERVER["SERVER_NAME"]中的是否一致b、檢查內建的隱藏變數訪問頁面時,在server端產生一個隨機數,放置到form的隱藏欄位中,同時該值也儲存在伺服器session中,提交表單時驗證提交的隨機數和session中的是否一致,不一致表示來源偽造。c、使用POST,不要使用GET 7、Session 工作階段劫持(Session Hijacking)通過XSS或者其他手段擷取到使用者的session_id,然後用如下連結來冒充合法使用者的身份進行操作http://www.test.com/session.php?PHPSESSID=dce417abdb9a004673c125ccf69dcb8b
8、Session 固定攻擊(Session Fixation) 防範方法a.定期更改session id函數 bool session_regenerate_id([bool delete_old_session])在index.php開頭加上session_start();session_regenerate_id(TRUE);……這樣每次從新載入都會產生一個新的session id b.更改session的名稱session的預設名稱是PHPSESSID,此變數會儲存在cookie中,如果駭客不抓包分析,就不能猜到這個名稱,阻擋部分攻擊session_start();session_name("mysessionid");…… c.關閉透明化session id透明化session id指當瀏覽器中的http請求沒有使用cookies來制定session id時,sessioin id使用連結來傳遞;開啟php.ini,編輯session.use_trans_sid = 0代碼中int_set("session.use_trans_sid", 0);session_start();…… d.只從cookie檢查session idsession.use_cookies = 1 表示使用cookies存放session idsession.use_only_cookies = 1 表示只使用cookies存放session id,這可以避免session固定攻擊代碼中:int_set("session.use_cookies", 1);int_set("session.use_only_cookies", 1); p> e.使用URL傳遞隱藏參數session_start();$seid = md5(uniqid(rand()), TRUE));$_SESSION["seid"] = $seid;攻擊者雖然能擷取session資料,但是無法得知$seid的值,只要檢查seid的值是否與session中的seid一致,就可以確認當前頁面是否是web程式自己調用的。 9、HTTP響應拆分攻擊(HTTP Response Splitting) $fp = fsockopen(www.00aq.com, 80); // 開啟Internet socket串連 <?phpfputs($fp, "GET / HTTP/1.1\r\n");//寫入HTTP請求表頭 fputs($fp, "Host: www.00aq.com\r\n\r\n"); $http_response = ""; // HTTP響應的字串while (!feof($fp)){ $http_response .= fgets($fp, );//讀取256位的HTTP響應字串} fclose($fp); // 關閉Internet socket串連echo nl2br(htmlentities($http_response));// 顯示HTTP響應資訊 ?> HTTP響應拆分是由於攻擊者經過精心設計利用電子郵件或者連結,讓目標使用者利用一個請求產生兩個響應,前一個響應是伺服器的響應,而後一個則是攻擊者設計的響應。此攻擊之所以會發生,是因為WEB程式將使用者的資料置於HTTP響應表頭中,這些使用者的資料是有攻擊者精心設計的 可能遭受HTTP請求響應拆分的函數包括以下幾個:header(); setcookie(); session_id(); setrawcookie(); HTTP響應拆分通常發生在:Location表頭:將使用者的資料寫入重新導向的URL地址內Set-Cookie表頭:將使用者的資料寫入cookies內 header("Location: " . $_GET[‘page‘]); 防範的方法: a.替換CRLF換行字元 header("Location: " . strtr($_GET[‘page‘], array("\r"=>"", "\n"=>""))) b.使用最新版本的PHP PHP最新版中,已經不允許在HTTP表頭內出現換行字元 隱藏HTTP響應表頭 apache中httpd.conf,選項ServerTokens = Prod, ServerSignature = Off php中php.ini,選項expose_php = Off 10、檔案上傳漏洞(File Upload Attack) Array{ [file] => Array{ [name] => test.txt //檔案名稱 [type] => text/plain //MIME類型 [tmp_name] => /tmp/php5D.tmp //臨時檔案 [error] => 0 //錯誤資訊 [size] => 536 //檔案大小,單位位元組 } } $_FILES[‘file‘][‘error‘]變數用來儲存上傳檔案時的錯誤資訊,它的值如下:錯誤資訊數值說 明UPLOAD_ERR_OK0沒有錯誤UPLOAD_ERR_INI_SIZE1上傳檔案的大小超過php.ini的設定UPLOAD_ERR_FROM_SIZE2上傳檔案的大小超過HTML表單中MAX_FILE_SIZE的值UPLOAD_ERR_PARTIAL3只上傳部分的檔案UPLOAD_ERR_NO_FILE4沒有檔案上傳 防範防範:檢測檔案類型,命名規則等 11、目錄穿越漏洞(Directory Traversal) 12、遠程檔案包含攻擊(Remote Inclusion) 13、動態函數注入攻擊(Dynamic Variable Evaluation) 14、URL攻擊(URL attack) 15、表單提交欺騙攻擊(Spoofed Form Submissions) 16、HTTP請求欺騙攻擊(Spoofed HTTP Requests)