安全腳本程序的編寫 V1.0
更新時(shí)間:2006年11月23日 00:00:00 作者:
我看到過(guò)很多的對(duì)腳本的加密方法,都很不錯(cuò),有的是專門的加密軟件,有的是通過(guò)一些技巧加上利用語(yǔ)言的特性進(jìn)行加
密的,例如隨機(jī)生成一個(gè)
密匙,把密匙放在"不可見(jiàn)的"地方,通過(guò)一些算法對(duì)腳本進(jìn)行加解密,就是由于某些系統(tǒng)漏洞導(dǎo)致你的腳本源代碼泄漏,
也無(wú)濟(jì)于事。
4 .實(shí)例說(shuō)明
下面這個(gè)例子是在網(wǎng)上經(jīng)常被提到的,這是個(gè)非常經(jīng)典的例子,所以在這里通過(guò)這個(gè)實(shí)例告訴大家可能存在的危險(xiǎn)。
問(wèn)題描述:
大部分網(wǎng)站把密碼放到數(shù)據(jù)庫(kù)中,在登陸驗(yàn)證中用以下sql,(以asp為例)
sql="select * from user where username='"&username&"'and pass='"& pass &'"
此時(shí),您只要根據(jù)sql構(gòu)造一個(gè)特殊的用戶名和密碼,如:ben' or '1'='1
就可以進(jìn)入本來(lái)你沒(méi)有特權(quán)的頁(yè)面。再來(lái)看看上面那個(gè)語(yǔ)句吧:
sql="select * from user where username='"&username&"'and pass='"& pass&'"
此時(shí),您只要根據(jù)sql構(gòu)造一個(gè)特殊的用戶名和密碼,如:ben' or '1'='1 這樣,程序?qū)?huì)變成這樣:
sql="select*from username where
username="&ben'or'1'=1&"and pass="&pass&" or 是一個(gè)邏輯運(yùn)算符,作用是在判斷兩個(gè)條件的時(shí)候,只要其中一個(gè)條件成
立,那么等式
將會(huì)成立.而在語(yǔ)言中,是以1來(lái)代表真的(成立).那么在這行語(yǔ)句中,原語(yǔ)句的"and"驗(yàn)證將不再繼續(xù),而因?yàn)?1=1"和"or"令
語(yǔ)句返回為真值.。
另外我們也可以構(gòu)造以下的用戶名:
username='aa' or username<>'aa'
pass='aa' or pass<>'aa'
相應(yīng)的在瀏覽器端的用戶名框內(nèi)寫入:aa' or username<>'aa 口令框內(nèi)寫入:aa' or pass<>'aa,注意這兩個(gè)字符串
兩頭是沒(méi)有'的。這
樣就可以成功的騙過(guò)系統(tǒng)而進(jìn)入。
具體實(shí)施是這樣的,首先我會(huì)到注冊(cè)的地方去收集信息,了解盡可能多的信息,例如目標(biāo)數(shù)據(jù)庫(kù)中都有用戶的什么樣的信
息,隨便的填寫信息然后
提交,當(dāng)你要注冊(cè)的用戶名被注冊(cè)的是有系統(tǒng)會(huì)提示你已被注冊(cè),有的網(wǎng)站做的更好的,就是他們專門給你設(shè)置的檢測(cè)是
否有已經(jīng)被注冊(cè)的功能,
通過(guò)這樣就會(huì)非常容易的找到目標(biāo)--那個(gè)提示已被注冊(cè)的用戶,讓后你在這個(gè)注冊(cè)頁(yè)里填寫一些特殊的字符,如',/,,等
字符看系統(tǒng)如何提示,以
證明程序員是否注意到了應(yīng)該過(guò)濾字符或懂得是否應(yīng)該過(guò)濾那些字符,在這頁(yè)進(jìn)行嘗試是因?yàn)橛械木W(wǎng)站在登錄的時(shí)候他會(huì)
記錄你的ip地址,當(dāng)然你
也可以找一個(gè)比你直接登錄要快的代理服務(wù)器來(lái)做跳板。后面你要做的就是察看登錄頁(yè)的html源代碼,看看是否有在客戶
端的字符過(guò)濾,看看這個(gè)
程序員是用什么風(fēng)格來(lái)編寫程序,盡可能多的了解程序編寫風(fēng)格,這對(duì)你以后的某些判斷有好處。如果有在客戶端的過(guò)濾
也不怕,你要搞清是什么
樣的過(guò)濾,能不能對(duì)攻擊造成威脅,不要一看有過(guò)濾就害怕,可以嘗試著用別的方法繞,就是使用自己精心打造的獨(dú)立腳
本,進(jìn)行攻擊。然后你要
看看form的action中的url是否可以直接提交,在瀏覽器地址欄里直接提交,看看返回什么,是否有來(lái)路檢測(cè)。還有很多細(xì)
小的地方,你也應(yīng)該可
以注意到,例如那些地方程序員的整體的編寫風(fēng)格是什么,變量名定義的風(fēng)格是什么等等,這個(gè)會(huì)幫我們"猜"到很多東
西。還有別的其他什么,我
也記不太清楚了,臨場(chǎng)發(fā)揮吧。通過(guò)這些了解我們有如下幾種可能:
1.那個(gè)程序員非常善良相信全世界都是好人,什么都沒(méi)做,根本沒(méi)有任何檢測(cè)機(jī)制,我們直接用username='aa' or
username<>'aa',
pass='aa' or pass<>'aa'就可以搞定,現(xiàn)在這么善良的人少啦,可是你要是有耐心,找到這種人還是不難的。
2.這個(gè)程序員可能聽(tīng)別人提起過(guò)一些安全問(wèn)題,畢竟現(xiàn)在這個(gè)那里都有人說(shuō),很多書中都有提及,但是做得不夠好,他只
進(jìn)行了簡(jiǎn)單的輸入過(guò)濾。
過(guò)濾有兩種方式,一種是在客戶端的過(guò)濾,一種是在服務(wù)器端的過(guò)濾?,F(xiàn)在很多的程序員考慮到再服務(wù)器端進(jìn)行過(guò)濾可能
給服務(wù)器造成更多的負(fù)荷
,會(huì)把檢測(cè)過(guò)程放在客戶端。如果他在服務(wù)器端沒(méi)做任何事情,那么還是可以對(duì)其進(jìn)行攻擊的,我可以將這個(gè)登錄頁(yè)的源
代碼COPY下來(lái),然后自
己建立一個(gè)文件把這些代碼PASTE進(jìn)去,再對(duì)這個(gè)文件進(jìn)行進(jìn)一步的深加工,去掉原來(lái)頁(yè)的過(guò)濾機(jī)制,或者直接將攻擊代碼
寫到這個(gè)文件中去,然
后將form中的action中的地址改成絕對(duì)地址,也就是將文件名改成"http://www.target.com/targer.php"這樣,然后就可
以提交啦。但是如
果服務(wù)器端加上了"來(lái)路檢測(cè)",你就白玩了。如果這樣還是不行,我再換一種方法,在瀏覽器的地址欄里用?來(lái)輸入?yún)?
數(shù),就好像
"http://www.targer.com/targer.php?username='aa' or username<>'aa'&pass='aa' or pass<>'aa' "然后敲回車吧,其
實(shí)應(yīng)該先
嘗試這種方法因?yàn)檫@用方法更簡(jiǎn)單,防護(hù)起來(lái)也很簡(jiǎn)單,這種提交方式不是post 而是get ,只要服務(wù)器端程序檢測(cè)你的提
交方法,就可以kill掉這
個(gè)陰謀。如果單純的只檢測(cè)了"來(lái)路",還是不太安全的,可以先正確的提交一次,在提交過(guò)程中馬上停止,就是保存這個(gè)
環(huán)境,然后再構(gòu)造請(qǐng)求。
(我做過(guò)幾次試驗(yàn)得到的結(jié)果都不太一樣,應(yīng)該是和終止的時(shí)機(jī)有關(guān),歡迎大家來(lái)交流)。
3.一個(gè)很出色的程序員,安全意識(shí)非常高,他在服務(wù)器端做了如下檢測(cè):檢測(cè)提交的方法;檢測(cè)提交的"來(lái)路";檢測(cè)提交
內(nèi)容的長(zhǎng)度;全面檢測(cè)提
交內(nèi)容,這樣我們就很難通過(guò)上面的方法對(duì)其進(jìn)行攻擊,那到保密的資料就已經(jīng)不太可能了(如果各位還有什么好的辦
法,請(qǐng)一定來(lái)信告訴小弟,
小弟在這里先謝了)。但是我還想說(shuō)的是攻擊并不代表是非要入侵進(jìn)去,拿到某些東西才叫入侵,對(duì)你的機(jī)器進(jìn)行破壞也
叫入侵啊,例如提交一些
錯(cuò)誤的請(qǐng)求,腳本解釋程序就會(huì)非常規(guī)矩的給你返回錯(cuò)誤信息,最淺顯的后果就是暴露物理路經(jīng),有的時(shí)候一些特殊的請(qǐng)
求會(huì)使web服務(wù)宕掉,這
些個(gè)我認(rèn)為絕對(duì)是屬于攻擊,絕對(duì)是危害,也許你認(rèn)為暴露物理路徑?jīng)]有什么,是在單獨(dú)看來(lái)沒(méi)有什么,但要是在一個(gè)有
計(jì)劃的攻擊里,這個(gè)就會(huì)
發(fā)揮很多作用,那時(shí)你可能還會(huì)莫名為什么他們找到了我的文件呢。也許有人認(rèn)為這個(gè)是腳本解釋程序的bug,也許有的
是,但是返回錯(cuò)誤信息絕
對(duì)不是腳本解釋程序的錯(cuò)誤,這個(gè)是每個(gè)解釋程序都要做到的,在我看來(lái)這個(gè)應(yīng)該是還是程序員的問(wèn)題,程序員沒(méi)有做好
對(duì)錯(cuò)誤的處理。每一本教
你如何編寫程序的書籍里基本都會(huì)有錯(cuò)誤處理之類的章節(jié),并且每種語(yǔ)言基本都有錯(cuò)誤處理函數(shù)和方法,只不過(guò)你沒(méi)有想
到罷了。至于究竟要怎么
處理那就要看你對(duì)cgi程序安全的熟悉程度了,那就要看你對(duì)這種腳本語(yǔ)言的特性熟悉多少了,說(shuō)到底就是經(jīng)驗(yàn),唯一的辦
法就是多看多寫多想多
交流。
4.非常優(yōu)秀的程序員,以上那些做的都非常好(也許就是你啊,畢竟不難嘛,加上很少的代碼就可以了),怎么辦??怎
么辦?!怎么辦??!在一
旁偷偷的佩服吧!哈哈。
5. 其它注意事項(xiàng):思路和方法
指導(dǎo)思想:
I.嚴(yán)格控制程序與用戶交互的途徑
II.嚴(yán)格控制程序與用戶交互的內(nèi)容
III.盡可能好的保護(hù)我們控制
基本思路:
I.為沒(méi)一個(gè)功能寫一個(gè)獨(dú)立的程序,程序頁(yè)
II.盡可能少的讓客戶了解你的服務(wù)器端信息
III.不要用"客戶應(yīng)該這么寫"這個(gè)思路想問(wèn)題
IV.盡可能多的想到不可能發(fā)生的事情
基本方法:
盡可能多的控制交互:
I.檢測(cè)提交的方法,就是控制他的post還是get;
II.檢測(cè)提交的"來(lái)路",就是檢測(cè)一個(gè)環(huán)境變量HTTP_REFERER;
III.檢測(cè)提交內(nèi)容的長(zhǎng)度;
IV全面檢測(cè)提交內(nèi)容;
積極-消極防護(hù):
I.盡可能多的錯(cuò)誤處理,例如當(dāng)檢測(cè)到了不正確的輸入時(shí),應(yīng)該怎么做,是強(qiáng)制返回,還是發(fā)出警告;
II.充分發(fā)揮日志功用,例如在你檢測(cè)到了不正確的提交時(shí),就記錄下客戶端的信息,例如IP,系統(tǒng)配置,請(qǐng)求等等,畢竟
現(xiàn)在是技術(shù)飛躍的時(shí)代,
不能保證可以想到每一種可能,這也是我在這篇文章里不止一次提到"盡可能"這個(gè)詞的原因。充分的日志記錄不全是為了
抓住入侵者(如果入侵者
使用了跳板,記錄了IP也是沒(méi)有用的),更重要的是為了能發(fā)現(xiàn)問(wèn)題的所在,找到問(wèn)題,改正問(wèn)題,亡羊補(bǔ)牢,這個(gè)才是
最重要的。
III.充分發(fā)揮你的想象力,用一種入侵者的思想考慮問(wèn)題,用一種另類的思想考慮問(wèn)題,盡可能想到不可能發(fā)生的事,把
問(wèn)題扼殺在萌芽里。
我們xundi哥說(shuō)的好:掌握方法?。?!現(xiàn)在腳本語(yǔ)言層出不窮,asp,perl,php,jsp等等,基本不可能精通每一種,(也
許你厲害,都能精通,
我比較呆,會(huì)一個(gè)就不錯(cuò)啦),但是要是掌握了方法就不同了啊,各位網(wǎng)絡(luò)的精英舉一反三觸類旁通,肯定是優(yōu)秀的不得
了。我寫腳本一共也沒(méi)多
少天,寫這個(gè)東西我知道肯定是班門弄斧了,錯(cuò)誤之處還請(qǐng)各位大蝦抱著挽救和幫助的精神,告知小弟(方式、方法、態(tài)
度不限),小弟我在這里
先謝了。寫這個(gè)東西,我只是想說(shuō)說(shuō)小弟的一些小的心得,與大家共勉,我想告訴大家的就是"領(lǐng)會(huì)精神",嘿嘿,"領(lǐng)會(huì)精
神"。大家要是有什么好
的方法,希望不要保留,充分發(fā)揮網(wǎng)絡(luò)的自用共享,拿出來(lái),大家交流交流,不勝感激。
襲來(lái)的,這種東西小弟不敢自己寫(嘿嘿,實(shí)際還有不少懶的成分,哈哈),希望大家不要見(jiàn)怪。
相關(guān)文章
ASP codepage 頁(yè)面編碼使用說(shuō)明
很多人在做ASP的時(shí)候都會(huì)遇到一些頁(yè)面亂碼的問(wèn)題,很多情況如果頁(yè)面沒(méi)有指定編碼或前后臺(tái)的編碼指定的不一致都會(huì)出現(xiàn)亂碼。2010-06-06ASP的Error對(duì)象知識(shí)簡(jiǎn)析
這篇文章主要介紹了ASP的Error對(duì)象,需要的朋友可以參考下2015-09-09javascript asp教程第十一課--Application 對(duì)象
javascript asp教程第十一課--Application 對(duì)象...2007-03-03ASP編程入門進(jìn)階(八):內(nèi)置對(duì)象Session
ASP編程入門進(jìn)階(八):內(nèi)置對(duì)象Session...2007-01-01ASP編程入門進(jìn)階(十三):Ad & Content Rotator
ASP編程入門進(jìn)階(十三):Ad & Content Rotator...2007-01-01ASP 中 DateDiff 函數(shù)詳解 主要實(shí)現(xiàn)兩日期加減操作
ASP 中 DateDiff 函數(shù)詳解 主要實(shí)現(xiàn)兩日期加減操作...2007-11-11