日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

【转载】用Snort巧妙检测SQL注入和跨站脚本攻击

發(fā)布時(shí)間:2023/11/30 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】用Snort巧妙检测SQL注入和跨站脚本攻击 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

腳本攻擊是最近網(wǎng)絡(luò)上最瘋狂的攻擊方法了,很多服務(wù)器配置了先進(jìn)的硬件防火墻、多層次的安全體系,可惜最后對(duì)80端口的SQL注入和跨站腳本攻擊還是沒有辦法抵御,只能看著數(shù)據(jù)被惡意入侵者改的面目全非而毫無(wú)辦法——把你的Snort武裝起來(lái)吧,用它來(lái)檢測(cè)這樣的攻擊!

我們將以使用開放源代碼的入侵檢測(cè)系統(tǒng)IDS為例,編寫基于規(guī)則的正則表達(dá)式來(lái)對(duì)這類攻擊進(jìn)行監(jiān)測(cè)。這里順便提一下,在Snort中默認(rèn)的規(guī)則設(shè)置包含了檢測(cè)跨站腳本的關(guān)鍵字,是不是會(huì)產(chǎn)生沖突呢?不用擔(dān)心,這種沖突我們還是有辦法解決的,我們可以將它們用ASCII碼的十六進(jìn)制形式表示出來(lái)。例如在 Snort和腳本中都存在的關(guān)鍵字<script>,我們就可以用%3C%73%63%72%69%70%74%3E來(lái)代替。

如果你想對(duì)每一種可能的SQL注入進(jìn)行檢測(cè),那么你只要檢查任何SQL元字符的出現(xiàn),如像單引號(hào)(’)、分號(hào)(;)和雙減號(hào)(--)。同樣的,一個(gè)監(jiān)測(cè)跨站腳本攻擊的很偏執(zhí)的方法,就是查看HTML標(biāo)記的尖括號(hào)(<、>)。但是,前述的方法可能會(huì)引起大量的誤檢。為了避免誤檢,我們就必須將過(guò)濾規(guī)則設(shè)置的盡可能的準(zhǔn)確,即使這樣,我們?nèi)匀徊荒鼙WC不會(huì)產(chǎn)生誤檢,只能盡力而為了。

本文中,我們將就使用Snort對(duì)Perl中的字符串進(jìn)行檢測(cè)為例,做一詳細(xì)介紹。不熟悉Perl的讀者,可要回頭將Perl中的正則表達(dá)式部分仔細(xì)閱讀一下了。

1.針對(duì)SQL注入的正則表達(dá)式

在為SQL注入選擇正則表達(dá)式的時(shí)候,需要記住的是:攻擊者除了可以從Cookie的域中進(jìn)行攻擊之外,還可以通過(guò)表單(Form)的Input輸入框。所以,你在對(duì)輸入進(jìn)行邏輯驗(yàn)證的時(shí)候,還應(yīng)該對(duì)來(lái)自用戶的每種輸入信息都要考慮到,像表單域和Cookie信息都應(yīng)該作為懷疑的對(duì)象。同樣的,如果你發(fā)現(xiàn)許多針對(duì)單引號(hào)和分號(hào)的報(bào)警的時(shí)候,也可能是因?yàn)槭怯蒞eb應(yīng)用的Cookie中的信息引起的。因此,必須對(duì)特定的Web應(yīng)用來(lái)評(píng)估這樣的特殊符號(hào)。

如前所述,一個(gè)用來(lái)檢測(cè)SQL注入攻擊的最弱的正則表達(dá)式,就是通過(guò)檢查上面提到的元字符(’;--)。要檢測(cè)這樣的元字符,或者它們的16進(jìn)制的等價(jià)表示,我們可以使用如下的正則表達(dá)式:

/(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix

這里,%27是單引號(hào)的16進(jìn)制值,%23是’#’的16進(jìn)制值。像單引號(hào)和短橫杠都是MS SQL Server和Oracle中的特殊字符,如果我們使用的是MySQL,還必須檢測(cè)’#’的出現(xiàn)。這里需要說(shuō)明的就是“—”,不需要檢查它的16進(jìn)制值,因?yàn)樗皇荋TML元字符,不會(huì)被瀏覽器編碼。同樣的,如果攻擊者試圖手動(dòng)修改“—”為它的16進(jìn)制值%2D的話,SQL注入操作會(huì)失敗。為了照顧一下不熟悉Perl的同志,接下來(lái)我將上面的這個(gè)正則表達(dá)式簡(jiǎn)要解釋一下://是Perl中用來(lái)引起要進(jìn)行模式匹配的代碼,其完整形式為m//,通常,我們?cè)谑褂秒p斜杠引起模式匹配代碼的時(shí)候,可以將m省略不寫。符號(hào)“|”是或的作用,如同在其他語(yǔ)言中or的通常意義。這里的小括號(hào)是為了更容易讓讀者看明白的情況下而寫出來(lái)的,完全可以不用。第二個(gè)/后面的i表示對(duì)要匹配的字母不區(qū)分大小寫。第二個(gè)/后面的x表示忽略模式中的空白。

我們可以將上面的這個(gè)表達(dá)式添加到Snort的規(guī)則里面去:alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"SQL Injection - Paranoid"; flow:to_server,established;uricontent:".pl";pcre:"/(\%27)|(\’)|(\-\-)|(%23)|(#)/i"; classtype:Web-application-attack; sid:9099; rev:5;)

在這個(gè)例子里面,uriconten 關(guān)鍵字部分,我們使用了“.pl”,因?yàn)樵谖覀兊臏y(cè)試環(huán)境中,我們的CGI腳本是使用Perl寫成的。這部分內(nèi)容取決于你的特定應(yīng)用,可能是 “.php”、 “.asp”、“.jsp”等。Pcre關(guān)鍵字的內(nèi)容,就是將要對(duì).pl文件進(jìn)行檢查的模式。你可以從這個(gè)正則表達(dá)式受到啟發(fā),以便寫出更多的Snort 規(guī)則。

SQL查詢中還有可能在Where語(yǔ)句中包含純數(shù)字,像這樣:

select value1, value2, num_value3 from database where num_value3=some_user_supplied_number

在這個(gè)例子中,攻擊者可能執(zhí)行一條附加的SQL查詢語(yǔ)句,像這樣就可以:

3; insert values into some_other_table

上面的那條Snort規(guī)則可以擴(kuò)展一下,用來(lái)過(guò)濾分號(hào)(;)的出現(xiàn)。然而,分號(hào)也可能出現(xiàn)在正常的HTTP交互中。為了減少誤檢,上面的規(guī)則可以修改為從等號(hào)(=)之后的部分進(jìn)行匹配。當(dāng)用戶使用GET或者POST作請(qǐng)求時(shí),輸入域一般會(huì)像這樣出現(xiàn):

username=some_user_supplied_value&password=some_user_supplied_value

因此,對(duì)用戶的SQL注入嘗試的檢測(cè)可以從等號(hào)(=)或者它的16進(jìn)制值開始檢測(cè),修改后的SQL元字符檢測(cè)的正則表達(dá)式如下:

/((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(;))/ix

這個(gè)規(guī)則首先檢查等號(hào)(=)或者它的16進(jìn)制%3D。接下來(lái),[^\n]*的含義就是匹配零個(gè)或者多個(gè)非換行符字符,其中,\n是Perl中的換行符,^是排除符號(hào),也就是說(shuō)非換行符,*的含義就是對(duì)它前面的字符進(jìn)行零次或者多次匹配。接下來(lái)的部分,跟前面沒有什么不同了。

一個(gè)典型的SQL注入嘗試過(guò)程,通常會(huì)圍繞著單引號(hào)來(lái)制造一下查詢,來(lái)看一下返回的結(jié)果正確與否,從而確定是否存在SQL注入漏洞。大多數(shù)的例子都是使用了字符串1’or’1’= ’1。然而,要對(duì)這類字符串進(jìn)行檢測(cè)可不是件容易的事情,因?yàn)楣粽呖梢暂p易的構(gòu)造出一些具有等價(jià)作用的字符串,如1’or2>1--。這樣,唯一不變的部分也就剩下了一個(gè)常數(shù)和接下來(lái)的字符串’or’了。對(duì)于這類攻擊,我們可以構(gòu)造如下的正則表達(dá)式,來(lái)進(jìn)行檢測(cè),典型的SQL注入攻擊的正則表達(dá)式:

/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

\w(注意,這里的w是小寫的,Perl中的用于模式匹配的\w和\W意義截然不同)指的是大小寫字母或者數(shù)字,加了*之后的意義就是用來(lái)匹配一個(gè)或者多個(gè)數(shù)字或者字母。(\%27)|\’用來(lái)匹配單引號(hào)或者它的16進(jìn)制值。(\%6F)|o|(\%4F))((\%72)|r|(\%52),%6F和%4F分別為字母o的小大寫16進(jìn)制值,%72和%52分別為字母r的小大寫16進(jìn)制值。因?yàn)槭褂玫膇選項(xiàng),所以沒有必要將字母o和r的大小寫形式都寫出來(lái)。這樣,單詞 or的各種形式,我們都已經(jīng)考慮到了。

同樣的,在SQL注入中,我們也經(jīng)常會(huì)用到union關(guān)鍵字,我們可以如下設(shè)置規(guī)則,針對(duì)UNION關(guān)鍵字的SQL注入的檢測(cè)的正則表達(dá)式:

/((\%27)|(\’))union/ix

有了上面的基礎(chǔ),這句規(guī)則就不需要多作解釋了。對(duì)于同樣會(huì)經(jīng)常碰到的select,insert,update,delete,drop等語(yǔ)句,我們可以舉一反三,靈活運(yùn)用規(guī)則進(jìn)行設(shè)置了。

在SQL 注入中,我們?yōu)榱耸沟肧QL服務(wù)器返回錯(cuò)誤,然后通過(guò)錯(cuò)誤來(lái)獲得有用的信息,經(jīng)常會(huì)出現(xiàn)諸如1=(select name from student where sno=’200021’)。這個(gè)子查詢語(yǔ)句返回的值是字符類型,而1是數(shù)字,這時(shí)候就會(huì)有錯(cuò)誤爆出,從而泄漏了name字段的內(nèi)容。這樣就引出了,我們必須能夠?qū)@種常見的注入進(jìn)行監(jiān)測(cè)。對(duì)于這類攻擊,我們不能夠從1開始做限制,因?yàn)檫@樣可能導(dǎo)致大量的誤檢,顯然,解決方法就是對(duì)select關(guān)鍵字進(jìn)行監(jiān)測(cè),因?yàn)閁RL中提交的信息,正常情況下是不會(huì)包含select關(guān)鍵字的。

2.5對(duì)1=(select name from student where sno=’200021’)類似的查詢進(jìn)行監(jiān)測(cè)的正則表達(dá)式:

/((\%27)|(\’))select/ix

在MS SQL Server中,經(jīng)常被利用的還有擴(kuò)展存儲(chǔ)過(guò)程xp_cmdshell、xp_regread 、xp_regwrite等。這類存儲(chǔ)過(guò)程在調(diào)用的時(shí)候,都要使用到exec關(guān)鍵字。另外,系統(tǒng)的存儲(chǔ)過(guò)程通常都是以sp或者xp開頭的,所以,我們針對(duì)這類SQL注入,可以如下配置正則表達(dá)式。針對(duì)MS SQL Server的SQL注入進(jìn)行檢測(cè)的正則表達(dá)式:

/exec(\s|\+)+(s|x)p\w+/ix

exec為調(diào)用存儲(chǔ)過(guò)程的關(guān)鍵字。(\s|\+)代表空格或者它的HTTP編碼的等價(jià)替換。+用于使前面的和后面的字符至少匹配一次,這樣,(\s|\+)+(s|x)的意思就是使空格和s與x中的一個(gè)進(jìn)行至少一次的匹配。\w+在前面已經(jīng)解釋過(guò)了,這里不多說(shuō)了。

上面,我們僅僅是對(duì)SQL注入的一些最基本的方法進(jìn)行監(jiān)測(cè),但是,熟悉SQL注入的人都知道,SQL注入中用的方法還有很多,我們?cè)谶@里不可能一一寫到,所以請(qǐng)讀者體諒。

2.針對(duì)跨站腳本攻擊的正則表達(dá)式

在發(fā)動(dòng)一次跨站腳本攻擊之前,為了測(cè)試網(wǎng)站的漏洞,攻擊者通常要做一個(gè)簡(jiǎn)單的HTML測(cè)試,這可能要涉及到HTML中的tag像<b>、 <i>、<u>等。同樣的,也可以使用一個(gè)簡(jiǎn)單的腳本如<script>alert("OK")< /script>。這可能是因?yàn)榇蠖鄶?shù)的關(guān)于CSS的討論文檔,都是使用了這樣一個(gè)簡(jiǎn)單的腳本例子來(lái)判斷一個(gè)站點(diǎn)是否可以進(jìn)行CSS攻擊。這類嘗試,我們可以通過(guò)Snort進(jìn)行檢測(cè)。一些高級(jí)一些的入侵者可能會(huì)使用變換的方式進(jìn)行測(cè)試,如將起對(duì)應(yīng)的16進(jìn)制值進(jìn)行等價(jià)替換,如< script>可以使用%3C%73%63%72%69%70%74%3E進(jìn)行替換。

下面的這個(gè)正則表達(dá)式就可以針對(duì)這類攻擊進(jìn)行檢測(cè)。它將捕獲使用<b>、<u>或者<script>的嘗試。這個(gè)正則表達(dá)式也是不區(qū)分大小寫的。我們必須對(duì)尖括號(hào)的符號(hào)和它的16進(jìn)制值都進(jìn)行匹配,左尖括號(hào)<的16進(jìn)制值為%3C,右尖括號(hào)>的16進(jìn)制值為%3E。簡(jiǎn)單CSS攻擊的正則表達(dá)式:

/((\%3C)|<)((\%2F)|\/)*[a-z0-9\%]+((\%3E)|>)/ix

((\ %3C)|<)是對(duì)左尖括號(hào)進(jìn)行檢測(cè)。((\%2F)|\/)*對(duì)表示tag標(biāo)志結(jié)束的斜杠或者16進(jìn)制值進(jìn)行匹配。[a-z0-9\%]+對(duì)一個(gè)以上的小寫字母或者阿拉伯?dāng)?shù)字進(jìn)行匹配。((\%3E)|>)對(duì)右尖括號(hào)或者它的16進(jìn)制值進(jìn)行匹配。再將這個(gè)寫成Snort規(guī)則就成了: alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"NII Cross-site scripting attempt"; flow:to_server,established; pcre:"/((\%3C)|<)((\%2F)|\/)*[a-z0-9\%]+((\%3E)|>)/i";classtype:Web-application-attack; sid:9000; rev:5;)

跨站腳本也可以通過(guò)使用<img src=>技術(shù)來(lái)實(shí)現(xiàn),對(duì)于這一類攻擊,我們可以這樣配置,來(lái)使得CSS攻擊不容易實(shí)現(xiàn)。針對(duì)<img src>的CSS攻擊的正則表達(dá)式:

/((\%3C)|<)((\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47))[^\n]+((\%3E)|>)/i

左右尖括號(hào)不再解釋。(\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47)是針對(duì)img的匹配。[^\n]+在前面也已經(jīng)說(shuō)過(guò)了。還有一種最偏執(zhí)的針對(duì)CSS攻擊的正則表達(dá)式:

/((\%3C)|<)[^\n]+((\%3E)|>)/i

這個(gè)正則表達(dá)式采用了最“惡毒”的辦法,就是將所有出現(xiàn)<>的地方全都認(rèn)為是CSS攻擊,夠毒吧,呵呵!但是,這種方法最容易引起誤檢,但是它卻實(shí)實(shí)在在的能夠有效防止CSS攻擊。

從某種程度上來(lái)說(shuō),跨站腳本攻擊似乎更好控制一些,其實(shí)不然,經(jīng)常關(guān)注黑防的讀者自有深刻的體會(huì),我就不多說(shuō)了。

3.自己動(dòng)手編寫規(guī)則

當(dāng)編寫Snort規(guī)則時(shí),首先考慮的是效率和速度,好的規(guī)則要包含content選項(xiàng)。2.0版本以后,Snort改變了檢測(cè)引擎的工作方式,在第一階段就作一個(gè)集合模式匹配。一個(gè)content選項(xiàng)越長(zhǎng),這個(gè)匹配就越精確。如果一條規(guī)則不包含content選項(xiàng),它們將使整個(gè)系統(tǒng)慢下來(lái)。

當(dāng)編寫規(guī)則時(shí),盡量要把目標(biāo)定位在攻擊的地方(例如,將目標(biāo)定位在1025的偏移量等等)而不僅僅是泛泛的指定(如,在這匹配腳本代碼)。Content規(guī)則是大小寫敏感的(除非你使用了nocase選項(xiàng))。不要忘記content是大小寫敏感的和大多數(shù)程序的命令都是大寫字母。FTP就是一個(gè)很好的例子??紤]如下的規(guī)則:

alert tcp any any -> 192.168.1.0/24 21 (content: "user root"; msg: "FTP root login";)

alert tcp any any -> 192.168.1.0/24 21 (content: "USER root"; msg: "FTP root login";)

上面的第二條規(guī)則能檢測(cè)出大多數(shù)的自動(dòng)以root登陸的嘗試,而第一條規(guī)則就不行。Internet 守護(hù)進(jìn)程在接受輸入時(shí)是很隨便的。在編寫規(guī)則時(shí),很好的理解協(xié)議規(guī)范將降低錯(cuò)過(guò)攻擊的機(jī)會(huì)。

4.結(jié)論

本文中,我們給出了各種各樣的針對(duì)SQL注入和跨站腳本攻擊的正則表達(dá)式。雖然有一些是很偏執(zhí)和粗暴的,因?yàn)榧词褂幸稽c(diǎn)發(fā)起攻擊的企圖,這樣的正則表達(dá)式都會(huì)引起Snort的報(bào)警。這樣的一些偏執(zhí)的正則表達(dá)式最容易引起誤檢,為了盡量減少這樣的誤檢,我們要盡量的精確設(shè)置正則表達(dá)式。同時(shí),我們前面介紹的方法也只是針對(duì)現(xiàn)在比較常見的攻擊做出的檢測(cè),黑客的對(duì)抗技術(shù)中,總是此起彼長(zhǎng),“道高一尺,魔高一丈”,當(dāng)我們發(fā)現(xiàn)了新的入侵的方法時(shí),要對(duì)某些規(guī)則做出適當(dāng)?shù)恼{(diào)整甚至添加新的規(guī)則,才能夠適應(yīng)新的安全要求。這點(diǎn)相信各位早都深有體會(huì)了,本文結(jié)合我的一點(diǎn)理解寫出,希望和大家共同學(xué)習(xí)

原文來(lái)自『查皮博客』:http://chapi.blogbus.com/tag/SQL%E6%B3%A8%E5%85%A5/
原文來(lái)自『查皮博客』:http://chapi.blogbus.com/tag/SQL%E6%B3%A8%E5%85%A5/

轉(zhuǎn)載于:https://www.cnblogs.com/fangxianjun/archive/2011/04/08/2009870.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的【转载】用Snort巧妙检测SQL注入和跨站脚本攻击的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。