殷茵 馬嫚紅 秦久明 石范鋒
摘要:該文主要研究了基于asp.net動(dòng)態(tài)網(wǎng)站前臺(tái)程序設(shè)計(jì)中的SQL注入漏洞和XSS攻擊漏洞,提出了在開(kāi)發(fā)基于asp.net動(dòng)態(tài)網(wǎng)站前臺(tái)程序設(shè)計(jì)時(shí)防止SQL注入攻擊和XSS跨站攻擊的方法和措施。
關(guān)鍵詞:SQL注入漏洞;XSS注入漏洞;防御;前臺(tái)程序;安全性
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)12-0060-02
隨著Internet發(fā)展,Web應(yīng)用程序的應(yīng)用越來(lái)越廣泛,由于應(yīng)用程序的運(yùn)行環(huán)境的開(kāi)放性,隨之出現(xiàn)的安全性隱患和風(fēng)險(xiǎn)也越來(lái)越高,一些針對(duì)動(dòng)態(tài)網(wǎng)站的攻擊技術(shù)也“與時(shí)俱進(jìn)”。目前常見(jiàn)的針對(duì)動(dòng)態(tài)網(wǎng)站攻擊行為主要有SQL注入攻擊、XSS跨站腳本攻擊等。
1 SQL注入攻擊和防御
SQL注入攻擊是指從客戶端地址欄或網(wǎng)頁(yè)的接口輸入提交一些特殊的非法代碼,讓其注入到服務(wù)器端正常執(zhí)行的業(yè)務(wù)SQL中去,從而改變SQL語(yǔ)句的原有邏輯,獲取重要的敏感數(shù)據(jù),繞過(guò)登錄驗(yàn)證,甚至執(zhí)行系統(tǒng)命令,上傳后門文件等行為。由于SQL注入從正常Web端口訪問(wèn),一般防火墻不會(huì)阻擋和警告,Web系統(tǒng)可能被入侵而長(zhǎng)時(shí)間不會(huì)被發(fā)現(xiàn)。理論上只要是帶有查詢字符串變量參數(shù)的動(dòng)態(tài)網(wǎng)頁(yè)且此網(wǎng)頁(yè)訪問(wèn)數(shù)據(jù)庫(kù),如果Web應(yīng)用程序中沒(méi)有對(duì)輸入?yún)?shù)進(jìn)行必要的合法檢查和過(guò)濾,就有可能成為SQL注入攻擊漏洞。
1.1 SQL注入點(diǎn)判斷
URL查詢參數(shù)為整數(shù)型,地址為:http://www.abc.com/News.aspx?NewId=1,可通過(guò)以下方法查看有沒(méi)有SQL注入漏洞:
1)在地址欄中輸入http://www.abc.com/News.aspx?NewId=1,運(yùn)行異常;
2)在地址欄中輸入http://www.abc.com/News.aspx?NewId=1 and 1=1,運(yùn)行正常;
3)在地址欄中輸入http://www.abc.com/News.aspx?NewId=1 and 1=2,運(yùn)行異常;
可以判斷存在SQL注入漏洞。
URL查詢參數(shù)為字符串型,地址為:http://www.abc.com/News.aspx?NewId=1,可通過(guò)以下方法查看有沒(méi)有SQL注入漏洞:
1)在地址欄中輸入http://www.abc.com/News.aspx?NewId=1,運(yùn)行異常;
2)在地址欄中輸入http://www.abc.com/News.aspx?NewId=1 and ‘1=1,運(yùn)行正常;
3)在地址欄中輸入http://www.abc.com/News.aspx?NewId=1 and ‘1=2,運(yùn)行異常。
可以判斷存在SQL注入漏洞。
1.2 SQL注入攻擊
利用SQL注入漏洞,通過(guò)在查詢字符串參數(shù)加上特殊的Select查詢語(yǔ)句可查看管理員表的信息。
1)獲取管理員表名方法
http://www.abc.com/News.aspx?NewId=1 and 1=1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 from [表名],如正常執(zhí)行,就可獲取表名;
2)獲取管理員表中字段名和字段值
http://www.abc.com/News.aspx?NewId=1 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 from [表名],如正常執(zhí)行,就會(huì)在原來(lái)頁(yè)面正常顯示動(dòng)態(tài)信息的地方顯示上述對(duì)應(yīng)的數(shù)字,然后將對(duì)應(yīng)的數(shù)字換成猜測(cè)的字段名即可。
1.3 SQL注入防御
在開(kāi)發(fā)Web應(yīng)用程序時(shí),查詢字符串變量參數(shù)最好使用數(shù)值型,對(duì)輸入的內(nèi)容要進(jìn)行必要的合法性檢查驗(yàn)證,可根據(jù)查詢語(yǔ)句參數(shù)的類型,如果是數(shù)值型可通過(guò)數(shù)據(jù)類型轉(zhuǎn)換方法驗(yàn)證,如出錯(cuò)則跳轉(zhuǎn)到出錯(cuò)頁(yè);如果是字符串型查詢參數(shù)則應(yīng)要過(guò)濾一些敏感的字符,并作為Command命令對(duì)象的參數(shù)值使用。應(yīng)盡量使用Session傳遞參數(shù),對(duì)查詢字符串變量最好定義專用類或由空頁(yè)處理后再轉(zhuǎn)到相關(guān)的頁(yè)面,處理方法如下述代碼所示:
int i=0;
if (Request["NewsID"] != null)
{
try
{ i = int.Parse(Request["NewsID "].ToString());
Session["nid"] = i.ToString();
}
catch
{ Response.Redirect("~/Error.aspx");
}
if (i > 0)
{ Response.Redirect("~/NewsShow.aspx");
}
} else
{
Response.Redirect("~/Error.aspx");
}
2 XSS注入漏洞和防御
XSS即跨站腳本攻擊,是指通過(guò)向Web頁(yè)面里插入惡意腳本代碼,當(dāng)用戶瀏覽該頁(yè)時(shí),嵌入其中腳本代碼就自動(dòng)執(zhí)行,從而達(dá)到惡意用戶的目的,例如,自動(dòng)打開(kāi)和發(fā)送有關(guān)頁(yè),盜取會(huì)話、cookie信息等。
2.1 XSS注入攻擊
Web應(yīng)用程序中假如有用戶注冊(cè)、留言等功能,如果沒(méi)有對(duì)輸入和輸出的信息進(jìn)行合法性驗(yàn)證和過(guò)濾就有可能成為XSS注入攻擊點(diǎn)。
例如通過(guò)用戶注冊(cè)或留言向網(wǎng)站數(shù)據(jù)庫(kù)中輸入如下腳本代碼:
alert('hello');
當(dāng)用戶打開(kāi)含有此腳本的頁(yè)面時(shí),腳本就自動(dòng)執(zhí)行,打開(kāi)另一網(wǎng)站的頁(yè)面,并將保存在本地的此網(wǎng)站的Cookie發(fā)送過(guò)去。如果inputcookie.aspx的頁(yè)面中含有接收cookie并存放到數(shù)據(jù)庫(kù)的功能,就非法獲取了用戶的Cookie信息。inputcookie.aspx頁(yè)面的代碼如下:
if (Request.Cookies[0] != null)
{ string connstr = ConfigurationManager.ConnectionStrings["cookiename"].ConnectionString;
connstr = connstr +Server.MapPath( ConfigurationManager.ConnectionStrings["cookiedb"].ConnectionString);
string sqlstr = "insert into testtable(cookie) values(?)";
OleDbConnection conn = new OleDbConnection(connstr);
OleDbCommand comm = new OleDbCommand(sqlstr, conn);
OleDbParameter p = new OleDbParameter("@c", Request.Cookies[0].Value.ToString());
comm.Parameters.Add(p);
try
{
conn.Open();
comm.ExecuteNonQuery();}
catch
{ ; }
if (conn.State == ConnectionState.Connecting)
{ conn.Close();}}
2.2 XSS注入防御
Asp.net 1.1后頁(yè)面具備了對(duì)表單自動(dòng)檢測(cè)是否存在XSS漏洞的能力,當(dāng)提交如
string str = "123abc;";
str=str.Replace("", "b11");
str=str.Replace("
", "b12");
str=Server.HtmlEncode(str);
str=str.Replace( "b11","");
str=str.Replace("b12", "
");
Label1.Text = str;
在程序中,過(guò)濾掉敏感的html標(biāo)簽,例如:
、