web漏洞詳解及修復建議--阿里雲

 

web漏洞詳解及修復建議


XSS
1、漏洞描述
跨站腳本攻擊(Cross-site scripting,通常簡稱爲XSS)發生在客戶端,可被用於進行竊取隱私、釣魚欺騙、偷取密碼、傳播惡意代碼等攻擊行爲。 惡意的攻擊者將對客戶端有危害的代碼放到服務器上作爲一個網頁內容, 使得其他網站用戶在觀看此網頁時,這些代碼注入到了用戶的瀏覽器中執行,使用戶受到攻擊。一般而言,利用跨站腳本攻擊,攻擊者可竊會話COOKIE從而竊取網站用戶的隱私,包括密碼。
XSS攻擊使用到的技術主要爲HTML和Javascript,也包括VBScript和ActionScript等。XSS攻擊對WEB服務器雖無直接危害,但是它藉助網站進行傳播,使網站的使用用戶受到攻擊,導致網站用戶帳號被竊取,從而對網站也產生了較嚴重的危害。

2、漏洞危害
1) 釣魚欺騙:最典型的就是利用目標網站的反射型跨站腳本漏洞將目標網站重定向到釣魚網站,或者注入釣魚JavaScript以監控目標網站的表單輸入,甚至發起基於DHTML更高級的釣魚攻擊方式。
2) 網站掛馬:跨站時利用IFrame嵌入隱藏的惡意網站或者將被攻擊者定向到惡意網站上,或者彈出惡意網站窗口等方式都可以進行掛馬攻擊。
3) 身份盜用:Cookie是用戶對於特定網站的身份驗證標誌,XSS可以盜取到用戶的Cookie,從而利用該Cookie盜取用戶對該網站的操作權限。如果一個網站管理員用戶Cookie被竊取,將會對網站引發巨大的危害。
4) 盜取網站用戶信息:當能夠竊取到用戶Cookie從而獲取到用戶身份使,攻擊者可以獲取到用戶對網站的操作權限,從而查看用戶隱私信息。
5) 垃圾信息發送:比如在SNS社區中,利用XSS漏洞借用被攻擊者的身份發送大量的垃圾信息給特定的目標羣。
6) 劫持用戶Web行爲:一些高級的XSS攻擊甚至可以劫持用戶的Web行爲,監視用戶的瀏覽歷史,發送與接收的數據等等。
7) XSS蠕蟲:XSS 蠕蟲可以用來打廣告、刷流量、掛馬、惡作劇、破壞網上數據、實施DDoS攻擊等。

3、修復建議
1) 與SQL注入防護的建議一樣,假定所有輸入都是可疑的,必須對所有輸入中的script、iframe等字樣進行嚴格的檢查。這裏的輸入不僅僅是用戶可以直接交互的輸入接口,也包括HTTP請求中的Cookie中的變量,HTTP請求頭部中的變量等。
2) 不僅要驗證數據的類型,還要驗證其格式、長度、範圍和內容。
3) 不要僅僅在客戶端做數據的驗證與過濾,關鍵的過濾步驟在服務端進行。
4) 對輸出的數據也要檢查,數據庫裏的值有可能會在一個大網站的多處都有輸出,即使在輸入做了編碼等操作,在各處的輸出點時也要進行安全檢查。
5) 在發佈應用程序之前測試所有已知的威脅。

4、修復實例參考

ASP問題示例代碼:
<%
Dim param
Set param=Request.QueryString("dd")
response.write param
%>



ASP修復範例:

<%
Dim param
Set param=Request.QueryString("dd")
response.write Server.HTMLEnCode(param)
%>



PHP問題代碼示例:

<?php
$aa=$_GET['dd'];
echo $aa."123";
?>



PHP修復範例:

<?php
$aa=$_GET['dd'];
echo htmlspecialchars($aa)."123";
?>



SQL Inject
1、漏洞描述
SQL注入攻擊(SQL Injection),簡稱注入攻擊、SQL注入,被廣泛用於非法獲取網站控制權,是發生在應用程序的數據庫層上的安全漏洞。 在設計不良的程序當中,忽略了對輸入字符串中夾帶的SQL指令的檢查,那麼這些夾帶進去的指令就會被數據庫誤認爲是正常的SQL指令而運行, 從而使數據庫受到攻擊,可能導致數據被竊取、更改、刪除,以及進一步導致網站被嵌入惡意代碼、被植入後門程序等危害。

2、漏洞危害
1) 機密數據被竊取
2) 核心業務數據被篡改
3) 網頁被篡改
4) 數據庫所在服務器被攻擊變爲傀儡主機,甚至企業網被入侵。

3、修復建議
1) 所有的查詢語句都使用數據庫提供的參數化查詢接口,參數化的語句使用參數而不是將用戶輸入變量嵌入到SQL語句中。當前幾乎所有的數據庫系統都提供了參數化SQL語句執行接口,使用此接口可以非常有效的防止SQL注入攻擊。
2) 對進入數據庫的特殊字符('"\<>&*;等)進行轉義處理,或編碼轉換。
3) 確認每種數據的類型,比如數字型的數據就必須是數字,數據庫中的存儲字段必須對應爲int型。
4) 數據長度應該嚴格規定,能在一定程度上防止比較長的SQL注入語句無法正確執行。
5) 網站每個數據層的編碼統一,建議全部使用UTF-8編碼,上下層編碼不一致有可能導致一些過濾模型被繞過。
6) 嚴格限制網站用戶的數據庫的操作權限,給此用戶提供僅僅能夠滿足其工作的權限,從而最大限度的減少注入攻擊對數據庫的危害。
7) 避免網站顯示SQL錯誤信息,比如類型錯誤、字段不匹配等,防止攻擊者利用這些錯誤信息進行一些判斷。
8) 在網站發佈之前建議使用一些專業的SQL注入檢測工具進行檢測,及時修補這些SQL注入漏洞。

4、修復實例參考
ASP漏洞代碼示例
<%
Dim oComm, oRs
Set id=Request.QueryString("d")
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open "Provider=MSDAORA;Password=sth;Persist Security Info=True;User ID=whats;Data Source=mescp"
Set oComm = CreateObject("ADODB.Command")
oComm.ActiveConnection = oConn
Comm.CommandType = 1  
oComm.CommandText = "select * from all_objects where rownum ="& id
Set oRs = oComm.Execute
%>


ASP修復範例
<%
Dim oComm, oRs
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open "Provider=MSDAORA;Password=sth;Persist Security Info=True;User ID=whats;Data Source=mescp"
Set oComm = CreateObject("ADODB.Command")
oComm.ActiveConnection = oConn
Comm.CommandType = 1  
oComm.CommandText = "select * from all_objects where rownum = ? "
oComm.Parameters.Append oComm.CreateParameter("v1",3,1,4,100)
Set oRs = oComm.Execute
%>


PHP漏洞代碼示例
<?php$id=$_GET['id'];$conn = mysql_connect("localhost","root","") or die ("wrong!");$sel=mysql_select_db("mydb",$conn); $sql="select * from user where id = ".id$que=mysql_query($sql,$conn);?>


PHP修復範例
<?php
$id=$_GET['id'];
$conn = mysql_connect("localhost","root","") or die ("wrong!");
$sel=mysql_select_db("mydb",$conn);
$sql="select * from user where id = :id"
$stmt = $conn->prepare($sql);  
$stmt->execute(array(':id'=>$id));  
?>


Code Injection
1、漏洞描述
代碼注入是指由於服務端代碼漏洞導致惡意用戶輸入在服務端被執行的一種高危安全漏洞。

2、漏洞危害
利用該漏洞,可以在服務器上執行攻擊者拼裝的代碼。

3、修復建議
嚴格檢查控制程序的參數。

4、修復實例參考
ASP漏洞示例:
<%
' 期待輸入sub.asp
execute request("include")
%>


ASP修復範例
<%
<!--#include file="sub.asp"-->
%>


PHP漏洞示例
<%php
$myvar = "varname";
$x = $_GET['arg'];
eval("\$myvar = \$x;");
%>


PHP修復範例
<%php
$myvar = "varname";
$x = $_GET['arg'];
$myvar = $x;
%>


OS Commanding Injection
1、漏洞描述
系統命令執行是指應用程序對傳入命令行的參數過濾不嚴導致惡意用戶能控制最終執行的命令,進而入侵系統,導致嚴重破壞的高危漏洞。

2、漏洞危害
利用這個漏洞攻擊者可以執行服務器上的命令。

3、修復建議
1) 嚴格檢查程序參數,特別是 "&", "&&", "|", "||"。
2)  在代碼中去除system等直接命令行執行函數或者禁止把外部傳入參數傳入到該類可執行函數的參數中。

4、修復實例參考
ASP漏洞代碼示例
<%
Dim cmd
Set cmd=Request.QueryString("cmd")
response.write server.createobject("wscript.shell").exec("cmd.exe /c "&cmd).stdout.readall
%>


ASP修復範例
<%
Dim cmd
Set cmd=Request.QueryString("cmd")
if cmd == "dir" then
         response.write server.createobject("wscript.shell").exec("cmd.exe /c "&  "dir").stdout.readall
end if
%>


PHP漏洞代碼示例
<%php
$myvar = "varname";
$x = $_GET['arg'];
// 默認通過url傳入ls -al 進行執行
system($x);
%>


PHP修復範例
<%php
$myvar = "varname";
$x = $_GET['arg'];
// 默認通過url傳入ls -al 進行執行
if($x=='/bin/ls -al'){
    system('/bin/ls -al');
}else{
    return;
}
%>


Remote File Inclusion
1、漏洞描述
遠程文件包含是指程序代碼在處理包含文件的時候沒有嚴格控制。導致用戶可以構造參數包含遠程代碼在服務器上執行,進而獲取到服務器權限,造成網站被惡意刪除,用戶和交易數據被篡改等一系列惡性後果。

2、漏洞危害
攻擊着可以利用該漏洞,在服務器上執行命令。

3、修復建議
對於PHP,建議配置php.ini關閉遠程文件包含功能。E.g. allow_url_include = Off

4、修復實例參考

PHP漏洞代碼示例:
<?php
$path=$_GET['arg'];
include $path.'/filename.php';
?>



修復範例:

<?php
$path='/var/www/html/common.inc';
include $path.'/filename.php';
?>

或者:在php.ini中進行如下配置:
allow_url_fopen=off
allow_url_include=off



Path Traversal
1、漏洞描述
目錄遍歷指的是應用程序對文件路徑沒有檢查導致服務器上的敏感文件/代碼泄漏。

2、漏洞危害
可能會導致源代碼等敏感信息泄露。

3、修復建議
嚴格檢查文件路徑參數,限制在指定的範圍。嚴格限制文件路徑參數,不允許用戶控制文件路徑相關的參數,限定文件路徑範圍。

4、修復實例參考

ASP漏洞代碼示例:

<%
Dim FileName
FileName = Request.QueryString("FileName")
Response.Clear
Response.ContentType = "application/octet-stream"
Response.AddHeader "content-disposition", "attachment; filename=" & FileName
Set Stream = server.CreateObject("ADODB.Stream")
Stream.Type = 1
Stream.Open
Stream.LoadFromFile Server.MapPath(FileName)
While Not Stream.EOS
Response.BinaryWrite Stream.Read(1024 * 64)
Wend
Stream.Close
Set Stream = Nothing
Response.Flush
Response.End
%>


ASP修復範例:
<%
Dim FileName
FileId = Request.QueryString("FileId")
FileName = GetFileNameByID(FileId)
Response.Clear
Response.ContentType = "application/octet-stream"
Response.AddHeader "content-disposition", "attachment; filename=" & FileName
Set Stream = server.CreateObject("ADODB.Stream")
Stream.Type = 1
Stream.Open
Stream.LoadFromFile Server.MapPath(FileName)
While Not Stream.EOS
Response.BinaryWrite Stream.Read(1024 * 64)
Wend
Stream.Close
Set Stream = Nothing
Response.Flush
Response.End
%>


PHP修復規範:
在php.ini中進行如下配置:
open_basedir = 服務器上WEB目錄的路徑(注,路徑最後需要加上斜槓作爲結束),如:open_basedir = /var/www/html/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章