 
- 帖子
- 310
- 积分
- 810
- 威望
- 1302
- 金钱
- 1010
- 在线时间
- 2 小时
 
|
[讨论]一个ASP中SQL语句的基本问题
议题提交:职业欠钱
信息来源:邪恶八进制安全小组
最近学习BBSXP漏洞时,发现一个很奇怪的地方。
blog.asp中,开头部分是这么写的:
id=HTMLEncode(Request("id"))
top
if id<>"" then
sql="select * from [calendar] where id="&id&" order by id Desc"
看起来漏洞非常的大,ID变量只是简单的经过HTMLEncode过滤就放到了SQL语句中。在AC版中很容易构造union查询得到密码等敏感信息。可是在MSSQL中却不行,原因先不说,也许大家也知道。
可是问题来了,照常理,我们只需要构造多几个语句来执行update什么的危害也就够大了。
为此我构造
id=1 update clubconfig set adminpassword=(select userpass from [user] where username=0xXXXX(这里是我的用户名的十六进制,用以绕开单引号)) select * from [calendar]
这个句子在查询分析器里执行正常,可是提交到BBSXP的blog.asp时却出错了
Microsoft OLE DB Provider for SQL Server 错误 '80040e14'
sp_cursoropen/sp_cursorprepare: 语句参数只能是单个 SELECT 语句或单个存储过程。
/xp/blog.asp,行 14
于是检查14行出的代码,是这么写的:
rs.Open sql,Conn,1
对比上次的showforum.asp,发现showforum.asp是这么写的:
if PageCount<2 then
sql="select top "&pagesetup&" * from [forum] "&topsql&" order by toptopic Desc,"&order&" Desc"
Set Rs=Conn.Execute(sql)
else
sql="select * from [forum] "&topsql&" order by toptopic Desc,"&order&" Desc"
rs.Open sql,Conn,1
end if
如果我没有理解错的话,showforum.asp中,首先需要判断PageCount是否大于1页。(PageCount>2)
如果不大于的话,使用Set Rs=Conn.Execute(sql)执行。
否则使用rs.Open sql,Conn,1执行SQL语句。
于是问题来了。如果blog.asp中出问题是因为执行SQL语句的方式不同(rs.Open sql,Conn,1而不是Conn.Execute(sql))
那么在showforvm.asp中,当页数大于2,update就应该会失败,可是事实上我们选择了多个站点测试均成功。而放到blog.asp中就必然提示上述错误。
我曾搜过不少关于
rs.Open sql,Conn,1的资料,大体上都是说什么rs.Open sql,Conn,A,B 一类的。现在这里只有一个数 1,那么这个1 是A还是B?
这个问题想了好久,实在想不出来,故到此麻烦前辈。写的很长,抱歉,我不怎么会表达
谢谢各位指点个人论坛: http://www.xdxf.net
帖子60 精华2 积分3417 阅读权限100 性别男 在线时间134 小时 注册时间2005-5-3 最后登录2008-5-28 查看详细资料TOP 少女暴富的隐秘(图)
勇敢的风 
技术核心组
  |
|