1。突破script的限制。
例如,某網(wǎng)頁上有一文本框,允許你輸入用戶名稱,但是它限制你只能輸入4個(gè)字符。許多程序都是在客戶端限制,然后用msgbox彈出錯(cuò)誤提示。如果你攻擊時(shí)需要突破此限制,只需要在本地做一個(gè)一樣的主頁,只是取消了限制,通常是去掉VBscript或IavaScript的限制程序,就可以成功突破。
如果是javascript做的,干脆臨時(shí)把瀏覽器的腳本支持關(guān)掉。如果是
有經(jīng)驗(yàn)的程序員常常在程序后臺再做一遍檢驗(yàn),如果有錯(cuò)誤就用response.write或類似的語句輸出錯(cuò)誤。
2。對SQL的突破
例如某網(wǎng)頁需要你輸入用戶名稱和口令,這樣就有兩個(gè)文本框等待你的輸入,現(xiàn)在我們假設(shè)有一用戶adam,我們不知道他的口令,卻想以他的身份登陸。
正常情況下,我們在第一個(gè)文本框輸入adam,第二個(gè)文本框輸入1234之類的密碼,如果密碼正確就可以進(jìn)入,否則報(bào)錯(cuò)。
程序中的查詢語句可能是:
sql="select * from user where username='"&text1.value&"' and passwd= '"&text2.value&"'"
執(zhí)行時(shí)候就是
select * from user where username='adam' and passwd='1234'
好了,
如果我們在text2里輸入的不是1234,而是1234'"&"'or 1=1
我們的sql語句就成了,
select * from user where username='adam' and passwd='1234' or 1=1
我們就可以進(jìn)入了。。。
有經(jīng)驗(yàn)的用戶就在程序中增加對單引號等特殊字符的過濾。
但是,一般人習(xí)慣上有兩種登錄認(rèn)證方式我就用ASP的VBScript做例子了:
一是用select * from ... where username = ' & Request.Form("username") & "password = " & Request.Form("password"),然后判斷結(jié)果是否為空來驗(yàn)證。其實(shí)還有一種方式:
用select * from ... where username = ' & Request.Form("username"), 然后判斷結(jié)果集中的密碼是否和輸入相同來驗(yàn)證,這種方式就安全一些了。
3。利用多語句執(zhí)行漏洞。
根據(jù)上面的思路,如果用戶根據(jù)書名(例如linux入門)查詢所有的書,SQL語句為
select book.name,book.content from book where bookname='linux入門'
如果我們輸入的不是linux入門而是 linux入門' delete from user where '1' = '1
從而構(gòu)成對表的刪除。
成功的前提條件是對方允許多條語句的執(zhí)行。
由于程序沒有處理邊界符“'”產(chǎn)生的漏洞的危害程度和結(jié)果集的類型及數(shù)據(jù)庫的配置有很大的關(guān)系。首先說結(jié)果集,如果結(jié)果集只支持單條的SQL語句,那么你所能做的只是上面提到的那種在密碼框內(nèi)輸入' or '1' = '1來登錄,其他的做不了。
我們還可以用這種方法在數(shù)據(jù)庫里增加用戶。
推薦:2007年11月網(wǎng)絡(luò)工程師考試全真模擬試題一下午試卷
更多軟考資料請?jiān)L問:考試吧軟件水平考試欄目
希望與更多網(wǎng)友交流,請進(jìn)入考試吧軟件水平考試論壇
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |