小古Blog
华众SQL漏洞导致服务器崩溃技术说明及修复方法
2011-5-4 小古

比如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

发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容