頁(yè)面攻擊可以分為兩大類
一種是以利用瀏覽器漏洞在訪問(wèn)頁(yè)面里編寫(xiě)惡意代碼對(duì)訪問(wèn)者的攻擊。這里我們可以理解為服務(wù)端對(duì)客戶端的攻擊。另一種剛好相反,是訪問(wèn)者利用頁(yè)面的漏洞對(duì)服務(wù)器的攻擊。我們這里主要講的是對(duì)服務(wù)器的攻擊。
現(xiàn)在網(wǎng)站程序的編寫(xiě)里為了豐富站點(diǎn)的內(nèi)容和功能,大面積的采用了動(dòng)態(tài)頁(yè)。在動(dòng)態(tài)頁(yè)里面最大的失誤是無(wú)條件的相信用戶的輸入。如果一個(gè)用戶受到瀏覽器的限制,可以通過(guò)瀏覽器和服務(wù)器的交互來(lái)打開(kāi)攻擊WEB應(yīng)用的大門。在現(xiàn)在的黑客站點(diǎn)上攻擊和操作WEB站點(diǎn)的工具好多的。完全可以不受限于瀏覽器。
分析一下。程序員在編寫(xiě)的用戶表單的時(shí)候大多會(huì)做這樣的假設(shè):
在用戶名里用戶會(huì)輸入的人們通常習(xí)慣的用戶名字。密碼欄也一樣。他們經(jīng)常就不會(huì)想到用戶名里要是輸入了帶有引號(hào)之類的特殊字符會(huì)怎樣。
我們來(lái)看一下這段代碼
C#代碼查詢后端SQL Server數(shù)據(jù)庫(kù),假設(shè)user和password變量的值直接取自用戶輸入:
SqlDataAdapter my_query = new SqlDataAdapter(
"SELECT * FROM accounts WHERE acc_user='" + user + "' AND acc_password='" + password, the_connection);
這就是上面說(shuō)過(guò)的用戶表單
在正常情況下這段代碼也可以達(dá)到預(yù)期的效果,如果你的用戶名和密碼在其數(shù)據(jù)庫(kù)里不能對(duì)應(yīng)上就不能正常的登陸。
但如果在user輸入域中輸入“OR 1=1”,沒(méi)這個(gè)樣的用戶吧。。。。但我們同樣能夠登陸,而且不需要密碼!甚至在查詢后加上適當(dāng)?shù)恼{(diào)用還可以執(zhí)行SHELL命令。
大名鼎鼎的SQL注入式攻擊就是是利用了篡改參數(shù)”部分描述。
我們可以在輸入處插入特殊字符來(lái)改變SQL查詢的本意,欺騙數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行不正常查詢。這樣就有可能獲得后端數(shù)據(jù)庫(kù)里保存的所有信息。
最后在舉例一段腳本執(zhí)行的攻擊方式
先看下面這段代碼:
<%@ Page Language="vb" %>
<asp:Label id="Label1" runat="server">
標(biāo)簽文字
</asp:Label>
<form method="post" runat="server" ID="Form1">
反饋信息輸入處<br>
<asp:Textbox ID="feedback" runat="server"/><br>
<asp:Button id="cmdSubmit" runat="server"
Text="提交!" OnClick="do_feedback">
</asp:Button>
</form>
<script runat="server">
Sub do_feedback(sender As Object, e As System.EventArgs)
Label1.Text=feedback.Text
End Sub
</script>
這也是很多頁(yè)面都使用的
但這里面卻有一個(gè)漏洞。
我們可以把特殊的用戶嵌入到應(yīng)答頁(yè)面。
<script>alert(document.cookie)
</script>
這其實(shí)也就是利用JavaScript代碼構(gòu)造的一個(gè)特殊查詢。