|
学前班
- 帖子
- 8
- 精华
- 0
- 威望
- 0 度
- 金币
- 37 枚
- 来自
- [A.S.T]安全小组
- 最后登录
- 2008-10-20
|
1#
大 中
小 发表于 2008-1-11 11:47 只看该作者
雷池新闻系统漏洞简单分析与总结
雷池新闻系统漏洞简单分析与总结 //文章作者:Awolf[A.S.T]
//文章来源:首发[A.S.T]小组论坛。版权所有,欢迎转载,但请保留本行信息!
注:本文主要总结雷池三个版本的几个漏洞并简单说下拿shell,善于总结进步才快。呵呵,本文献给和我一样的小菜,高手掠过!初学asp,有错请提出~谢谢!
一、’or’=’or’漏洞
1.漏洞分析
漏洞文件当然在后台验证文件上,/admin/CHKLOGIN.ASP中,见代码4-7行:
dim rs
admin1=request("admin") ‘没有任何过滤
password1=request("password") ‘没有任何过滤
set rs=server.CreateObject("ADODB.RecordSet")
rs.open "select * from admin where admin='" & admin1 & "' and password='"&encrypt(password1)&"'",conn,1
‘encrypt()函数加密密码
明显直接获取输入的用户名和密码,根本没有过滤检查。那么我们就可以构造进行注入,其实只要不为空,让sql查询语句成立就可以了。相信这个大家都懂,不废话。
2.简单利用
其实这个漏洞一直存在与雷池新闻系统的V1.0
V2.0 V 3.0版本,但是在V3.0这个版本当中,加入了火狐的防注入系统所以没有办法成功注射,会被拦截的!
那么面对3.0以下的版本就可以这样进后台。
二、暴库漏洞
造成漏洞原因:没有判断访问权限
直接访问admin/adminconn.inc,就可以爆出数据地址了,这个可以看看数据库是不是asp或者asa(后面有用)。看截图:
三、cookie注入漏洞
雷池新闻系统的2.0增强版本(2.0没有加)开始就加入了防注入系统,但是经过分析知道在SQL通用防注入系统3.0版 火狐技术联盟存在cookie注入漏洞,看下漏洞代码,在/sql/Neeao_SqlIn.Asp文件中:
'--------POST部份------------------
If Request.Form<>"" Then
For Each Fy_Post In Request.Form
For Fy_Xh=0 To Ubound(Fy_Inf)
If Instr(LCase(Request.Form(Fy_Post)),Fy_Inf(Fy_Xh))<>0 Then
'If WriteSql=True Then
'killSqlconn.Execute("insert into SqlIn(Sqlin_IP,SqlIn_Web,SqlIn_FS,SqlIn_CS,SqlIn_SJ) values('"&Request.ServerVariables("REMOTE_ADDR")&"','"&Request.ServerVariables("URL")&"','POST','"&Fy_Post&"','"&replace(Request.Form(Fy_Post),"'","''")&"')")
'killSqlconn.close
'Set killSqlconn = Nothing
'End If
Response.Write "<Script Language=JavaScript>alert('系统提示:\n\n请不要在参数中包含非法字符尝试注入!\n');</Script>"
Response.Write "非法操作!你已被系统记录做了如下非法操作↓<br>"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
Response.Write "操作时间:"&Now&"<br>"
Response.Write "操作页面:"&Request.ServerVariables("URL")&"<br>"
Response.Write "提交方式:POST<br>"
Response.Write "提交参数:"&Fy_Post&"<br>"
Response.Write "提交数据:"&Request.Form(Fy_Post)
Response.End
End If
Next
Next
End If
'----------------------------------
'--------GET部份-------------------
If Request.QueryString<>"" Then
For Each Fy_Get In Request.QueryString
For Fy_Xh=0 To Ubound(Fy_Inf)
If Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>0 Then
'If WriteSql=True Then
'killSqlconn.Execute("insert into SqlIn(Sqlin_IP,SqlIn_Web,SqlIn_FS,SqlIn_CS,SqlIn_SJ) values('"&Request.ServerVariables("REMOTE_ADDR")&"','"&Request.ServerVariables("URL")&"','GET','"&Fy_Get&"','"&replace(Request.QueryString(Fy_Get),"'","''")&"')")
'killSqlconn.close
'Set killSqlconn = Nothing
'End If
Response.Write "<Script Language=JavaScript>alert('系统提示:\n\n请不要在参数中包含非法字符尝试注入!\n');</Script>"
Response.Write "非法操作!你已被系统记录做了如下非法操作↓<br>"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
Response.Write "操作时间:"&Now&"<br>"
Response.Write "操作页面:"&Request.ServerVariables("URL")&"<br>"
Response.Write "提交方式:GET<br>"
Response.Write "提交参数:"&Fy_Get&"<br>"
Response.Write "提交数据:"&Request.QueryString(Fy_Get)
Response.End
End If
Next
Next
End If
显然明显文件只对GET和POST提交方式进行检测合法性。网页文件在接受处理方式的时候一般是POST或GET两种方式。比如Request.form或Request.QueryString。而防注入程序3.0是限制,这两种方式提交。却没有限制Request.cookie的方式。也就是说,只要我们构造Request.cookie语句进行注入就可以成功注入了。
又分析了/owens.asp文件,代码如下:
<!--#include file="conn.asp"-->
<%
owen=request("owen")
owen1=request("owen1")
owen2=request("owen2")
n=request("n")
if n="" then
n=100
end if%>
<%
if owen1<>"" and owen2<>"" then
sql="select
* from NEWS where BigClassName='"& owen1 &"' and
SmallClassName='"& owen2 &"' order by id desc"
set rs=conn.execute(sql)
do while not rs.eof
%>
很多朋友一看到这个就说有存在注射了,不过确实存在注射。但是看到这行<!--#include file="conn.asp"-->我们又到conn.asp(连接数据库文件),代码如下:
<%
dim conn,connstr
on error resume next
c+server.mappath("data/nxnews.mdb")+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
Set conn=Server.CreateObject("ADODB.CONNECTION")
conn.open connstr
%>
<!--#Include File="sql/Neeao_SqlIn.Asp"-->
看到最后一行没有,把neeao写的那个通用防注入系统给包含进来了,也就是说,只要涉及到数据库查询的都要进行“防注入”过滤处理。那么我们就无法顺利注射了。
那么我们只能通过cookie注射了,我们可以采用javascript cookie来进行注射,构造出语句,俺比较懒,直接用GreenBrower 的jscookie插件来进行注入,比较简单。
首先构造好注射语句,打开数据库发现有11个字段,可以构造这样的语句来进行注射:
其中的-1是让他不成立就执行我们后面的联合查询语句。好了,原理分析完成了。
2.利用方法:
随便打开一个新闻页面,比如http://59.77.72.12/leichi3.0/onews.asp?id=42,我们提交http://59.77.72.12/leichi3.0/onews.asp?id=42‘(注意这个的单引号不是英文的,是中文的,英文的被过滤了)就出现了“数据错误提示”,说明确实存在注射,如图:
那么我们用greenbrower来进行注射,去掉url后面的id即:http://59.77.72.12/leichi3.0/onews.asp,同样出现了错误如图2,如图3:
直接注射了,看成功了,返回onews。Asp,出现了,管理员密码和站好出来了,如图4:
用户名Admin 密码bfpms,这个加密算法很简单,见下面分析。
三、密码加密问题
雷池新闻系统的加密过于简单,可以直接手算,但是要记得ASCII码,这里我写了一个辅 助工具(下载地址:http://bbs.awolf07.cn/attachment.php?aid=46),直接破解,我们看看他是怎么加密的吧,看encrypt()函数加密密码,上面有提到,我们找下它,看看怎么写的,在文件/admin/adminiconn.inc文件中,
function decrypt(dcode)
dim texts
dim i
for i=1 to len(dcode)
texts=texts & chr(asc(mid(dcode,i,2))-i)
next
decrypt=texts
end function
function encrypt(ecode)
Dim texts
dim i
for i=1 to len(ecode)
texts=texts & chr(asc(mid(ecode,i,2))+i)
next
encrypt = texts
end function
%>
加密程序encrypt,解密程序decrypt,这里我简单说下它的加密原理:密文中字母所对应的ascii码减去字母在密文中所处的位数其结果为原密码的所对应的ASCII码 例如:admin加密后为bfpms。很简单的加密方法,确切的说是做了简单的变换。有兴趣的朋友可以自己手动转换,这里我给大家做好了,省得去查ASCII表。雷池加密方法是非MD5加密。
这个算是一个软肋吧,因为如果是md5的话,即使你得到md5散列,但是如果密码比较强大,那么就不一样可以破解了(当然有人会说可以通过cookie来欺骗登陆,其实这个也可以的,小弟不知道怎么构造,还望高手指点)
好了加密算法就到这里了。
四、严重的上传漏洞:
漏洞文件在/admin/uploadpic.asp,不用验证是否是管理员就可以访问了,这里我就不分析了,网络上很多牛人都分析过了,自己google去,说下利用方法:直接访问:http://59.77.72.12/leichi3.0/admin/uploadPic_bak.asp?actionType=mod&picName=wolf.asp,让后上传以jpg或者gif的木马,上传后的文件将是asp结尾的,在uppic目录下,直接访问http://59.77.72.12/leichi3.0/uppic/awolf.asp,就拿到了shell了。
五、最后总结
其实这个新闻系统的漏洞非常严重,足以颠覆一个网站了。至少拿到shell没问题,但是我想说的是,在这里,很多网站管理员都知道删除后台的上传漏洞。那么有些朋友就会说那就没有办法拿shell了,的确如果删除了,进后台也没有什么地方可以插马什么的,就不可能拿到shell了。但是后来经过测试发现,其实在后台可以成功写入一句话木马,而且到数据库中也没有被过滤,完好无损。但是我们怎么连接呢?地址是mdb的,根本没有办法。没错,但是我发现在网络上很多管理员竟然把数据扩展名改成了asp或者asa的(默认是mdb,我还想不通为什么他们要这样做?)那么结合我们上面的暴库漏洞,呵呵,先看看是不是asp或者asa的数据,是的话,写个马进去,ok连接成功了。
当然拿shell,先看上传漏洞,那个简单快捷!当然分析这个不是为了入侵而分析。
好了,文章要此结束,有什么问题可以到bbs.awolf07.cn或者www.awolf07.cn来和我讨论。
Blog:www.awolf07.cn
forum:bbs.awolf07.cn
|