本文檔主要介紹WEB安全漏洞和解決方法。
1. SQL注入漏洞
漏洞描述
SQL注入攻擊(SQL Injection),簡稱注入攻擊、SQL注入,被廣泛用于非法擷取網站控制權,是發生在應用程式的資料庫層上的安全漏洞。 在設計不良的程式當中,忽略了對輸入字元串中夾帶的SQL指令的檢查,那麼這些夾帶進去的指令就會被資料庫誤認為是正常的SQL指令而運作,進而使資料庫受到攻擊,可能導緻資料被竊取、更改、删除,以及進一步導緻網站被嵌入惡意代碼、被植入後門程式等危害。
漏洞危害
使 1) 機密資料被竊取;2) 核心業務資料被篡改;3) 網頁被篡改;4) 資料庫所在伺服器被攻擊變為傀儡主機,甚至企業網被入侵。
潛在危險等級:高
解決方案
1) 所有的查詢語句都使用資料庫提供的參數化查詢接口,參數化的語句使用參數而不是将使用者輸入變量嵌入到SQL語句中。
2) 對進入資料庫的特殊字元('"\<>&*;等)進行轉義處理,或編碼轉換。
3) 确認每種資料的類型,比如數字型的資料就必須是數字,資料庫中的存儲字段必須對應為int型。
4) 資料長度應該嚴格規定,能在一定程度上防止比較長的SQL注入語句無法正确執行。
5) 網站每個資料層的編碼統一,建議全部使用UTF-8編碼,上下層編碼不一緻有可能導緻一些過濾模型被繞過。
6) 嚴格限制網站所用資料庫賬号的權限,給此使用者僅提供能夠滿足其工作的權限,進而最大限度的減少注入攻擊對資料庫的危害。
7) 避免網站顯示SQL錯誤資訊,比如類型錯誤、字段不比對等,防止攻擊者利用這些錯誤資訊進行一些判斷。
代碼示例
【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漏洞代碼示例】
$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修複示例】
$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));
?>
【JAVA漏洞代碼示例】
JdbcConnection conn = new JdbcConnection();
final String sql = "select * from product where pname like '%"
+ request.getParameter("pname") + "%'";
conn.execqueryResultSet(sql);
【JAVA修複示例】
JdbcConnection conn = new JdbcConnection();
PreparedStatement pstmt = conn.prepareStatement("select * from product where pname like ?";
pstmt.setString(1, “%”+ request.getParameter("pname")+”%”);
pstmt.execute();
2. 跨站腳本(XSS)漏洞
漏洞描述
跨站腳本攻擊(Cross-site scripting,通常簡稱為XSS)發生在用戶端,可被用于進行竊取隐私、釣魚欺騙、偷取密碼、傳播惡意代碼等攻擊行為。 惡意的攻擊者将對用戶端有危害的代碼放到伺服器上作為一個網頁内容, 使得其他網站使用者在觀看此網頁時,這些代碼注入到了使用者的浏覽器中執行,使使用者受到攻擊。一般而言,利用跨站腳本攻擊,攻擊者可竊會話COOKIE進而竊取網站使用者的隐私。
漏洞危害
1) 釣魚欺騙:最典型的就是利用目标網站的反射型跨站腳本漏洞将目标網站重定向到釣魚網站,或者注入釣魚JavaScript以監控目标網站的表單輸入,甚至發起基于DHTML更進階的釣魚攻擊方式。
2) 網站挂馬:跨站時利用IFrame嵌入隐藏的惡意網站或者将被攻擊者定向到惡意網站上,或者彈出惡意網站視窗等方式都可以進行挂馬攻擊。
3) 身份盜用:Cookie是使用者對于特定網站的身份驗證标志,XSS可以盜取到使用者的Cookie,進而利用該Cookie盜取使用者對該網站的操作權限。如果一個網站管理者使用者Cookie被竊取,将會對網站引發巨大的危害。
4) 盜取網站使用者資訊:當能夠竊取到使用者Cookie進而擷取到使用者身份使,攻擊者可以擷取到使用者對網站的操作權限,進而檢視使用者隐私資訊。
5) 垃圾資訊發送:比如在SNS社群中,利用XSS漏洞借用被攻擊者的身份發送大量的垃圾資訊給特定的目标群。
6) 劫持使用者Web行為:一些進階的XSS攻擊甚至可以劫持使用者的Web行為,監視使用者的浏覽曆史,發送與接收的資料等等。
7) XSS蠕蟲:XSS 蠕蟲可以用來打廣告、刷流量、挂馬、惡作劇、破壞網上資料、實施DDoS攻擊等。
潛在危險等級:高
解決方案
對參數做html轉義過濾(要過濾的字元包括:單引号、雙引号、大于号、小于号,&符号),防止腳本執行。在變量輸出時進行HTML ENCODE 處理。
PHP應用,可以使用htmlspecialchars對使用者參數進行編碼
ASP.net應用,可以使用HTMLEnCode 或AntiXSS
JAVA應用,可以使用org.apache.commons.lang.StringEscapeUtils提供的Escape函數
代碼示例
【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問題代碼示例】
$aa=$_GET['dd'];
echo $aa."123";
?>
【PHP修複示例】
$aa=$_GET['dd'];
echo htmlspecialchars($aa)."123";
?>
3. HTTP header注入漏洞
漏洞描述
Web程式代碼中把使用者送出的參數未做過濾就直接輸出到HTTP響應頭中,導緻攻擊者可以利用該漏洞來注入到HTTP響應頭中,造成xss攻擊、欺騙使用者下載下傳惡意可執行檔案等攻擊。
潛在危險等級:高
修複建議
1)對參數做合法性校驗以及長度限制,謹慎的根據使用者所傳入參數做http響應的header設定;
2) 在設定HTTP響應頭時,過濾回車換行(%0d%0a、%0D%0A)字元;
4. 目錄周遊漏洞
漏洞描述
目錄周遊(或路徑周遊)(directory traversal/path traversal)是由于Web伺服器或Web應用程式對使用者輸入檔案名稱的安全性驗證不足而導緻的一種安全漏洞,使得攻擊者通過HTTP請求和利用一些特殊字元就可以繞過伺服器的安全限制,通路任意受限的檔案(可以是Web根目錄以外的檔案),甚至執行系統指令。
潛在危險等級:高
解決方案
嚴格檢查檔案路徑參數,限制在指定的範圍。嚴格限制檔案路徑參數,不允許使用者控制檔案路徑相關的參數,限定檔案路徑範圍。
5. 檔案包含漏洞
漏洞描述
檔案包含是指程式代碼在處理包含檔案的時候沒有嚴格控制。導緻使用者可以構造參數包含遠端代碼在伺服器上執行,進而擷取到伺服器權限,造成網站被惡意删除,使用者和交易資料被篡改等一系列惡性後果。
漏洞危害
攻擊者可以利用該漏洞,在伺服器上執行任意指令。
潛在危險等級:高
解決方案:
PHP:配置php.ini關閉遠端檔案包含功能(allow_url_include = Off)
代碼示例
【PHP問題代碼示例】
$path=$_GET['arg'];
include $path.'/filename.php';
?>
【PHP修複示例】
$path='/var/www/html/common.inc';
include $path.'/filename.php';
?>
6.任意檔案下載下傳漏洞
漏洞描述
Web應用程式在處理檔案下載下傳時,接受使用者指定的路徑和檔案名進行下載下傳,攻擊者利用此漏洞來下載下傳伺服器的其它檔案甚至任意檔案(源代碼、資料庫甚至passwd等)。
潛在危險等級:高
修複建議
1. 限制可下載下傳檔案所在的目錄為預期範圍;
2. 通過指定檔案編号的方式來定位待下載下傳檔案。
7.檔案上傳漏洞
漏洞描述
檔案上傳的Web程式未對檔案類型和格式做合法性校驗,導緻攻擊者可以上傳Webshell或者非期望格式的檔案
潛在危險等級:高
修複建議
1)對上傳檔案的大小和類型進行校驗,定義上傳檔案類型白名單;
2)儲存上傳檔案的目錄不提供直接通路;
代碼示例
【PHP問題代碼示例】
if ($_FILES["file"]["error"] > 0)
echo "Error: " . $_FILES["file"]["error"] . "
";
else
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
【PHP修複示例】
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
echo "Error: " . $_FILES["file"]["error"] . "
";
else
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
}
else
echo "Invalid file";
後續見下篇