动网8.1最新注入漏洞来了
2008/01/23 17:45 by hackest 本站原创
题目:动网8.1最新注入漏洞来了
作者:hackest [H.S.T]
此文章已发表在《黑客X档案》2008年第2期杂志上
后经作者发布在博客上,如转载请务必保留此信息!
文章难易度:★★★
文章阅读点:动网8.1最新注入漏洞的成因及其详细利用
时光飞逝,弹指间,充满希望的2008年悄然而至。国内用户最多的BBS程序——动网也不断地推陈出新,出到了现在的8.1.1版本。不过动网始终摆脱不了“洞网”的命运,这次又暴出了一个高危漏洞,使攻击者可以直接获得管理员的密码MD5值,通杀Access和SQL版本(感谢兄弟:伤心的鱼)。似乎印证了某人“动网无论哪一个版本都存在漏洞”的感慨。闲话少说,直入主题。存在漏洞的文件为UserPay.asp,此文件传递的变量过滤不严,导致出现注入漏洞。受影响版本为:8.0.0 Sp1以上版本以及更新过支付宝接口的用户(引自动网官方论坛,不包含8.0.0 Sp1。经测试8.0.0和8.0.0 Sp1版本不受影响)。
一、漏洞成因
先简单介绍下漏洞形成的原因。
★
UserPay.asp代码第12-64行:
If Request("raction")="alipay_return" Then
AliPay_Return()
Dvbbs.Footer()
Response.End
ElseIf Request("action")="alipay_return" Then
AliPay_Return()
Dvbbs.Footer()
Response.End
'ElseIf Request("action")="Re_inmoney" Then
' Re_inmoney()
' Dvbbs.Footer()
' Response.End
End If
★
由代码可以看出,无论是用户提交的raction为alipay_return,还是action为alipay_return,都同样调用了AliPay_Return()过程。
★
AliPay_Return()的代码原型在第329-351行,代码如下:
Sub AliPay_Return()
If Dvbbs.Forum_ChanSetting(5) <> "0" Then
AliPay_Return_Old()
Exit sub
Else
Dim Rs,Order_No,EnCodeStr,UserInMoney
Order_No=Request("out_trade_no")
Set Rs = Dvbbs.Execute("Select * From [Dv_ChanOrders] Where O_IsSuc=3 And O_PayCode='"&Order_No&"'")
If not(Rs.Eof And Rs.Bof) Then
AliPay_Return_Old()
Exit sub
End if
Response.Clear
Set Rs = Dvbbs.Execute("Select * From [Dv_ChanOrders] Where O_IsSuc=0 And O_PayCode='"&Order_No&"'")
If Rs.Eof And Rs.Bof Then
Response.Write "N"
Else
Response.Write "Y"
Dvbbs.Execute("Update Dv_ChanOrders Set O_IsSuc=3 Where O_ID = " & Rs("O_ID"))
End If
Response.End
End If
End Sub
★
代码表明,如果Dvbbs.Forum_ChanSetting(5) <> "0" ,就执行代码下面的SQL语句。我们再来看看数据库里默认的Forum_ChanSetting的值吧:
★
1,1,0,0,pay@aspsky.net,0,b63uvb8nsvsmbsaxszgvdr6svyus0l4t,1,1,1,1,1,1,1,100,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
★
Forum_ChanSetting(5)缺省值为0,满足上面提到的条件,执行以下代码:
★
Order_No=Request("out_trade_no")
Set Rs = Dvbbs.Execute("Select * From [Dv_ChanOrders] Where O_IsSuc=3 And O_PayCode='"&Order_No&"'")
★
直接把获取的Order_No放到SQL里面执行去了,漏洞就这样出现了。
(以上内容参考自漏洞发现者Tr4c3博客,在此感谢Tr4c3)。
二、漏洞测试
老规矩,为了方便测试,本机安装IIS6.0,架设动网8.1.1 Access最新版本论坛。以默认的管理员身份登录(在实际入侵中需要注册用户登录),然后直接访问UserPay.asp文件,点击“网上支付”,如图1。

图1
然后再点击“所有交易记录”,这样做的目的是为了得到一个订单号,如图2。

图2
图中的2008010901555983075b64cea5f就是我们需要的订单号了。构造如下URL:http://127.0.0.1/UserPay.asp?raction=alipay_return&out_trade_no=2008010901555983075b64cea5f(提交此URL会看到只有一个字母Y),在此URL后面加上单撇号,回车提交,返回错误信息:
Microsoft JET Database Engine 错误 '80040e14'
字符串的语法错误 在查询表达式 'O_IsSuc=3 And O_PayCode='2008010901555983075b64cea5f''' 中。
/inc/Dv_ClsMain.asp,行 1525
看来有戏了,把URL直接扔到NBSI3.0里检测,结果为“未检测到注入漏洞”。别担心,给它填入“特征字符”就可以正常检测到了,特征字符处填入“非法的订单参数”即可。这回检测出来了吧,接着猜出表段、字段以及里面存放的内容,如图3。

图3
然后就是去查询MD5密码明文,再登录后台,然后想办法得到Webshell了。我测试的是Access版本的,不过此漏洞同样对SQL版本的有效,漏洞发现者的朋友以动网官方检测证实了这一点(动网官方为SQL版本)。因为利用过程比较简单,详细操作请参考光盘收录的漏洞发现者的操作录像。至于动网8.1后台如何获得Webshell将在本期另一篇文章中详细讨论。
三、漏洞修补
正如漏洞发现者所言,在8.0.0及8.0.0 Sp1版本里并不存在此漏洞。因为旧版本的UserPay.asp对out_trade_no作了过滤,让人不解的是新版本居然没有!这个玩笑可真开大了!不过动网官方的反应也很迅速,漏洞公布次日就发布了相关修补方法。不过就算官方不发,我们也可以依样画葫芦把这个漏洞修补掉。对比一下8.0.0版本的UserPay.asp的代码就知道如何修补了:打开UserPay.asp,查找★Order_No=Request("out_trade_no")★,然后替换为★Order_No=Dvbbs.Checkstr(Request("out_trade_no"))★,即可修复此漏洞。
作者:hackest [H.S.T]
此文章已发表在《黑客X档案》2008年第2期杂志上
后经作者发布在博客上,如转载请务必保留此信息!
文章难易度:★★★
文章阅读点:动网8.1最新注入漏洞的成因及其详细利用
时光飞逝,弹指间,充满希望的2008年悄然而至。国内用户最多的BBS程序——动网也不断地推陈出新,出到了现在的8.1.1版本。不过动网始终摆脱不了“洞网”的命运,这次又暴出了一个高危漏洞,使攻击者可以直接获得管理员的密码MD5值,通杀Access和SQL版本(感谢兄弟:伤心的鱼)。似乎印证了某人“动网无论哪一个版本都存在漏洞”的感慨。闲话少说,直入主题。存在漏洞的文件为UserPay.asp,此文件传递的变量过滤不严,导致出现注入漏洞。受影响版本为:8.0.0 Sp1以上版本以及更新过支付宝接口的用户(引自动网官方论坛,不包含8.0.0 Sp1。经测试8.0.0和8.0.0 Sp1版本不受影响)。
一、漏洞成因
先简单介绍下漏洞形成的原因。
★
UserPay.asp代码第12-64行:
If Request("raction")="alipay_return" Then
AliPay_Return()
Dvbbs.Footer()
Response.End
ElseIf Request("action")="alipay_return" Then
AliPay_Return()
Dvbbs.Footer()
Response.End
'ElseIf Request("action")="Re_inmoney" Then
' Re_inmoney()
' Dvbbs.Footer()
' Response.End
End If
★
由代码可以看出,无论是用户提交的raction为alipay_return,还是action为alipay_return,都同样调用了AliPay_Return()过程。
★
AliPay_Return()的代码原型在第329-351行,代码如下:
Sub AliPay_Return()
If Dvbbs.Forum_ChanSetting(5) <> "0" Then
AliPay_Return_Old()
Exit sub
Else
Dim Rs,Order_No,EnCodeStr,UserInMoney
Order_No=Request("out_trade_no")
Set Rs = Dvbbs.Execute("Select * From [Dv_ChanOrders] Where O_IsSuc=3 And O_PayCode='"&Order_No&"'")
If not(Rs.Eof And Rs.Bof) Then
AliPay_Return_Old()
Exit sub
End if
Response.Clear
Set Rs = Dvbbs.Execute("Select * From [Dv_ChanOrders] Where O_IsSuc=0 And O_PayCode='"&Order_No&"'")
If Rs.Eof And Rs.Bof Then
Response.Write "N"
Else
Response.Write "Y"
Dvbbs.Execute("Update Dv_ChanOrders Set O_IsSuc=3 Where O_ID = " & Rs("O_ID"))
End If
Response.End
End If
End Sub
★
代码表明,如果Dvbbs.Forum_ChanSetting(5) <> "0" ,就执行代码下面的SQL语句。我们再来看看数据库里默认的Forum_ChanSetting的值吧:
★
1,1,0,0,pay@aspsky.net,0,b63uvb8nsvsmbsaxszgvdr6svyus0l4t,1,1,1,1,1,1,1,100,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
★
Forum_ChanSetting(5)缺省值为0,满足上面提到的条件,执行以下代码:
★
Order_No=Request("out_trade_no")
Set Rs = Dvbbs.Execute("Select * From [Dv_ChanOrders] Where O_IsSuc=3 And O_PayCode='"&Order_No&"'")
★
直接把获取的Order_No放到SQL里面执行去了,漏洞就这样出现了。
(以上内容参考自漏洞发现者Tr4c3博客,在此感谢Tr4c3)。
二、漏洞测试
老规矩,为了方便测试,本机安装IIS6.0,架设动网8.1.1 Access最新版本论坛。以默认的管理员身份登录(在实际入侵中需要注册用户登录),然后直接访问UserPay.asp文件,点击“网上支付”,如图1。

图1
然后再点击“所有交易记录”,这样做的目的是为了得到一个订单号,如图2。

图2
图中的2008010901555983075b64cea5f就是我们需要的订单号了。构造如下URL:http://127.0.0.1/UserPay.asp?raction=alipay_return&out_trade_no=2008010901555983075b64cea5f(提交此URL会看到只有一个字母Y),在此URL后面加上单撇号,回车提交,返回错误信息:
Microsoft JET Database Engine 错误 '80040e14'
字符串的语法错误 在查询表达式 'O_IsSuc=3 And O_PayCode='2008010901555983075b64cea5f''' 中。
/inc/Dv_ClsMain.asp,行 1525
看来有戏了,把URL直接扔到NBSI3.0里检测,结果为“未检测到注入漏洞”。别担心,给它填入“特征字符”就可以正常检测到了,特征字符处填入“非法的订单参数”即可。这回检测出来了吧,接着猜出表段、字段以及里面存放的内容,如图3。

图3
然后就是去查询MD5密码明文,再登录后台,然后想办法得到Webshell了。我测试的是Access版本的,不过此漏洞同样对SQL版本的有效,漏洞发现者的朋友以动网官方检测证实了这一点(动网官方为SQL版本)。因为利用过程比较简单,详细操作请参考光盘收录的漏洞发现者的操作录像。至于动网8.1后台如何获得Webshell将在本期另一篇文章中详细讨论。
三、漏洞修补
正如漏洞发现者所言,在8.0.0及8.0.0 Sp1版本里并不存在此漏洞。因为旧版本的UserPay.asp对out_trade_no作了过滤,让人不解的是新版本居然没有!这个玩笑可真开大了!不过动网官方的反应也很迅速,漏洞公布次日就发布了相关修补方法。不过就算官方不发,我们也可以依样画葫芦把这个漏洞修补掉。对比一下8.0.0版本的UserPay.asp的代码就知道如何修补了:打开UserPay.asp,查找★Order_No=Request("out_trade_no")★,然后替换为★Order_No=Dvbbs.Checkstr(Request("out_trade_no"))★,即可修复此漏洞。
Posted in 漏洞演练 | Tags: 动网8.1最新注入漏洞来了
COMMENT[0]

不为人知的动网7.1 SQL版注入漏洞
动网8.1之后台获取Webshell大法
![[H.S.T.]十六进制信息安全网官方讨论组](http://www.hackest.cn/logo1.gif)
