隨著當(dāng)今世界網(wǎng)絡(luò)技術(shù)與信息技術(shù)高速發(fā)展壳贪,Web應(yīng)用程序具有界面統(tǒng)一窑睁,使用簡(jiǎn)單述呐,易于維護(hù)试浙,擴(kuò)展性好,共享度高等優(yōu)先物舒。Web應(yīng)用程序已經(jīng)被應(yīng)用到生活中的各個(gè)角落晚唇。但Web應(yīng)用建立在廣域網(wǎng)上嗅战,對(duì)安全的控制能力較弱。且開(kāi)發(fā)人員的水平和經(jīng)驗(yàn)參差不齊净赴,相當(dāng)一部分的程序員在編寫(xiě)代碼時(shí)沒(méi)有對(duì)用戶的輸入數(shù)據(jù)或者頁(yè)面中所攜帶的信息進(jìn)行必要的合法性判斷绳矩。攻擊者利用這個(gè)機(jī)會(huì)提交一段數(shù)據(jù)庫(kù)查詢代碼,根據(jù)程序返回的結(jié)果玖翅,就可以獲得一些數(shù)據(jù)庫(kù)信息翼馆。
現(xiàn)在通用的數(shù)據(jù)庫(kù)管理系統(tǒng)都有一些工具和功能組件,可以直接與操作系統(tǒng)及網(wǎng)絡(luò)進(jìn)行連接這無(wú)疑給我們提供了很多便利金度。但是當(dāng)攻擊者通過(guò)SQL注入攻擊一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)应媚,去危害就不只局限于存儲(chǔ)在數(shù)據(jù)庫(kù)中數(shù)據(jù),攻擊者還可以設(shè)法獲得對(duì)DBMS所有的主機(jī)進(jìn)行交互式訪問(wèn)猜极,使其危害從數(shù)據(jù)庫(kù)向操作系統(tǒng)中姜、甚至整個(gè)網(wǎng)絡(luò)蔓延。因此魔吐,我不僅應(yīng)當(dāng)將SQL注入攻擊看作是一個(gè)對(duì)存儲(chǔ)在數(shù)據(jù)庫(kù)上數(shù)據(jù)的威脅扎筒,而應(yīng)當(dāng)看作是對(duì)整個(gè)網(wǎng)絡(luò)的威脅莱找。
基于SQL注入攻擊的應(yīng)用現(xiàn)狀存在的一些漏洞進(jìn)行簡(jiǎn)單分析酬姆,同時(shí)將提出一些防御對(duì)策,以便web應(yīng)用程序在使用簡(jiǎn)單奥溺,易于維護(hù)的同時(shí)辞色,提高其安全性與可擴(kuò)張性。
一浮定、網(wǎng)絡(luò)攻擊技術(shù)
網(wǎng)絡(luò)攻擊所屬現(xiàn)代詞相满,指的是利用網(wǎng)絡(luò)存在的漏洞和安全缺陷對(duì)網(wǎng)絡(luò)系統(tǒng)的硬件、軟件及其系統(tǒng)中的數(shù)據(jù)進(jìn)行的攻擊桦卒。
(二)網(wǎng)絡(luò)攻擊趨勢(shì)
1立美、自動(dòng)化程度和攻擊速度提高。隨著分布式攻擊工具的出現(xiàn)方灾,攻擊者可以管理和協(xié)調(diào)分布在許多Internet系統(tǒng)上的大量已部署的攻擊工具建蹄。目前,分布式攻擊工具能夠更有效地發(fā)動(dòng)拒絕服務(wù)攻擊裕偿,掃描潛在的受害者洞慎,危害存在安全隱患的系統(tǒng)。
2嘿棘、攻擊工具越來(lái)越復(fù)雜劲腿。攻擊工具越來(lái)越普遍地被開(kāi)發(fā)為可在多種操作系統(tǒng)平臺(tái)上執(zhí)行。許多常見(jiàn)攻擊工具使用IRC或HTTP等協(xié)議鸟妙,從入侵者那里向受攻擊的計(jì)算機(jī)發(fā)送數(shù)據(jù)或命令焦人,使得人們將攻擊特性與正常挥吵、合法的網(wǎng)絡(luò)傳輸流區(qū)別開(kāi)變得越來(lái)越困難。
3垃瞧、發(fā)現(xiàn)安全漏洞越來(lái)越快蔫劣。
4、越來(lái)越高的防火墻滲透率个从。防火墻是人們用來(lái)防范入侵者的主要保護(hù)措施脉幢。但是越來(lái)越多的攻擊技術(shù)可以繞過(guò)防火墻,例如嗦锐,IPP(Internet打印協(xié)議)和WebDAV(基于Web的分布式創(chuàng)作與翻譯)都可以被攻擊者利用來(lái)繞過(guò)防火墻嫌松。
5、越來(lái)越不對(duì)稱(chēng)的威脅奕污。由于攻擊技術(shù)的進(jìn)步萎羔,一個(gè)攻擊者可以比較容易地利用分布式系統(tǒng),對(duì)一個(gè)受害者發(fā)動(dòng)破壞性的攻擊碳默。隨著部署自動(dòng)化程度和攻擊工具管理技巧的提高贾陷,威脅的將繼續(xù)增加。
6嘱根、對(duì)基礎(chǔ)設(shè)施將形成越來(lái)越大的威脅髓废。用戶越來(lái)越多地依賴Internet完成日常業(yè)務(wù),基礎(chǔ)設(shè)施攻擊引起人們?cè)絹?lái)越大的擔(dān)心该抒』藕椋基礎(chǔ)設(shè)施面臨分布式拒絕服務(wù)攻擊、蠕蟲(chóng)病毒凑保、對(duì)Internet域名系統(tǒng)(DNS)的攻擊和對(duì)路由器攻擊或利用路由器的攻擊冈爹。
(三)攻擊的位置
1、遠(yuǎn)程攻擊:指外部攻擊者通過(guò)各種手段欧引,從該子網(wǎng)以外的地方向該子網(wǎng)或者該子網(wǎng)內(nèi)的系統(tǒng)發(fā)動(dòng)攻擊频伤。
2、本地攻擊:指本單位的內(nèi)部人員芝此,通過(guò)所在的局域網(wǎng)憋肖,向本單位的其他系統(tǒng)發(fā)動(dòng)攻擊,在本級(jí)上進(jìn)行非法越權(quán)訪問(wèn)癌蓖。
3瞬哼、偽遠(yuǎn)程攻擊:指內(nèi)部人員為了掩蓋攻擊者的身份,從本地獲取目標(biāo)的一些必要信息后租副,攻擊過(guò)程從外部遠(yuǎn)程發(fā)起坐慰,造成外部入侵的現(xiàn)象。
(四)攻擊者常用的攻擊工具
1、DOS攻擊工具:如WinNuke通過(guò)發(fā)送OOB漏洞導(dǎo)致系統(tǒng)藍(lán)屏结胀;Bonk通過(guò)發(fā)送大量偽造的UDP數(shù)據(jù)包導(dǎo)致系統(tǒng)重啟赞咙;TearDrop通過(guò)發(fā)送重疊的IP碎片導(dǎo)致系統(tǒng)的TCP/IP棧崩潰;WinArp通過(guò)發(fā)特別數(shù)據(jù)包在對(duì)方機(jī)器上產(chǎn)生大量的窗口糟港;Land通過(guò)發(fā)送大量偽造源IP的基于SYN的TCP請(qǐng)求導(dǎo)致系統(tǒng)重啟動(dòng)攀操;FluShot通過(guò)發(fā)送特定IP包導(dǎo)致系統(tǒng)凝固。
2秸抚、木馬程式:如BO2000(BackOrifice)速和、“冰河”、 NetSpy剥汤、Glacier颠放、KeyboardGhost等。
(五)攻擊的層次
從淺入深的分為以下幾個(gè)層次:
1吭敢、簡(jiǎn)單拒絕服務(wù)碰凶。
2、本地用戶獲得非授權(quán)讀權(quán)限鹿驼。
3欲低、本地用戶獲得非授權(quán)寫(xiě)權(quán)限。
4畜晰、遠(yuǎn)程用戶獲得非授權(quán)賬號(hào)信息砾莱。
5、遠(yuǎn)程用戶獲得特權(quán)文件的讀權(quán)限舷蟀。
6恤磷、遠(yuǎn)程用戶獲得特權(quán)文件的寫(xiě)權(quán)限面哼。
7野宜、遠(yuǎn)程用戶擁有了系統(tǒng)管理員權(quán)限。
第一步:隱藏自已的位置魔策。
第二步:尋找目標(biāo)主機(jī)并分析目標(biāo)主機(jī)匈子。
第三步:獲取帳號(hào)和密碼,登錄主機(jī)闯袒。
第四步:獲得控制權(quán)虎敦。
第五步:竊取網(wǎng)絡(luò)資源和特權(quán)。
SQL注入攻擊是黑客對(duì)數(shù)據(jù)庫(kù)進(jìn)行攻擊的常用手段之一其徙。隨著B(niǎo)/S模式應(yīng)用開(kāi)發(fā)的發(fā)展,使用這種模式編寫(xiě)應(yīng)用程序的程序員也越來(lái)越多喷户。但是由于程序員的水平及經(jīng)驗(yàn)也參差不齊唾那,相當(dāng)大一部分程序員在編寫(xiě)代碼的時(shí)候,沒(méi)有對(duì)用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷褪尝,使應(yīng)用程序存在安全隱患闹获。用戶可以提交一段數(shù)據(jù)庫(kù)查詢代碼期犬,根據(jù)程序返回的結(jié)果,獲得某些他想得知的數(shù)據(jù)避诽,這就是所謂的SQLInjection龟虎,即SQL注入。
(二)注入簡(jiǎn)介
SQL注入是從正常的WWW端口訪問(wèn)沙庐,而且表面看起來(lái)跟一般的Web頁(yè)面訪問(wèn)防止SQL注入攻擊沒(méi)什么區(qū)別鲤妥,所以市面的防火墻都不會(huì)對(duì)SQL注入發(fā)出警報(bào),如果管理員沒(méi)查看ⅡS日志的習(xí)慣拱雏,可能被入侵很長(zhǎng)時(shí)間都不會(huì)發(fā)覺(jué)旭斥。但是,SQL注入的手法相當(dāng)靈活古涧,在注入的時(shí)候會(huì)碰到很多意外的情況垂券,需要構(gòu)造巧妙的SQL語(yǔ)句,從而成功獲取想要的數(shù)據(jù)羡滑。
在計(jì)算機(jī)技術(shù)高速發(fā)展的今天菇爪,越來(lái)越讓人們頭疼的是面臨越來(lái)越“變態(tài)”和復(fù)雜的威脅網(wǎng)站技術(shù),他們利用Internet執(zhí)行各種惡意活動(dòng)柒昏,如身份竊取凳宙、私密信息竊取、帶寬資源占用等职祷。它們潛入之后氏涩,還會(huì)擴(kuò)散并不斷更新自己。這些活動(dòng)常常利用用戶的好奇心有梆,在用戶不知道或未允許的情況下潛入用戶的PC是尖,不知不覺(jué)中,帳戶里的資金就被轉(zhuǎn)移了泥耀,公司訊息也被傳送出去饺汹,危害十分嚴(yán)重。2006年8月16日痰催,第一個(gè)Web威脅樣本出現(xiàn)兜辞,截止到2006年10月25日,已經(jīng)產(chǎn)生了第150個(gè)變種夸溶,并且逸吵,還在不斷地演化下去。
三缝裁、SQL注入的技術(shù)分析
本章從SQL注入攻擊與web環(huán)境的環(huán)境依賴關(guān)系扫皱,介紹了數(shù)據(jù)庫(kù)的基本知識(shí)和常見(jiàn)操作SQL數(shù)據(jù)庫(kù)的SQL語(yǔ)言,web工作原理。Web程序的通信方式啸罢,為理解SQL注入的生成過(guò)程提供一些背景知識(shí)编检。從Web應(yīng)用層的代碼介紹引發(fā)SQL注入的因素以及那些開(kāi)發(fā)實(shí)踐和行為會(huì)引發(fā)SQL注入,從而達(dá)到SQL注入的實(shí)現(xiàn)扰才。
(一)web工作原理
1允懂、什么是Web應(yīng)用
World Wide Web簡(jiǎn)稱(chēng)為Web。Web是一個(gè)由文檔組成的超大規(guī)模集合衩匣,其中通過(guò)鏈接相互聯(lián)系蕾总。這些文檔是由Web服務(wù)器提供,可以通過(guò)瀏覽器訪問(wèn)琅捏。Web是一組軟件和協(xié)議的集合生百。Web應(yīng)用時(shí)一種是用Web瀏覽器并通過(guò)Internet或內(nèi)部往來(lái)訪問(wèn)的程序,Web應(yīng)用程序通常需要Web瀏覽器柄延,Web服務(wù)器蚀浆,是基于客戶機(jī)/服務(wù)器的配置而運(yùn)行的,既B/S結(jié)構(gòu)搜吧。
WEB應(yīng)用程序的三層結(jié)構(gòu)分別為:
1.表示層(PresentationTier)
表示層為用戶接口部分市俊,是用戶與系統(tǒng)之間交互信息的界面。
2.中間層(MiddleTier)
也稱(chēng)業(yè)務(wù)邏輯層滤奈,由WEB服務(wù)器和應(yīng)用程序服務(wù)器組成摆昧。功能層是應(yīng)用的主體,也是整個(gè)分層模型中最為重要的一層蜒程。
3.?dāng)?shù)據(jù)層(DataTier)
數(shù)據(jù)層是整個(gè)分層體系的最底層绅你,它主要用來(lái)實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的交互,即完成查詢昭躺、插入忌锯、刪除和修改數(shù)據(jù)庫(kù)中數(shù)據(jù)的功能。
2窍仰、WEB系統(tǒng)通信方式
大部分的Web應(yīng)用都是使用HTTP協(xié)議汉规,少部分Web應(yīng)用特別使用HTPS協(xié)議礼殊。但我們是討論Web環(huán)境下SQL注入攻擊驹吮,所以只討論HTTP協(xié)議。即超文本協(xié)議晶伦,HTTP包含兩個(gè)階段:請(qǐng)求階段和響3應(yīng)階段碟狞。瀏覽器和Web服務(wù)器之間的每一次HTTP通信都包含兩個(gè)部分:頭部和主體。頭部包含了與通信的有關(guān)消息婚陪,主體包含了通信的數(shù)據(jù)族沃,當(dāng)然前提是存在這樣的數(shù)據(jù)。
(二)SQL語(yǔ)言
1、什么是SQL語(yǔ)言
結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language)簡(jiǎn)稱(chēng)SQL脆淹,是一種特殊目的的編程語(yǔ)言常空,是一種數(shù)據(jù)庫(kù)查詢和程序設(shè)計(jì)語(yǔ)言,用于存取數(shù)據(jù)以及查詢盖溺、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng);同時(shí)也是數(shù)據(jù)庫(kù)腳本文件的擴(kuò)展名漓糙。
2、SQL語(yǔ)言的應(yīng)用
結(jié)構(gòu)化查詢語(yǔ)言SQL(STRUCTURED QUERY LANGUAGE)是最重要的關(guān)系數(shù)據(jù)庫(kù)操作語(yǔ)言烘嘱,并且它的影響已經(jīng)超出數(shù)據(jù)庫(kù)領(lǐng)域昆禽,得到其他領(lǐng)域的重視和采用,如人工智能領(lǐng)域的數(shù)據(jù)檢索蝇庭,第四代軟件開(kāi)發(fā)工具中嵌入SQL的語(yǔ)言等醉鳖。
3、SQL語(yǔ)言的語(yǔ)句結(jié)構(gòu)
結(jié)構(gòu)化查詢語(yǔ)言包含6個(gè)部分:
1.數(shù)據(jù)查詢語(yǔ)言(DQL:Data Query Language):
2.數(shù)據(jù)操作語(yǔ)言(DML:DataManipulation Language):
3.事務(wù)處理語(yǔ)言(TPL):
4.數(shù)據(jù)控制語(yǔ)言(DCL):
5.數(shù)據(jù)定義語(yǔ)言(DDL):
6.指針控制語(yǔ)言(CCL):
4哮内、SQL語(yǔ)言的特點(diǎn)
1.一體化:SQL集數(shù)據(jù)定義DDL盗棵、數(shù)據(jù)操縱DML和數(shù)據(jù)控制DCL于一體,可以完成數(shù)據(jù)庫(kù)中的全部工作北发。
2.使用方式靈活:它具有兩種使用方式漾根,即可以直接以命令方式交互使用;也可以嵌入使用,嵌入到C鲫竞、C++辐怕、FORTRAN、COBOL从绘、JAVA等主語(yǔ)言中使用寄疏。
3.非過(guò)程化:只提操作要求,不必描述操作步驟僵井,也不需要導(dǎo)航陕截。使用時(shí)只需要告訴計(jì)算機(jī)"做什么",而不需要告訴它"怎么做"批什。
4.語(yǔ)言簡(jiǎn)潔农曲,語(yǔ)法簡(jiǎn)單,好學(xué)好用:在ANSI標(biāo)準(zhǔn)中驻债,只包含了94個(gè)英文單詞乳规,核心功能只用6個(gè)動(dòng)詞,語(yǔ)法接近英語(yǔ)口語(yǔ)合呐。
(三)SQL注入的實(shí)現(xiàn)
結(jié)構(gòu)化查詢語(yǔ)言(SQL)是一種用來(lái)和數(shù)據(jù)庫(kù)交互的文本語(yǔ)言暮的,SQL Injection就是利用某些數(shù)據(jù)庫(kù)的外部接口把用戶數(shù)據(jù)插入到實(shí)際的數(shù)據(jù)庫(kù)操作語(yǔ)言當(dāng)中,從而達(dá)到入侵?jǐn)?shù)據(jù)庫(kù)乃至操作系統(tǒng)的目的淌实。它的產(chǎn)生主要是由于程序?qū)τ脩糨斎氲臄?shù)據(jù)沒(méi)有進(jìn)行細(xì)致的過(guò)濾冻辩,導(dǎo)致非法數(shù)據(jù)的導(dǎo)入查詢猖腕。
本章從使用瀏覽器與WEB應(yīng)用進(jìn)行交互和一般的攻擊步驟這一視角來(lái)討論發(fā)現(xiàn)SQL注入問(wèn)題。
1恨闪、SQL注入流程
針對(duì)SQL注入的普遍存在性倘感,各種SQL注入攻擊方法的實(shí)質(zhì)是基本統(tǒng)一的,所以SQL注入攻擊的流程有很大的相似性咙咽,其攻擊者采取的一般步驟如下:判斷Web應(yīng)用系統(tǒng)侠仇、發(fā)現(xiàn)注入點(diǎn)、掃描注入點(diǎn)犁珠、特殊注入點(diǎn)的判斷逻炊、判斷數(shù)據(jù)庫(kù)類(lèi)型、判斷數(shù)據(jù)庫(kù)中的表的結(jié)構(gòu)犁享、判斷數(shù)據(jù)庫(kù)中字段的結(jié)果余素、構(gòu)造注入語(yǔ)句進(jìn)行注入、尋找管理員后臺(tái)地址登錄炊昆,并獲得Web應(yīng)用系統(tǒng)完全管理權(quán)限桨吊。以上是一般的攻擊步驟,攻擊中者一旦成功攻擊還會(huì)進(jìn)一步的獲取最大目標(biāo)凤巨。比如视乐、通過(guò)后臺(tái)獲得WebShell、獲得整個(gè)服務(wù)器的文件目錄敢茁、下載整個(gè)數(shù)據(jù)庫(kù)內(nèi)容佑淀、修改服務(wù)器注冊(cè)表、利用數(shù)據(jù)庫(kù)功能導(dǎo)入木馬并遠(yuǎn)程控制服務(wù)器彰檬、創(chuàng)建服務(wù)器管理員權(quán)限賬戶伸刃。在以下的章節(jié)中我們會(huì)圍繞這個(gè)過(guò)程來(lái)展開(kāi)SQL注入攻擊的技術(shù)研究。
2逢倍、尋找SQL注入
SQL注入可以出現(xiàn)在任何從系統(tǒng)或用戶接收的數(shù)據(jù)輸入的前端應(yīng)用中捧颅,我們很難訪問(wèn)到應(yīng)用的源代碼,因此需要進(jìn)行黑盒測(cè)試较雕,理解服務(wù)器的響應(yīng)時(shí)需要非常細(xì)心碉哑。尋找SQL注入漏洞存在三個(gè)關(guān)鍵點(diǎn):識(shí)別Web應(yīng)用接收的數(shù)據(jù)輸入、修改輸入值以包含危險(xiǎn)的字符串亮蒋、檢測(cè)服務(wù)器返回的異常扣典。識(shí)別SQL注入漏洞有一種簡(jiǎn)單的規(guī)則:通過(guò)發(fā)送意外數(shù)據(jù)來(lái)觸發(fā)異常。該規(guī)則包括如下含義:識(shí)別WEB應(yīng)用上所有的數(shù)據(jù)輸入宛蚓、了解那種類(lèi)型的請(qǐng)求會(huì)觸發(fā)異常激捏、檢測(cè)服務(wù)器響應(yīng)中的異常。包含數(shù)據(jù)庫(kù)錯(cuò)誤或HTTP錯(cuò)誤代碼的服務(wù)器響應(yīng)通常能降低識(shí)別SQL注入漏洞的難度凄吏。但SQL盲注是一種即使應(yīng)用不返回明顯錯(cuò)誤也能利用漏洞的技術(shù)远舅。
3、確認(rèn)SQL注入及SQL語(yǔ)句構(gòu)造方式
要想確認(rèn)一個(gè)SQL注入漏洞并進(jìn)一步加以利用痕钢,需要構(gòu)造一條注入SQL代碼的請(qǐng)求以便應(yīng)用創(chuàng)建一條語(yǔ)法正確的SQL語(yǔ)句图柏,之后由數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行該語(yǔ)句其不返回任何錯(cuò)誤。在創(chuàng)建正確的語(yǔ)句是任连,可以終止它并注釋剩下的查詢蚤吹。對(duì)于這種情況,通乘婵伲可以毫無(wú)約束地連接任意SQL代碼(假設(shè)后臺(tái)數(shù)據(jù)接支持執(zhí)行多條語(yǔ)句)進(jìn)而提供執(zhí)行攻擊的能力裁着。
想要構(gòu)造有效的SQL語(yǔ)句,首先要理解數(shù)據(jù)庫(kù)包含的不同類(lèi)型拱她,他們具有不同的表示方式二驰,通常有數(shù)字型和字符串型。數(shù)值型不需要使用單引號(hào)來(lái)表示秉沼,字符串要有單引號(hào)表示桶雀。其示例如下:
數(shù)值型:
SELECT * FROMproducts WHERE value > 200
SELECT * FROMproducts WHERE active = 1
字符串型:
SELECT * FROMproducts WHERE name = 'Bike'
SELECT * FROM productsWHERE published_date > '01/01/2009'
SELECT * FROM productsWHERE published_time > '01/01/2009 06:30:00'
SQL注入攻擊技術(shù)特性的核心表達(dá)式可以理解成一種通過(guò)在腳本系統(tǒng)與用戶交互中唬复,利用存在的漏洞而進(jìn)行的攻擊方式矗积,單就SQL注入攻擊來(lái)說(shuō),如果妄圖從核心的角度防御這樣的攻擊敞咧,絕對(duì)不是簡(jiǎn)單從腳本層面來(lái)嚴(yán)防死守就能做到徹底的防御棘捣,必須以安全是一個(gè)整體的邏輯推斷方式,從各個(gè)方面進(jìn)行考慮休建,并力求根據(jù)最新的注入攻擊技術(shù)進(jìn)行分析和防范柱锹。
從存在的實(shí)際情況來(lái)看,包括Web服務(wù)器管理員丰包、數(shù)據(jù)庫(kù)服務(wù)器管理員禁熏、數(shù)據(jù)庫(kù)設(shè)計(jì)員、代碼程序員在內(nèi)的所有工作人員都是防御體系的關(guān)鍵邑彪。
我們從Web應(yīng)用程序的開(kāi)發(fā)瞧毙、部署、管理寄症、維護(hù)多個(gè)方面進(jìn)行審查宙彪,是程序SQL注入了漏洞最小化。我們從代碼層和平臺(tái)層兩個(gè)方面來(lái)闡述SQL注入攻擊的防御有巧。
本節(jié)主要站在Web數(shù)據(jù)庫(kù)管設(shè)計(jì)員和編寫(xiě)代碼的角度來(lái)研究SQL注入攻擊防御的释漆。
1.使用參數(shù)化語(yǔ)句
前面講過(guò)動(dòng)態(tài)字符串構(gòu)造是引發(fā)SQL注入漏洞的原因之一。作為一種更加安全的動(dòng)態(tài)字符串構(gòu)造方法篮迎,大多數(shù)現(xiàn)代編程語(yǔ)言和數(shù)據(jù)庫(kù)訪問(wèn)API可以使用占位符或綁定變量來(lái)向SQL查詢提供參數(shù)(而非直接對(duì)用戶輸入進(jìn)行操作)男图,這些通常稱(chēng)為參數(shù)化語(yǔ)句內(nèi)容是更安全的方法示姿,可以使用它們來(lái)避免或解決很多在應(yīng)用中經(jīng)常見(jiàn)到的SQL注入問(wèn)題,并可以在大多數(shù)常見(jiàn)的情形中使用它們來(lái)替代現(xiàn)有的動(dòng)態(tài)查詢逊笆。不過(guò)栈戳,值得注意的是,參數(shù)化語(yǔ)句是與一種向數(shù)據(jù)庫(kù)提供潛在的非安全參數(shù)(通常作為查詢或存儲(chǔ)過(guò)程調(diào)用)的方法难裆。雖然它們不會(huì)修改傳遞給數(shù)據(jù)庫(kù)的內(nèi)容子檀,但如果正在調(diào)用的數(shù)據(jù)庫(kù)功能在存儲(chǔ)過(guò)程或函數(shù)中使用了動(dòng)態(tài)SQL,則任然可能出現(xiàn)SQL注入乃戈。下面是一段使用動(dòng)態(tài)SQL的登陸頁(yè)面中易受攻擊的偽代碼示例褂痰。我們接下來(lái)介紹如何在java中參數(shù)化這段代碼。
Username = request("username");
Password = request("password");
Sql = "SELECT * FROM users WHERE username='" + Username +"' AND password='" + Password + "'";
Result = Db.Execute(Sql);
If (Result) /* successful login */
下面的例子展示了如何使用帶命名參數(shù)的Hibernate來(lái)參數(shù)化該偽代碼:
String sql = "SELECT * FROM users WHERE username=:username AND"+
"password=:password";
Query lookupUser = session.createQuery(sql);
// Add parameters to SQL query
lookupUser.setString("username", username);// add username
lookupUser.setString("password", password);// add password
List rs = lookupUser.list();
2.輸出編碼
處理驗(yàn)證應(yīng)用受到的輸入以外症虑,通常還需要對(duì)在應(yīng)用的不同的模塊或部分間傳遞的內(nèi)容進(jìn)行編碼缩歪。在SQL注入語(yǔ)境中,將其發(fā)送給數(shù)據(jù)庫(kù)的內(nèi)容進(jìn)行編碼或“引用”是必要的操作侦讨,這樣可以保證內(nèi)容被正確地處理驶冒。如有必要對(duì)包含字符串中的單引號(hào)進(jìn)行編碼,可以使用兩個(gè)單引號(hào)替換單個(gè)單引號(hào)的方法來(lái)實(shí)現(xiàn)編碼的目的韵卤,從而有效阻止惡意用戶在特定的查詢中利用SQL注入骗污,可以使用與下面類(lèi)似的代碼在java中實(shí)現(xiàn)該目的:
Sql=sql.replace(“ ‘ “, “ ‘ ‘ “);
輸入驗(yàn)證和輸出編碼面臨的困難是:確保將正在評(píng)估或轉(zhuǎn)換的數(shù)據(jù)庫(kù)解釋成最終使用該輸入的用戶所需要的格式。避開(kāi)輸入驗(yàn)證和輸出編碼的常用技術(shù)是:在將輸入發(fā)送給應(yīng)用之前對(duì)其進(jìn)行編碼沈条,之后再對(duì)其進(jìn)行解碼和解釋以符合攻擊者的目標(biāo)需忿。基于這些原因蜡歹,通常最容易實(shí)現(xiàn)的一種方法是拒絕所有不符合規(guī)范化格式的輸入屋厘。例如可以拒絕應(yīng)用接收的所有HTML和URL編碼的輸入。如果無(wú)法拒絕包含編碼格式的輸入月而,則需要尋找解碼方法或者使用其他方法來(lái)保證接收到的數(shù)據(jù)的安全汗洒。這可能包含幾個(gè)會(huì)潛在重復(fù)多次的解碼步驟。盡可能使用白名單輸入驗(yàn)證并拒絕非規(guī)范格式的輸入父款∫绨可以使用Java中的Normalizer類(lèi)將輸入標(biāo)準(zhǔn)化:
normalized = Normalizer.normalize(input,Normalizer.Form.NFKC);。
(三)通過(guò)設(shè)計(jì)來(lái)避免SQL注入
1.使用存儲(chǔ)過(guò)程憨攒。
2.使用抽象層世杀。
3.處理敏感數(shù)據(jù)。
4.避免明顯的對(duì)象名和創(chuàng)建數(shù)據(jù)庫(kù)肝集。
數(shù)據(jù)庫(kù)是Web應(yīng)用架構(gòu)的一個(gè)重要組成部分瞻坝,對(duì)于確保數(shù)據(jù)庫(kù)安全對(duì)于防御SQL注入是至關(guān)重要的。
1.分離數(shù)據(jù)庫(kù)服務(wù)器和Web頁(yè)面發(fā)布服務(wù)器杏瞻。
2.隔離數(shù)據(jù)庫(kù)服務(wù)器:是指將網(wǎng)絡(luò)安全中的最小化安全法則應(yīng)用到數(shù)據(jù)庫(kù)服務(wù)器的網(wǎng)絡(luò)連接上所刀,一般做法是衙荐,使用防火墻或不能聯(lián)網(wǎng)的IP地址來(lái)阻止任何用戶到數(shù)據(jù)庫(kù)服務(wù)器的因特網(wǎng)訪問(wèn)。
3.為數(shù)據(jù)庫(kù)服務(wù)器增加訪問(wèn)控制:當(dāng)管理員從網(wǎng)絡(luò)中隔離出來(lái)數(shù)據(jù)庫(kù)服務(wù)器之后勉痴,需要在數(shù)據(jù)庫(kù)服務(wù)器上配置可信任的IP接入和訪問(wèn)赫模。以控制那些機(jī)器能夠與數(shù)據(jù)庫(kù)服務(wù)器通信树肃。
4.數(shù)據(jù)庫(kù)服務(wù)器本身的最小化安全:從數(shù)據(jù)庫(kù)服務(wù)器上移除所有示例腳本和應(yīng)用程序蒸矛,即讓數(shù)據(jù)庫(kù)服務(wù)器除了提供數(shù)據(jù)交互的功能以外,不能提供任何其他常規(guī)的服務(wù)器功能胸嘴。
5.刪除或修改默認(rèn)高權(quán)數(shù)據(jù)庫(kù)連接賬戶:管理員應(yīng)該與程序開(kāi)發(fā)者協(xié)同工作雏掠,在能實(shí)現(xiàn)應(yīng)用系統(tǒng)的腳本功能的前提下,將數(shù)據(jù)庫(kù)中默認(rèn)的管理賬戶劣像、高權(quán)賬戶刪除或修改乡话。
6.嚴(yán)格監(jiān)控或者刪除數(shù)據(jù)庫(kù)高權(quán)用戶:管理員應(yīng)該與應(yīng)用程序開(kāi)發(fā)者協(xié)同,以代碼和服務(wù)器相結(jié)合的方式耳奕,為每個(gè)應(yīng)用程序的數(shù)據(jù)庫(kù)連接賬戶使用一個(gè)專(zhuān)用的低特權(quán)賬戶绑青。
7.建立數(shù)據(jù)庫(kù)表的安全訪問(wèn)機(jī)制:不要允許用戶或應(yīng)用程序直接訪問(wèn)數(shù)據(jù)庫(kù)表。如果應(yīng)用程序一定要使用對(duì)數(shù)據(jù)庫(kù)擁有有限訪問(wèn)的應(yīng)用程序角色屋群,或者某應(yīng)用程序需要讀取數(shù)據(jù)庫(kù)表闸婴,應(yīng)將數(shù)據(jù)庫(kù)的訪問(wèn)限制為只讀。
8.限制存儲(chǔ)過(guò)程的使用:對(duì)于不需的存儲(chǔ)過(guò)程應(yīng)該刪除或者禁用芍躏,應(yīng)該以用戶創(chuàng)建的存儲(chǔ)過(guò)程代替危險(xiǎn)的存儲(chǔ)過(guò)程邪乍。
隨著互聯(lián)網(wǎng)的快速發(fā)展对竣,黑客隊(duì)伍日益壯大庇楞,其網(wǎng)絡(luò)攻擊技術(shù)不斷成熟,公安機(jī)關(guān)網(wǎng)絡(luò)執(zhí)法工作將面臨嚴(yán)重的挑戰(zhàn)否纬。本文所講的sql注入攻擊為黑客常用的攻擊手段吕晌,公安機(jī)關(guān)網(wǎng)絡(luò)工作人員應(yīng)當(dāng)提前做好遏制網(wǎng)絡(luò)攻擊犯罪的宣傳工作,并且要深層次了解sql注入攻擊原理临燃,以及熟練掌握各種防御手段睛驳。當(dāng)接到被攻擊者報(bào)案,予以立案后谬俄,公安機(jī)關(guān)網(wǎng)絡(luò)執(zhí)法者要立即查明案情柏靶,確定犯罪來(lái)源,運(yùn)用先進(jìn)的防御技術(shù)和偵察手段溃论,遏制犯罪行為再次發(fā)生屎蜓。
在眾多案情中,被攻擊者遭遇攻擊的原因是沒(méi)有提前做好sql注入攻擊的預(yù)防工作钥勋,其主要原因是網(wǎng)絡(luò)開(kāi)發(fā)者沒(méi)有遵循安全代碼開(kāi)發(fā)的要求炬转,因此辆苔,要避免sql注入攻擊,必須要提前做好預(yù)防工作扼劈。
1驻啤、過(guò)濾掉特殊字符。
2荐吵、分離數(shù)據(jù)庫(kù)服務(wù)器與web服務(wù)器
3骑冗、web應(yīng)用程序使用專(zhuān)門(mén)的數(shù)據(jù)庫(kù)低權(quán)連接賬戶
從安全技術(shù)手段上來(lái)說(shuō),可以通過(guò)數(shù)據(jù)庫(kù)防火墻實(shí)現(xiàn)對(duì)SQL注入攻擊的防范先煎,因?yàn)镾QL注入攻擊往往是通過(guò)應(yīng)用程序來(lái)進(jìn)攻贼涩,可以使用虛擬補(bǔ)丁技術(shù)實(shí)現(xiàn)對(duì)注入攻擊的SQL特征識(shí)別,實(shí)現(xiàn)實(shí)時(shí)攻擊阻斷薯蝎。如果互聯(lián)網(wǎng)Web服務(wù)器遭到 SQL注入攻擊遥倦,請(qǐng)遵循如下步驟:
1、關(guān)閉網(wǎng)站
2占锯、檢查 IIS日志袒哥,查找引起這次攻擊的有漏洞的目標(biāo)網(wǎng)頁(yè)
3、聯(lián)系該 Web服務(wù)器上 Web應(yīng)用的開(kāi)發(fā)者消略,檢查并修改 ASP頁(yè)面中存在 SQL注入攻擊隱患的代碼堡称。
結(jié)語(yǔ)
隨著信息技術(shù)的發(fā)展,信息系統(tǒng)廣泛應(yīng)用疑俭,Web編程的流行粮呢,編寫(xiě)Web應(yīng)用的程序員越來(lái)越多。由安全問(wèn)題此帶來(lái)的信息也日益突出钞艇,這就需要我們不斷提升自身信息安全防知識(shí)護(hù)和技能啄寡,做好預(yù)先的防范措施,這樣才能減少我們?cè)诒还粽叩膿p失哩照。
通過(guò)這次SQL注入攻擊與防御的畢業(yè)設(shè)計(jì)挺物。讓我知道理論和實(shí)踐相結(jié)合是相當(dāng)重要的,我們?cè)陂_(kāi)發(fā)Web應(yīng)用程序時(shí)應(yīng)該重要考慮安全問(wèn)題飘弧,為以后的不必要麻煩做好防御準(zhǔn)備识藤,本文從攻擊者的各種攻擊技術(shù)角度來(lái)討論了SQL注入的成因、行為和攻擊利用者的方式次伶,并提出防御攻擊的一般解決方案痴昧。
由于SQL注入攻擊方法和手段變化多端,知識(shí)面廣冠王。本人第一次接觸到安全領(lǐng)域的學(xué)習(xí)赶撰,能力水平有限,本論文中難以做到全面深入研究和概括,如有錯(cuò)誤和不足之處豪娜,敬請(qǐng)各位批評(píng)指正餐胀,共同學(xué)習(xí)。