按問題類型分類的問題
- 使用 SQL 注入的認證旁路2
- 已解密的登錄請求3
- 登錄錯誤消息憑證枚舉1
- 會話標識未更新2
- 跨站點請求偽造1
- Missing "Content-Security-Policy" header 9
- Missing "X-Content-Type-Options" header 9
- Missing "X-XSS-Protection" header 9
- 查詢中接受的主體參數1
- 啟用了 Microsoft ASP.NET 調試2
- 缺少跨幀腳本編制防御1
- 已解密的 __VIEWSTATE 參數1
- 檢測到應用程序測試腳本1
- 應用程序錯誤9
- 整數溢出3
問題修復
1.使用 SQL 注入的認證旁路
答: 登錄、注冊頁面輸入信息,過濾sql關鍵字或關鍵字符;
提交表單頁面、查詢頁面的輸入項,過濾sql關鍵字或關鍵字符。
// 關鍵字
string StrKeyWord = @"select|insert|delete|from|count\(|drop table|update|truncate|asc\(|mid\(|char\(|xp_cmdshell|exec master|netlocalgroup administrators|:|net user|""|or|and";
//關鍵字符
string StrRegex = @"[-|;|,|/|\(|\)|\[|\]|}|{|%|\@|*|!|']";
最佳的解決方法是 參數化查詢,防止sql注入漏洞攻擊。
2.已解密的登錄請求
答:一種說法是使用SSL證書,暫時沒有解決。
3.登錄錯誤消息憑證枚舉
答:用戶登錄時,如果輸入錯誤的用戶信息,最好提示同一個錯誤消息提醒,比如:你的用戶名或密碼輸入錯誤。提供枚舉提示,容易被暴力破解。
4.會話標識未更新
答:登錄之后更改會話標識符,主要用於登錄頁面。
參考方案: http://www.2cto.com/Article/201302/190228.html 測試沒有效果
http://blog.itpub.net/12639172/viewspace-441971/ 測試ok
在登錄頁面,添加紅線加粗部分
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Session.Abandon();
//清除SessionId
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
txt_Fileld1.Focus();
}
}
5.跨站點請求偽造
答:每個頁面請求時,判斷主機和端口與配置文件信息是否一致。
網上參考方法:
1,利用referer判斷,
但是用戶有可能設置瀏覽器使其在發送請求時不提供 Referer,這樣的用戶也將不能訪問網站。
2,在請求中添加 token 並驗證
關鍵在於在請求中放入黑客所不能偽造的信息,並且該信息不存在於 cookie 之中,
可以在服務器端生成一個隨機碼,然后放在form的hidden元素中,form提交的時候在服務器端檢查。
6.Missing "Content-Security-Policy" header
答: 在web.config 配置文件中添加如下響應頭
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Content-Type-Options" value="nosniff"/>
<add name="X-XSS-Protection" value="1;mode=block"/>
<add name="X-Frame-Options" value="SAMEORIGIN"/>
<add name="Content-Security-Policy" value="default-src 'self'"/>
</customHeaders>
</httpProtocol>
</system.webServer>
7.Missing "X-Content-Type-Options" header
答: 在web.config 配置文件中添加如下響應頭,添加節點見 第6 個問題
<add name="X-Content-Type-Options" value="nosniff"/>
8.Missing "X-XSS-Protection" header
答: 在web.config 配置文件中添加如下響應頭,添加節點見 第6 個問題
<add name="X-XSS-Protection" value="1;mode=block"/>
9.查詢中接受的主體參數
答:未解決
10.啟用了 Microsoft ASP.NET 調試
答:應用程序發布后,修改配置文件節點compilation 的屬性 debug為 false。
<compilation debug="false" targetFramework="4.0"/>
11.缺少跨幀腳本編制防御
答:在web.config 配置文件中添加如下響應頭,添加節點見 第6 個問題
<add name="Content-Security-Policy" value="default-src 'self'"/>
注意,添加之后,可能會出現不同瀏覽器,出現兼容性問題,會有不同的反應。比如,極速模式會出現頁面內部css無效。
12.已解密的 __VIEWSTATE 參數
答:在web.config 配置文件中添加 pages 的屬性viewStateEncryptionMode 為Always。
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" viewStateEncryptionMode="Always" />
13.檢測到應用程序測試腳本
答: 在系統開發過程中,添加的測試頁面,在程序發布前需要“從項目中排除”后再發布。
14.應用程序錯誤
答:出現應用程序錯誤頁面。
如 :Server Error in '/' Application.
一是解決屬於開發人員的應用程序錯誤問題,二是在配置文件添加默認出錯頁面
<customErrors mode="On" defaultRedirect="~/error.html" />
15.整數溢出
答:情況一:針對請求的url中的參數, 檢查其數據類型及邊界范圍。
如 /ApplyShow.aspx?id=99999999999999999999
情況二:登錄頁面按鈕參數,在請求正文里,未找到原因???
http://localhost:83/login.aspx 實體: ImgbtnDl.y (Parameter)
16.WebResource.axd
WebResources.axd?d=xyz。
WebResource.axd有一個特點,便是會對錯誤的密文(即d=xyz中的xyz)產生500錯誤,而對正確的密文產生404錯誤,這便形成了足夠的提示
參考資料:
http://www.2cto.com/Article/201009/75162.html
http://pan.baidu.com/share/link?shareid=3851057069&uk=2164275402
http://www.cnblogs.com/JeffreyZhao/archive/2010/09/25/things-about-padding-oracle-vulnerability-in-asp-net.html
http://www.cnblogs.com/shanyou/archive/2010/09/25/1834889.html Padding Oracle Attack 檢測工具
解決方法: http://www.cnblogs.com/shanyou/archive/2010/09/24/1833757.html 中文版
http://weblogs.asp.net/scottgu/important-asp-net-security-vulnerability 英文版
步驟一.添加配置節點
.net 3.5 及以前版本,添加配置節點
<customErrors mode="On" defaultRedirect="~/error.html" />
.net 3.5 SP1 或 .net 4.0添加如下配置節點,注意加粗部分必須
<customErrors mode="On" defaultRedirect="~/error.aspx" redirectMode="ResponseRewrite" />
步驟二.添加默認錯誤頁面
<%@ Page Language="C#" AutoEventWireup="true" %> <%@ Import Namespace="System.Security.Cryptography" %> <%@ Import Namespace="System.Threading" %> <script runat="server"> void Page_Load() { byte[] delay = new byte[1]; RandomNumberGenerator prng = new RNGCryptoServiceProvider(); prng.GetBytes(delay); Thread.Sleep((int)delay[0]); IDisposable disposable = prng as IDisposable; if (disposable != null) { disposable.Dispose(); } } </script> <html> <head runat="server"> <title>Error</title> </head> <body> <div> An error occurred while processing your request. </div> </body> </html>
如果誰有更好的解決方法 ,謝謝提供!