◆江科
三種常見的Web漏洞及其防護(hù)技術(shù)研究
◆江科
(川北醫(yī)學(xué)院 四川 637000)
本文對SQL注入攻擊漏洞、XSS漏洞、文件上傳漏洞三種常見的Web 漏洞的利用原理進(jìn)行了分析,并以PHP開發(fā)環(huán)境為例,對其防范技術(shù)作了一定的研究和總結(jié)。以期軟件開發(fā)人員能在編碼過程中更加嚴(yán)謹(jǐn),提高軟件產(chǎn)品的安全性,以便信息系統(tǒng)管理人員能了解基本的漏洞利用原理,有針對性地開展網(wǎng)絡(luò)安全工作。
SQL注入漏洞;XSS漏洞;文件上傳漏洞;PHP;網(wǎng)絡(luò)安全
普通高校信息系統(tǒng)一般不存在關(guān)鍵信息基礎(chǔ)設(shè)施,來自較為豐富資源的威脅源的攻擊相對較為少見。通過我校網(wǎng)絡(luò)安全防護(hù)設(shè)備日志記錄分析得出,惡意攻擊者對我校Web系統(tǒng)較多的攻擊方式是通過軟件對目標(biāo)系統(tǒng)進(jìn)行掃描和嗅探,契機(jī)對發(fā)現(xiàn)的漏洞進(jìn)行利用,其中,對SQL注入攻擊漏洞、XSS漏洞、文件上傳漏洞的嗅探頻次較高,雖然這三個漏洞的利用技術(shù)門檻較低,但危害較大。因此,本文以PHP開發(fā)環(huán)境為例,對這三種漏洞的原理分析和防護(hù)技術(shù)研究作一定的研究,以促進(jìn)普通高校網(wǎng)絡(luò)安全管理工作的水平提升。
SQL注入攻擊源于英文“SQL Injection Attack”,具有廣泛性、隱蔽性、門檻低、變種多、危害大等特點(diǎn)[1]。其原理是利用開發(fā)者拼接SQL語句的編碼漏洞,發(fā)送特殊的數(shù)據(jù)到數(shù)據(jù)庫執(zhí)行,以期到達(dá)繞過身份驗(yàn)證、竊取和破壞數(shù)據(jù)、脫庫乃至取得控制器等非法目的。
以身份驗(yàn)證為例,用戶在前端Html表單中填寫賬號和密碼,通過發(fā)送Http POST方法發(fā)送到服務(wù)器端進(jìn)行驗(yàn)證,服務(wù)器端使用獲取到的POST數(shù)據(jù)拼接SQL語句發(fā)送到數(shù)據(jù)庫進(jìn)行查詢,如果存在匹配記錄則通過驗(yàn)證,反正則不通過。
一個典型的存在SQL注入攻擊漏洞的SQL語句如下拼接:
Select * From Admin Where Name=’{$_POST[name]}’ and Password=’ {$_POST[password]}’
正常情況下,用戶輸入用戶名為admin,密碼為Password時,執(zhí)行的SQL語句為:
Select * From Admin Where Name=’ admin’ and Password=’ Password’
看上去邏輯沒有問題,但攻擊者可以發(fā)送一些特殊的數(shù)據(jù)即可輕松欺騙程序,比如把Password填寫為“any’ or ‘1=1”,則執(zhí)行的SQL語句為:
Select * From Admin Where Name=’admin’ and Password=’any’ or ‘1=1’
本例利用SQL 語句使用對稱單引號來限定文本值這一語法特性,在文本值中再插入兩個單引號,擾亂原有語法結(jié)構(gòu),增加SQL語句的條件值“or ‘1=1’”。很明顯,增加的條件值1=1恒定為True,因此無論Name和Password是什么值,整個條件值都是True,都能查詢到匹配記錄并通過身份驗(yàn)證從而進(jìn)入系統(tǒng),產(chǎn)生嚴(yán)重威脅。
SQL注入攻擊遠(yuǎn)不止利用單引號這一方法:“#”、“%”、“l(fā)ike”等關(guān)鍵詞和函數(shù)等都可以被利用,尤其是函數(shù)注入將產(chǎn)生較大危害,其注入原理和本例類似,可以類推。
SQL注入攻擊的防護(hù)總綱領(lǐng)就是一條:不信任任何客戶端發(fā)送的數(shù)據(jù)。在編碼過程中,對客戶端發(fā)送的數(shù)據(jù)進(jìn)行層層檢測和過濾,確定合法后再發(fā)送到數(shù)據(jù)庫執(zhí)行,主要措施有以下4條:
(1)嚴(yán)格檢查和過濾輸入字符串
通常情況下,服務(wù)器端需要接受客戶端數(shù)據(jù)的值類型只會是一種或少數(shù)幾種,很少情況下需要任意形式的數(shù)據(jù)。因此,可以限定接收數(shù)據(jù)的值類型。比如只需要值類型為數(shù)字的數(shù)據(jù),可通過is_numeric()函數(shù)判斷,也可使用set_type()轉(zhuǎn)換,還可使用max()、int_val()等函數(shù)直接過濾;又比如字母,可使用ctype_alpha ()函數(shù)進(jìn)行檢測,總之,經(jīng)過檢測和過濾的合法數(shù)據(jù)才進(jìn)入程序的下一個流程。
(2)轉(zhuǎn)義
在數(shù)據(jù)檢查和過濾之后、發(fā)送到數(shù)據(jù)庫之前對數(shù)據(jù)進(jìn)行轉(zhuǎn)義,有語法意義的特殊字符將被轉(zhuǎn)換為該字符的文本值,不作為語法處理,比如“’”轉(zhuǎn)義后為“”,“”才是單引號在SQL語句中的文本值。推薦使用各數(shù)據(jù)庫編程接口專門的轉(zhuǎn)義函數(shù)而不是php內(nèi)置的addslashes()函數(shù)進(jìn)行轉(zhuǎn)義,相對更完善和安全,比如使用PDO類的quote()方法。
(3)使用預(yù)處理語句
SQL注入漏洞普遍存在的根本原因是字符串拼接SQL語句的編碼方式極易發(fā)生數(shù)據(jù)檢查、過濾和轉(zhuǎn)義的疏忽。使用預(yù)處理語句則可規(guī)避此問題,本例經(jīng)改造后核心代碼如下:
$sth = $dbh->prepare(“Select * From Admin Where Name=? and Password=?”);
$sth->execute([$name,$password]);
預(yù)處理語句可理解為SQL 語句模板,預(yù)先準(zhǔn)備好并使用占位標(biāo)記“?”(存在多種形式)代替將要被執(zhí)行的真實(shí)數(shù)據(jù),當(dāng)execute()方法執(zhí)行時,以參數(shù)形式綁定的數(shù)據(jù)將逐一取代對應(yīng)的占位標(biāo)記,最后發(fā)送到數(shù)據(jù)庫執(zhí)行。這種方式完全避免了字符串拼接,不僅程序可讀性強(qiáng),而且數(shù)據(jù)庫接口會自動檢驗(yàn),阻止SQL注入,同一預(yù)處理語句多次執(zhí)行的性能也有提高,推薦開發(fā)人員使用。
(4)數(shù)據(jù)庫權(quán)限限定
給予Web系統(tǒng)能夠正常運(yùn)行的數(shù)據(jù)庫賬號最小權(quán)限,作為函數(shù)式注入的最后防線。通常一般的Web系統(tǒng)只需要select、update、delete和insert等基本的數(shù)據(jù)庫權(quán)限,建議開發(fā)人員或數(shù)據(jù)庫管理員對給予Web系統(tǒng)的數(shù)據(jù)庫用戶或角色進(jìn)行設(shè)置。
XSS全稱為跨站腳本(Cross Site Scripting),為了和層疊樣式表(Cascading Style Sheets,CSS)區(qū)分,業(yè)內(nèi)簡稱為XSS。XSS漏洞是Web應(yīng)用的經(jīng)典漏洞,但直到現(xiàn)在,跨站腳本攻擊仍是許多Web應(yīng)用的最大威脅[2]。其原理通過各種方法向目標(biāo)Web頁面里插入腳本,當(dāng)其他用戶瀏覽該頁面時,嵌入的腳本被執(zhí)行,達(dá)到惡意攻擊的目的。
在一個留言本的Web頁面上,它允許用戶留言,并可以被其他用戶看到。如果存在XSS漏洞,攻擊者可以留一段特殊的“言”:
于是每位瀏覽該頁面的用戶瀏覽器都會出現(xiàn)一個彈窗,并顯示hello word。當(dāng)然這只是闡述原理的簡單示例,并不產(chǎn)生攻擊效果,但稍作深入就可以做更多事情,比如盜取身份信息:
thief.js核心攻擊代碼:
var ca=document.cookie;
script.src='http://example.com/ thief.php?ca='+ca;
簡單幾行代碼即可讀取用戶的cookie,傳送至攻擊者服務(wù)器進(jìn)行收集,以進(jìn)行下一步攻擊活動,這就是典型身份盜取攻擊。以此原理類推,XSS漏洞還會產(chǎn)生釣魚詐騙、網(wǎng)頁掛馬、垃圾信息發(fā)送、劫持用戶行為等諸多安全威脅。
避免產(chǎn)生XSS漏洞的原則是控制數(shù)據(jù)輸入點(diǎn)和輸出點(diǎn),編碼過程中對輸入和輸出的數(shù)據(jù)進(jìn)行過濾和轉(zhuǎn)換,主要措施有以下5條:
(1)在數(shù)據(jù)輸入點(diǎn)的過濾和轉(zhuǎn)換與上文SQL漏洞防范技巧一致,注意輸入點(diǎn)的防護(hù)不僅僅在POST數(shù)據(jù)中,任何從客戶端發(fā)送的數(shù)據(jù)都可作為XSS攻擊使用。
(2)服務(wù)器端輸出轉(zhuǎn)換:對于完全沒有必要在頁面上執(zhí)行HTML和Script的代碼的應(yīng)用場景,在服務(wù)器端使用htmlspecialchars()、htmlentities()或第三方RemoveXss()函數(shù)進(jìn)行轉(zhuǎn)換后再輸出,確保沒有可執(zhí)行的腳本代碼輸出到客戶端。
(3)客戶端輸出轉(zhuǎn)換:對于確有必要輸出腳本代碼到客戶端執(zhí)行、開發(fā)JavaScript API等應(yīng)用場景,在客戶端使用定義好的腳本函數(shù)進(jìn)行過濾,如JS中的innerText()、textContent()、innerHTML()函數(shù)和jQuery中的text()函數(shù)。
(4)設(shè)置HTTP內(nèi)容安全策略:內(nèi)容安全策略(Content Security Policy,簡稱CSP)采用白名單作機(jī)制限制頁面可以包含哪些來源的內(nèi)容,可在HTTP Header中發(fā)送或在HTML meta屬性中聲明。正確設(shè)置CSP后,瀏覽器會阻止非法來源的外部內(nèi)容(如上例中的example.com),能夠緩解XSS攻擊。
(5)在Web服務(wù)器配置Cookie的HttpOnly屬性,起到在發(fā)生XSS攻擊防止Cookie被盜取的作用。
上述前3點(diǎn)是筆者推薦必須要做的事情,不可完全依賴于后兩點(diǎn),因?yàn)橛脩魹g覽器存在多種品牌和多個版本,不完全可信,攻擊者可以結(jié)合瀏覽器自身漏洞進(jìn)行組合攻擊。
很多網(wǎng)站都有文件上傳功能,如附件上傳、圖片上傳,攻擊者可利用網(wǎng)站自身的文件上傳功能,上傳木馬、病毒、后門程序等至服務(wù)器,并偽裝成可執(zhí)行或可解釋文件運(yùn)行,造成信息竊取、破壞,結(jié)合其他漏洞就可以輕易獲得控制器。成熟的木馬、病毒、后門程序能在網(wǎng)絡(luò)上輕易獲取,利用文件上傳漏洞進(jìn)行攻擊,上手難度低但威脅非常大,同樣需要引起高度重視。
(1)文件擴(kuò)展名檢查:對上傳文件的擴(kuò)展名進(jìn)行檢查,采用白名單機(jī)制,只允許需要的文件上傳,如:只允許上傳擴(kuò)展名為jpg、png的文件,拒絕其他文件上傳。但部分老版本的操作系統(tǒng)存在空格和dot漏洞,老版本的Web服務(wù)器也存在解析漏洞,文件擴(kuò)展名檢查可被繞過。
(2)Content-Type檢查:每種文件都有唯一的Content-Type,可對上傳文件的Content-Type檢查確定文件類型,達(dá)到只允許需要的文件上傳目的。但可以使用相關(guān)工具篡改文件的Content-Type,達(dá)到欺騙檢查程序的目的。
(3)限制Web服務(wù)器行為:配置Web服務(wù)器和解釋器,禁止上傳文件保存目錄下的文件被解釋器解釋,禁止特定文件的HTTP訪問權(quán)限,比如在PHP的doc_root或user_dir中排除掉上傳文件保存目錄,在Apache中Directory設(shè)置中禁止允許的上傳文件之外的文件被訪問。通過這兩點(diǎn)措施,即便非法文件上傳,也不能被訪問和被解釋,可較大程度減少威脅。
(4)限制目錄權(quán)限:通過服務(wù)器操作系統(tǒng)文件系統(tǒng)權(quán)限配置上傳文件保存目錄的權(quán)限為只允許讀取、寫入而不能運(yùn)行,可以控制病毒木馬對操作系統(tǒng)的影響。
(5)安裝殺毒/威脅防護(hù)軟件并及時升級,對上傳的文件進(jìn)行實(shí)時檢測和病毒查殺。
文件上傳漏洞的封堵較為復(fù)雜,上述5點(diǎn)不一定完全涵蓋,但在實(shí)際操作中不能遺漏其中之一。
本文介紹了三種最常見的Web 漏洞,對其原理進(jìn)行了簡要的分析,并對軟件編碼中需要應(yīng)用的防范技術(shù)進(jìn)行了研討,希望軟件開發(fā)人員能在開發(fā)過程嚴(yán)格按規(guī)范編碼,做到邏輯嚴(yán)密、層層過濾,提高軟件產(chǎn)品的安全性,同時也希望信息系統(tǒng)管理人員能了解基本的漏洞利用原理,有針對性地開展網(wǎng)絡(luò)安全工作。
[1]王云,郭外萍,陳承歡.Web項(xiàng)目中的SQL注入問題研究與防范方法[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(05):976-978+1016.
[2]金濤,霍旭磊,王亞麗.XSS的攻擊利用與防護(hù)策略研究[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2021(01):14-16.
[3]武云蕾. Web應(yīng)用的SQL注入測試工具的設(shè)計(jì)與實(shí)現(xiàn)[D].西安電子科技大學(xué),2019.
[4]秦亞芬. 存儲型跨站腳本漏洞關(guān)鍵技術(shù)研究與實(shí)現(xiàn)[D].北京工業(yè)大學(xué),2019.
川北醫(yī)學(xué)院2016年校級科研發(fā)展計(jì)劃項(xiàng)目