华众SQL漏洞导致服务器崩溃技术说明及修复方法

作者: 小古 分类: 服务器配置 发布时间: 2011-5-4 ė11687 次浏览 60 条评论

比如ftp管理。mssql管理等等地方,都不能注射。可能有的朋友比较奇怪了。我拿了个shell,看到了源码。所以今天来给大家分析分析。。
D:/hzhost/hzhost_conpanel/domain/login.asp就是login.asp存在注射。
我们来看他代码是如何写的。

引用:
码片段。
<%
’session.timeout=20
ifok=0//ifok=0时表示系统维护中,不可登录
d_dme=trim(request.form("domainname")) //直接从表单就获取了用户名字。仅去掉空格。所以产生漏洞。
d_pss=trim(request.form("domainpass"))
session("xinnetdomainpwd")=""
d_pssin=d_pss
dnme=d_dme
chk_usrpss d_pss,"域名密码",4,16 //这里是一个检测。这个chk_usrpss函数检测字符长度。最少为4位,最大为16位。否则就报错!
d_pssmd5=md5(d_pss)
substrContent = "entryclass:sys2_mng"&Vend
substrContent =substrContent& "entrytype:getincode"&Vend
substrContent =substrContent& "entryuser:"&entryuser&Vend
substrContent =substrContent& "entrypass:"&entrypass&Vend
substrContent = substrContent & "pnlmod:getincode"& Vend
substrContent =substrContent& "agentname:"&agentname&Vend
substrContent = substrContent & "keywords:" &d_pss& Vend
substrContent = substrContent & "." & Vend
wstr=hzsocket(substrContent)
d_pssincode=wstr
query="select * from dmelst where d_dme=’"&d_dme&"’" //这里直接丢到sql语句里面开始了查询。所以漏洞产生了!
rs.Open query,conn,3,1
if rs.RecordCount <>1 then
rs.close
我们再看看mysql登陆的页面代码。位置在D:/hzhost/hzhost_conpanel/mssql/login.asp

引用:
<%
’session.timeout=20
ifok=0//ifok=0时表示系统维护中,不可登录
sq_nme=trim(request.form("mssqlname")) //我们可以看到。还是一样的没有过滤。
sq_pss=trim(request.form("mssqlpass")) //密码也没过滤。
chk_usrpss sq_nme,"数据库名称",4,20 //注意此行。由于多了这一行。导致sql注射漏洞被过滤了。
chk_usrpss sq_pss,"数据库密码",4,16
substrContent = "entryclass:sys2_mng"&Vend
substrContent =substrContent& "entrytype:getincode"&Vend
substrContent =substrContent& "entryuser:"&entryuser&Vend
substrContent =substrContent& "entrypass:"&entrypass&Vend
substrContent = substrContent & "pnlmod:getincode"& Vend
substrContent =substrContent& "agentname:"&agentname&Vend
substrContent = substrContent & "keywords:" &sq_pss & Vend
substrContent = substrContent & "." & Vend
wstr=hzsocket(substrContent)

sq_pss=md5(wstr)
query="select * from v_sqllst where sq_nme=’"&sq_nme&"’" //进行查询
conn.open constr
rs.Open query,conn,3,1
if rs.RecordCount <>1 then
call errorpage("对不起,非法登录,请返回!(106)")
else
db_sq_pss=trim(rs("sq_pss"))
sqid=rs("sq_id")
sq_prd=ucase(trim(rs("sq_prd")))
sq_sst=rs("sq_sst")
end if
rs.close
还有mysql/login.asp ,mail/login.asp等等就不分析了,代码都一样。看了代码。多出的这一行就阻止了sql注射。

引用:
chk_usrpss sq_nme,"数据库名称",4,20
我们再来看看chk_usrpss究竟是怎么写的。它在D:\hzhost\hzhost_master\incs\config.asp中!

引用:
’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’用户名和密码检查 //作者的注释。我们很清楚就能知道这个函数的作用。
function Chk_usrpss(Str,strname,lenmin,lenmax)’lenmin表长度下限,lenmax表长度上限
b=""
c=true
if str="" then
session("errmsg")="对不起,"&strname&"不能为空!"
response.redirect "/mst_error.asp?errorid=511"
response.end
end if
if len(str)<lenmin then
session("errmsg")="对不起,"&strname&"长度应该大于"&lenmin&"位!"
response.redirect "/mst_error.asp?errorid=511"
response.end
end if
if len(str)>lenmax then
session("errmsg")="对不起,"&strname&"长度应该小于"&lenmax&"位!"
response.redirect "/mst_error.asp?errorid=511"
response.end
end if
//在这之前都只是对字符的长度大小进行检测。
bString="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
for i=1 to len(str)
b=mid(str,i,1)
if instr(bstring,b)<=0 then
c=false
exit for
end if
next
if c=false then
session("errmsg")="对不起,"&strname&"不符合规范!"
response.redirect "/mst_error.asp?errorid=511"
response.end
end if
//这里就是关键。他居然完全把我们输入的字符限制在"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"之中。否则就出错。
由于domain/login.asp中没有检测nme值。所以我们能进行注射。而在其他的页面,都使用chk_usrpss检测了nme值。所以。我们超出bString值之外的字符全都成了被限制字符。从而隔绝了注射漏洞
end function
由此。不得不感叹。仅仅少了下面一行代码。导致整台服务器的沦陷。

引用:
chk_usrpss d_dme,"域名",4,16
所以,编写程序中不能有一丝懈怠。

以下是引用片段:
chk_usrpss d_dme,”域名”,4,16

 

以下是引用片段:
补漏洞的两个方法,推荐方法一!
方法一:

修改d:/hzhost/hzhost_conpanel/domain/login.asp中的
d_dme=trim(request.form(”domainname”)) 


d_dme=SafeRequestform(trim((”domainname”)))

 方法二:

chk_usrpss d_pss,”域名密码”,4,16
之前加上
chk_usrpss d_dme,”域名”,3,30

本文出自 小古Blog,转载时请注明出处及相应链接。

本文永久链接: http://blog.chdz1.com/?post=77

0暂无标签
|

发表评论:

电子邮件地址不会被公开。 必填项已用*标注

Ɣ回顶部
sitemap