国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

網頁編程安全漏洞全接觸

2024-04-27 13:54:23
字體:
來源:轉載
供稿:網友

網絡安全已經成為互聯網最熱門的話題之一,與現實相對應的,網絡安全的部屬、實現也就成為一個企業特別關心的問題。所以,現在我們可以很容易的看到各個企業在設計自己網絡、構建企業網站的時候,對于網絡安全的投入還是比較大方的,特別是一些敏感信息比較多的網站,比如銀行、證券等企業,對于網絡安全更是不遺余力,市場上各種宣傳、廣告,也都大力推廣各種安全產品,比如防火墻、入侵檢測、企業防病毒等一系列的產品。但是,是不是使用了這些產品,網絡特別是網站就真的安全了?不一定,即使這些安全設備最高檔、設置也很合理,網站還是有被攻擊甚至完全被控制的可能。我們知道,現在的網站特別是稍微大一點的網站,一般都采用aspphp或者jsp等腳本語言來連接數據庫,取得數據庫里面的數據生成動態網頁,這樣,當一個網站完全建立的以后,程序就會很多,特別是網頁設計的特殊性,服務器與用戶的交互程序特別多,所以,如果程序員不是很有經驗或者沒有強烈的安全意識,程序的漏洞就會很多,給網站帶來不可估量的安全隱患。這些程序漏洞,一定程度上,可能比網站服務器的漏洞更加嚴重,因為這些漏洞防火墻或者入侵檢測系統根本無法防止。
一、編程漏洞的形成
編程漏洞怎么形成的呢?我們需要對網頁編程有比較全面的認識才可以理解。首先,我們來看看網頁編程的特點。
1、網頁編程交互性強
之所以采用各種語言來設計網站而不直接采用HTML,目的就是為了更好的管理網站資源,增加網站與瀏覽者之間的交互。所以,在網站設計的時候,一些常見的交互編程是少不了的,比如留言版、BBS論壇,聊天室等,這些程序最大的共同點就是用戶輸入很多資料,通過這些資料與其他瀏覽者交流或者與網站管理者交流。而交互的特點,正式漏洞形成的一大原因,因為用戶輸入信息是不可預測的,如果程序沒有考慮到或者考慮不全面一些安全問題,用戶輸入就有可能成為攻擊事件,不管有意還是無意。
2、網頁編程字符處理特別多
上面我們談到,交互其實就是信息的流通。所以,這些信息的處理就是大問題,怎樣嚴格控制用戶輸入信息的內容、信息格式、信息長度都是編程需要考慮的問題。
3、網頁編程涉及安全最里層
我們知道,網頁編程直接和服務器打交道,這些程序都是直接和網站目錄、網站數據庫設置網站設置、系統設置相關,通過這些程序,可以訪問網站目錄、設置等幾乎所有服務器內容。仔細想,這些程序其實都是很有潛在安全問題的,因為它們太敏感了。所以,如果程序設計有漏洞,幾乎就等于網站有漏洞,甚至完全開放。
4、網頁編程整體人員基礎較差
網頁編程人員的技術素質,這個問題其實我們可能比較少關注。在部分傳統程序員眼中,網頁程序設計其實不能稱為程序員,他們認為網頁程序設計,只需要美工好就可以了,完全沒有技巧可言,不叫真正的編程。之所以形成這種觀點,有幾個原因。一是網頁編程相對比較簡單,變化較少,基本上,網頁編程可以很簡單的概括出幾個類型:留言版、論壇、聊天室、郵件列表、新聞發布、軟件下載等,而這些類型的編程,大部分都有模式可循,和傳統編程相比,的確比較簡單,任意掌握;二是網頁編程人員大部分半路出家,專業的程序員相對較少,編程的系統訓練較少,可能編程的基礎也比較弱,所以,編程方面可以還是有一些缺陷的;三是部分網站直接下載網上免費程序來建立網站,這些程序的健壯性、安全性都沒有嚴格考慮,如果網站采用者不自己修改這些程序而直接照搬得話,很可能存在嚴重安全問題。
二、編程漏洞的類型
網頁編程相對比較簡單,漏洞的形成實例雖然很多,但是,都有一些內在地共同點可以尋找,以此歸納出一些共同的特點,供我們參考。
1、用戶輸入驗證不全面
在網站編程而言,有一個規則可能我們需要牢記,那就是對于用戶和用戶的輸入,都必須抱懷疑態度,不能完全信任。所以,對于用戶的輸入,不能簡單的直接采用,而必須經過嚴格驗證,確定用戶的輸入是否符合輸入規則才可以現實、錄入數據庫。總結用戶輸入驗證,應該包括以下幾個方面。
(1)輸入信息長度驗證
這一點可能我們比較少注意,因為我們往往認為一般用戶不會故意將輸入過分拉長,稍微有一些用戶可能搗亂,但是,在這一點上可能沒有危害。其實,只要我們仔細考慮,如果不進行輸入驗證,可能的危害會相當大,為什么?如果用戶輸入的信息達到幾個兆,而我們的程序又沒有驗證長度的話,想想的危害就有:a、程序驗證出錯;b、變量占用大量內存,出現內存溢出,至使服務器服務停止甚至關機。這樣的危害多大?
(2)輸入信息敏感字符檢查
這一點平時在設計程序的時候我們可能都有注意,主要關注的是一些javaScript的敏感字符,比如在設計留言版的時候,我們會將“<”等符號的信息去除,以免用戶留下頁面炸彈。但是,是否這些就已經足夠了呢?還遠遠不夠。我們還有很多沒有注意到,以下幾個方面我們需要特別注意。
a、留言版內容信息的過濾
這一點上面已經提到,平時也使用較多。
b、用戶名信息的過濾
這一點其實我們常常驗證,但是,用戶名的驗證我們往往只是驗證長度,沒有驗證Javascript或者HTML的標記,這樣就容易形成漏洞。比如用戶在用戶名填入“<h1>黑</h1>”,一般的用戶名驗證都可以通過,但是,顯示在網頁中卻是很不美觀的。這個輸入沒有破壞,但是,如果用戶名驗證不嚴,沒有長度限制,后果怎樣呢?這樣的漏洞在網上很多!
c、Email信息的驗證
Email信息我們往往也只驗證是否含有“@”符號,其他沒有限制,容易形成兩個漏洞:一是輸入信息過長的內存溢出漏洞;二是含有JavaScrript等字符信息,造成顯示用戶Email的時候形成頁面炸彈等。
d、搜索信息的驗證
搜索信息也要驗證嗎?當然要驗證!盡管搜索信息不會直接保存到網站服務器,但是,搜索信息確與數據庫或者服務器所有文件密切相關,如果搜索信息有問題,很容易就會暴露一些本來不應該暴露的數據庫信息或者文件信息。而且,如果用戶對程序比較了解,那么這種情況就更加需要注意,用戶可能會利用對于程序的了解,來設計一些很特別的搜索信息,而這些搜索信息其實是會檢索其他不應該檢索的數據庫表的,必然,用戶賬號密碼表等。因此,那些從網上下載回來的程序,一般不適宜于直接使用,因為它們的原代碼都可以被所有人知道,安全性當然不是很好。在這種情況下,我們一般驗證一些常見的用于數據庫操作的語句,必然搜索信息是否含有“Select”等,這樣來限制用戶輸入,避免信息的泄露。
2、頁面行為方式缺乏邏輯
可能這一點看起來很不好理解,頁面行為方式是什么呢?我們現在舉例說明。在一般的網站中,注冊新用戶的時候,一般會首先要求用戶輸入自己需要注冊的賬號信息,以此來驗證該賬號是否已經存在,確保用戶的單一性。這樣的要求,網站編程者的考慮很好,必然新浪注冊新用戶的時候,就是這樣要求的。然而,如果編程不謹慎,卻容易造成一個很大的漏洞,致使用戶信息流失、出錯等情況的發生。這種情況怎樣產生的呢?其實很簡單,這些頁面在編程的時候,認為如果用戶的注冊信息通過了剛才我們提到的“檢測時候存在該賬號”,那么,程序就認為這個賬號一定不存在,可以注冊,在真正的注冊頁面中,直接使用“Insert Into”語句將注冊信息插入用戶數據庫就可以了。仔細看看這樣的注冊過程,我們發現有一個大的漏洞,那就是,將注冊信息插入數據庫之前,并沒有再一次檢查這個用戶是否存在,而是很簡單的信任前一個檢測頁面傳來的賬號信息。我們知道,HTML文件是可以閱讀源代碼并且也可以直接保存的,如果用戶將注冊通過的頁面保存并且將上面的賬號信息修改為一個已經存在的賬號,由于程序認為該賬號已經通過檢測,于是,直接將該賬號插入數據庫,結果,原來擁有該賬號的用戶就被刪除或者信息被修改了。而如果這個賬號剛好是一個管理員賬號,結果會怎樣呢?
可能我們認為以上的情況很簡單,的確簡單,但是這種方式編程的程序員卻很多,隨便在網上找,我們可以找到很多這種方式編程的源代碼和已經采用的程序。
以上就是就是頁面行為方式缺乏邏輯的典型舉例,還有沒有其他的舉例呢?我們大家都很熟悉的一個例子。在電子商務初期,一些電子商務網站的程序很多存在這樣的漏洞,用戶可以隨意定義自己購買商品的價格!其實也就是這個原因造成的。
3、編程方式不成熟
很多時候,我們可能根本沒有意識到一些漏洞的產生,這時候,不是我們沒有注意安全問題,而是我們缺少經驗。這種情況,我們就需要多了解一些網絡攻擊者的進攻方式,以此來修改程序,加固網絡、程序安全。我們已經知道的一些漏洞就是這種情況產生的。在一些賬號密碼驗證中,有萬能密碼的存在就是這樣產生的,在下面的舉例中我們會詳細介紹。
4、沒有基于內容的檢測
上面第一條我們提到檢測的漏洞,這里,我們專門提出基于內容的檢測。前面多是技術上的考慮,這里,確實基于國家法律法規的考慮。一個網站的設計完成,除了技術的完善以外,還需要這個網站在國家法律法規內發布信息,不能隨意讓自己的網站成為一些別用心的人發布不法信息的平臺。所以 ,我們有必要對所有用戶輸入而且有可能顯示給其他用戶的信息進行內容檢測,一般有幾類:
(1)粗話的檢測,一般我們檢測一些常見的粗話;
(2)敏感詞匯的檢測,必然“法輪”“明慧”等這些詞;
(3)關系政治的詞匯,最好全部過濾,比如“共產黨”等;
(4)國家領導人的姓名,最好過濾;
當然,以上的一些規則,不一定全部要這樣,可以根據自己留言、或者論壇的性質來決定那些需要嚴格過濾。
三、攻擊實例
以下的實例,可能網絡上有些網站剛好存在這些問題,希望存在問題的網站能夠及時修改程序改正,讀者也不要利用這些漏洞做不符合國家法律法規的事情。
1、萬能密碼
這個漏洞,一些讀者可能已經知道,但是,由于網絡上依然很多網站存在這些漏洞,我們還是有必要詳細、全面的了解這個漏洞的形成原因和嚴重后果。首先,我們來看看漏洞的產生。這個漏洞是因為在程序驗證賬號密碼的時候程序不嚴謹造成的。我們在程序設計的時候,常常將賬號、密碼放在一個叫“User”的數據表中,設置“username”和“passWord”兩個字段,當驗證的時候,檢查用戶的輸入是否存在于這個數據表,如果存在,證明這個用戶合法;不存在,證明用戶不合法。漏洞的出現,就是這個驗證代碼的編寫不嚴謹造成的,我們來看原代碼。
‘連接數據庫
Set Conn=Server.CreateObject("ADODB.Connection")
Connstr="DBQ="+server.mappath("db/news.mdb")+";DefaultDir=;DRIVER={Microsoft access
Driver (*.mdb)};DriverId=25;FIL=MS Access;ImplicitCommitSync=Yes;MaxBufferSize=512;
MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;"
‘打開數據庫連接
Conn.Open connstr
‘數據庫選擇語句
MySQL="select * from user where userid=’”&txtuserid&”’ and pwd=‘”&txtpwd&” "
set rs=server.createobject("adodb.recordset")
rs.open mysql,conn,1,1 
 
if not (rs.eof) then
rs.close
conn.close 
response.redirect"ok_login.asp" 
end if 
 
在以上的代碼中,我們看mysql的定義,這里的txtuserid和txtpwd都是直接來自用戶的輸入,如果用戶構造特殊的用戶名或者密碼,就可以直接讓這里的Select條件為“真”,完全不必理會是否有合法賬號密碼。我們這里不直接給出萬能密碼,希望有經驗的讀者仔細分析select語句,找出可能的漏洞。
以上漏洞的修改其實很多方法,我們這里提出幾種比較完善的方法參考。首先,我們可以對用戶輸入的賬號、密碼進行嚴格檢查,除了二十六個字母和十個數字,其他任何字符都是非法的,也就是過濾那些非法的字符,確保用戶輸入合法。注意,這個過濾要針對用戶名和密碼兩個進行;二是修改以上的select語句或者下面的if語句,從程序設計角度堵塞漏洞的產生;三是檢驗用戶的輸入信息長度,限制輸入信息在8個字母內,這樣,也能防止漏洞的產生,不過,這個方法不是很好,最好利用第一種方法。
2、取得別人賬號
這個漏洞原因已經在上面分析了,我們現在來看實例。首先,我們進入一個注冊頁面(圖1)并且隨意輸入一個賬號,發現出現賬號已經存在的信息(圖2):

這樣,我們知道這個賬號已經存在,怎樣取得這個賬號的使用權呢?我們使用另外一個賬號注冊,如果這個賬號不存在,會出現以下的頁面(圖3)

以上頁面,就是正常的注冊頁面,我們可以發現在“用戶名稱”后面,發現了需要注冊的“kkkkkkkkk”賬號,再看看這個頁面的源代碼,查找這個賬號,看這個賬號出現在哪些地方,我們只看關鍵的代碼:
<FORM name="form2" action="../member/register1.jsp" method=post onsubmit="javascript:return TestField1()">
<div align="center">
<input type="hidden" name="Step" value="2">
<input type="hidden" name="recName" value=kkkkkkkkk>
<table width="500" border="0" cellspacing="0" cellpadding="2">
<tr bgcolor="#000000"> 
<td>
<div align="center"><b><font color="#FFFFFF">普通會員注冊</font></b></div>
</td>
</tr>
</table>
在上面的代碼中,我們發現有兩個hidden類型的表單項,第一個是“Step”,第二個是“recName”,從名字我們知道,第一個是注冊的步驟,對我們沒有意義;第二個是注冊的用戶名,為什么要使用“hidden”類型表單保存呢?就是為了在以下的正式注冊中直接使用這個作為用戶名。發現什么沒有?我們可以將這里的注冊名修改為我們剛才試驗時候使用的注冊名“andy”,然后保存為一個HTML文件,再一次打開,填寫必要信息提交,結果,我們已經取得該賬號的“合法”使用權。在這里需要注意的一點是,在以下語句中:
<FORM name="form2" action="../member/register1.jsp" method=post onsubmit="javascript:return TestField1()">
如果我們直接保存頁面到本機,提交的時候會出錯的,因為本機不存在member/register1.jsp文件,我們必須將這里該為正確的網址,也就是在前面加上該網站的網址才可以提交。另外,并不是所有使用這種分步驗證方式注冊的網站都存在這個漏洞。
3、繞過驗證的“頁面炸彈”
即使頁面有嚴格的驗證,有時候,我們還是可以繞過這些驗證來提交一些不合法的信息,最簡單的就是采用JavaScript方式驗證的程序,因為JavaScript的特殊性,我們可以將提交信息的頁面保存到本地計算機,然后將這些JavaScript程序刪除,再提交攻擊信息,這樣,輕松的,我們就可以繞過頁面信息驗證了。
四、總結
以上我們介紹了網頁編程中容易出現的一些漏洞,這些漏洞,其實并不只是在網頁編程中出現,在其他的編程中,也有一定的參考價值。從以上的介紹中可以知道,安全的概念其實貫穿在整個網頁設計過程中,隨時我們都要考慮到安全的問題,這樣,我們的網站才會多一些安全性;同樣的,作為網絡攻擊者,如果隨時注意一些編程漏洞,很容易,網站的漏洞就可以找出來。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 工布江达县| 奉节县| 米脂县| 汶上县| 邯郸市| 乌鲁木齐县| 威信县| 盐源县| 巫溪县| 南丹县| 宁乡县| 周宁县| 白朗县| 扶沟县| 金门县| 双流县| 商丘市| 利津县| 赞皇县| 广河县| 比如县| 通城县| 泰兴市| 岳西县| 呼图壁县| 田阳县| 图们市| 中西区| 青田县| 甘德县| 满洲里市| 随州市| 巩义市| 绥芬河市| 子长县| 孟连| 宜宾市| 门源| 汤原县| 中山市| 蕲春县|