Web SQL注入攻擊的危害性
Web安全紛繁復(fù)雜,危害最嚴(yán)重的當(dāng)屬SQL注入。SQL Injection,中文名稱(chēng)為“SQL 注入”是一種數(shù)據(jù)庫(kù)攻擊手段,也是WEB應(yīng)用程序漏洞存在的一種表現(xiàn)形式,它的實(shí)際意義就是利用某些數(shù)據(jù)庫(kù)的外部接口把用戶(hù)數(shù)據(jù)插入到實(shí)際的數(shù)據(jù)庫(kù)操作語(yǔ)言當(dāng)中,從而達(dá)到入侵?jǐn)?shù)據(jù)庫(kù)乃至操作系統(tǒng)的目的。
SQL Injection 的主要形式是,直接將代碼插入與 SQL 命令串聯(lián)并執(zhí)行的用戶(hù)輸入變量中,間接的將惡意代碼注入要在表中存儲(chǔ)或作為元數(shù)據(jù)存儲(chǔ)的字符串,在存儲(chǔ)的字符串隨后串連到一個(gè)動(dòng)態(tài) SQL 命令中時(shí),執(zhí)行該惡意代碼。基本的攻擊是提前終止文本字符串,然后追加一個(gè)新的命令。由于插入的命令可能在執(zhí)行前追加其他字符串,因此攻擊者將用注釋標(biāo)記“??”來(lái)中止注入的字符串。執(zhí)行時(shí),此后的指令將被忽略.
SQL Injection 攻擊技術(shù)就起本質(zhì)而言,它利用的工具是SQL的語(yǔ)法,針對(duì)的是應(yīng)用程序開(kāi)發(fā)者編程中的漏洞,當(dāng)攻擊者能操作數(shù)據(jù),向應(yīng)用程序中插入一些SQL語(yǔ)句時(shí),SQL Injection攻擊就發(fā)生了。實(shí)際上,SQL Injection攻擊是存在于常見(jiàn)的多連接的應(yīng)用程序中的一種漏洞,攻擊者通過(guò)在應(yīng)用程序預(yù)先定義好的查詢(xún)語(yǔ)句結(jié)尾加上額外的SQL語(yǔ)句元素,欺騙數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行非授權(quán)的任意查詢(xún)。這類(lèi)應(yīng)用程序一般是Web Application,它允許用戶(hù)輸入查詢(xún)條件,并將查詢(xún)條件嵌入SQL 語(yǔ)句中,提交到數(shù)據(jù)庫(kù)中執(zhí)行。通過(guò)構(gòu)造畸形SQL語(yǔ)句攻擊者能夠獲取額外的信息數(shù)據(jù)。
就風(fēng)險(xiǎn)而言,SQL Injection攻擊也是位居前列,和緩沖區(qū)溢出漏洞相 比,其優(yōu)勢(shì)在于能夠輕易的繞過(guò)防火墻直接訪問(wèn)數(shù)據(jù)庫(kù),甚至能夠獲得數(shù)據(jù)庫(kù)所在的服務(wù)器的訪問(wèn)權(quán)限。在某些環(huán)境下,SQL Injection 漏洞的風(fēng)險(xiǎn)要高過(guò)
其他所有的漏洞。SQL Injection攻擊利用的是SQL 語(yǔ)法,這使得這種攻擊具有廣泛性。特點(diǎn)鮮明:
隱蔽性強(qiáng)
利用Web漏洞發(fā)起對(duì)WEB應(yīng)用的攻擊紛繁復(fù)雜,包括SQL 注入,跨站腳本攻擊等等,一個(gè)共同特點(diǎn)是隱蔽性強(qiáng),不易發(fā)覺(jué),因?yàn)橐环矫嫫胀ňW(wǎng)絡(luò)防火墻是對(duì)HTTP/HTTPS全開(kāi)放的,另一方面,對(duì)Web應(yīng)用攻擊的變化非常多,傳統(tǒng)的基于
特征檢測(cè)的IDS對(duì)此類(lèi)攻擊幾乎沒(méi)有作用。
攻擊時(shí)間短
可在短短幾秒到幾分鐘內(nèi)完成一次數(shù)據(jù)竊取、一次木馬種植、完成對(duì)整個(gè)數(shù)據(jù)庫(kù)或Web服務(wù)器的控制,以至于非常困難作出人為反應(yīng)。
危害性大
南昌網(wǎng)站建設(shè)公司百恒網(wǎng)絡(luò)認(rèn)為目前幾乎所有銀行,證券,電信,移動(dòng),政府以及電子商務(wù)企業(yè)都提供在線交易,查詢(xún)和交互服務(wù)。用戶(hù)的機(jī)密信息包括賬戶(hù),個(gè)人私密信息(如身份證),交易信息等等,都是通過(guò)Web存儲(chǔ)于后臺(tái)數(shù)據(jù)庫(kù)中, 這樣,在線服務(wù)器一旦癱瘓,或雖在正常運(yùn)行,但后臺(tái)數(shù)據(jù)已被篡改或者竊取, 都將造成企業(yè)或個(gè)人巨大的損失。據(jù)權(quán)威部門(mén)統(tǒng)計(jì),目前身份失竊(identity theft)已成為全球最嚴(yán)重的問(wèn)題之一。
非常嚴(yán)重的有形和無(wú)形損失
目前,包括政府以及很多大型企業(yè)尤其是在國(guó)內(nèi)外上市的企業(yè), 一旦發(fā)生這類(lèi)安全事件,必將造成人心惶惶,名譽(yù)掃地,以致于造成經(jīng)濟(jì)和聲譽(yù)上的巨大損失,即便不上市,其影響和損失也是不可估量的。
防SQL注入的例子
Asp程序
關(guān)于Asp程序防Sql注入,南昌網(wǎng)絡(luò)公司百恒網(wǎng)絡(luò)建議:強(qiáng)制類(lèi)型轉(zhuǎn)換,下為過(guò)濾整個(gè)整形數(shù)據(jù)變量
nId = cint(request("id"))
sql = "select * from user where id=" + cstr(nId)
Asp.NET程序
利用參數(shù)方式查詢(xún)和SqlParameter參數(shù),來(lái)杜絕SQL 注入型式。
strUid = Request.QueryString["uid"].Trim();
strSql = "SELECT * FROM [users] WHERE [uid]=@uid";
sqlParameter = new SqlParameter("@uid", SqlDbType.VarChar);
sqlParameter.Value = strUid;
sqlCommand.Parameters.Add(sqlParameter);
sqlDataReader = sqlCommand.ExecuteReader();
strUid = Request.QueryString["uid"].Trim();
strSql = "SELECT * FROM [users] WHERE [uid]=@uid";
sqlCommand = new SqlCommand(strSql, sqlConnection);
sqlParameter = new SqlParameter("@uid", SqlDbType.VarChar);
sqlParameter.Value = strUid;
sqlCommand.Parameters.Add(sqlParameter);
sqlDataReader = sqlCommand.ExecuteReader();
strUid = Integer.Parse(Request.QueryString["uid"].Trim());
strSql = "SELECT * FROM [users] WHERE [uid]=@uid";
sqlCommand = new SqlCommand(strSql, sqlConnection);
sqlParameter = new SqlParameter("@uid", SqlDbType.Int);
sqlParameter.Value = strUid;
sqlCommand.Parameters.Add(sqlParameter);
sqlDataReader = sqlCommand.ExecuteReader();
Dim SSN as String = Request.QueryString("SSN")
Dim cmd As new SqlCommand("SELECT au_lname, au_fname FROM authors
WHERE au_id = @au_id")
Dim param = new SqlParameter("au_id", SqlDbType.VarChar)
param.Value = SSN
cmd.Parameters.Add(param)