SQL注入
来源:互联网 发布:淘宝访问受限怎么回事 编辑:程序博客网 时间:2024/04/20 14:08
SQL注入
l 何谓“SQL注入”
SQL注入(SQL Injection),就是通过网站的漏洞,使用SQL命令(如:DML语句、DDL语句、SQL扩展存储过程等)获得网站正使用的数据库的信息、修改数据库记录、读取服务器的注册表、追加Windows的帐号、修改Windows帐号的权限等。
l SQL注入的方式
现阶段较为流行的SQL注入工具一般是通过Get和Post方法进行注入。
l SQL注入是怎样产生的
使用Get方式进行注入,一般存在于形如:http://xxx.xxx.xxx/abc.asp?id=XX等带有参数的ASP动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果ASP程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。
#注:字符过滤只是防止注入的一种方法,具体的请参照后面的介绍。
使用Post方式进行注入,一般存在于表单的提交中,因为在表单的提交中基本上都会编码,所以使用该方式进行注入比较困难,以下着重介绍Get方式的注入,Post方式的注入形同Get方式的注入。
l 如何判断是否存在SQL注入
Ø 前期准备
IE的「ツール」→「インターネット オプション」→「 詳細設定」→ 「ブラウズ」中的「HTTPエラーメッセージを簡易表示する」前的勾去掉。 以获得更多的错误提示信息。
Ø 注入验证
对字符型参数:
因为大多数网页中对数据表的操作都是使用串连接的形式实现的,如下:
strSQL = “select * from TABLE where name=’”&strUsrName&”’ and password=’”& strPasswd & “’”
所以在检验是否存在注入,常见的方法是在参数后面加个半角的单引号,如:
http://xxx.xxx.xxx/abc.asp?id=XX’
当页面被运行后,画面出现以下错误时,认为该网页可以进行注入:
技術情報 (サポート担当者用)
· エラー タイプ
Microsoft OLE DB Provider for SQL Server (0x80040E14)
文字列 '' の前で引用符が閉じていません。
/test/xxx.asp, line 40
这说明该页面没有对输入的参数进行有效性检查,即过滤单引号,则可以使用以下方式进行注入:
1、http://xxx.xxx.xxx.xxx/abc.asp?name=aaa’ or 1=1--
2、http://xxx.xxx.xxx.xx/abc.asp?name=aaa’;exec('create table temp ( [name] [char] (10)) ')--
对于整型参数:
对于整型参数来讲,上面的方法就不大适用了,因为对于整型参数,SQL代码可能如下:
strSQL = “select * from TABLE where id=”& strID
即使程序中对strID参数中的单引号做了过滤,也可使程序产生注入,如下:
1、 http://xxx.xxx.xxx.xxx/abc.asp?id=1 or 1=1—
2、 http://xxx.xxx.xxx.xxx/abc.asp?id=1 ;exec('create table temp ( [name] [char] (10)) ')—
其中“--”在SQL中是注释的意思,所以“--”之后的代码均作为注释处理。
对于上面的字符型和整型参数的第1种情况,条件“or 1=1”会使strSQL语句中的where条件变得无效;而第2种情况,代码会先执行分号之前的strSQL语句,然后执行exec后的SQL语句创建表,通过修改exec后的SQL语句,就可以通过你的数据库链接,进行SQL注入的攻击。
l SQL注入所产生的安全隐患
Ø 逃避安全验证
从理论上说,认证网页中会有形如:
select * from admin where username='XXX' and password='YYY' 的语句,若在正式运行此句之前,没有进行必要的字符过滤,则很容易实施SQL注入。
如在用户名文本框内输入:abc’ or 1=1-- 在密码框内输入:123 则SQL语句变成:
select * from admin where username='abc’ or 1=1 and password='123’ 不管用户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
Ø 修改数据表的信息
通过SQL注入的漏洞,能够得到系统中表的相关信息,从而修改表的内容。
注:得到表的信息的方法可以参见网上提供的攻击方法,这里就不作介绍了。
Ø 追加Windows帐号/修改帐号权限
ASP木马只有USER权限,要想获取对系统的完全控制,还要有系统的管理员权限。怎么办?提升权限的方法有很多种:
上传木马,修改开机自动运行的.ini文件(它一重启,便死定了);
复制CMD.exe到scripts,人为制造UNICODE漏洞;
下载SAM文件,破解并获取OS的所有用户名密码;
等等,视系统的具体情况而定,可以采取不同的方法。
Ø 修改注册表
利用xp_regread扩展存储过程修改注册表。
另一个有用的内置存储过程是xp_regXXXX类的函数集合(Xp_regaddmultistring, Xp_regdeletekey,Xp_regdeletevalue,Xp_regenumkeys,Xp_regenumvalues, Xp_regread,Xp_regremovemultistring,Xp_regwrite)。
攻击者可以利用这些函数修改注册表,如读取SAM 值,允许建立空连接,开机自动运行程序等。
Ø 用其他存储过程去改变服务器
Xp _servicecontrol过程允许用户启动,停止服务
Xp_availablemedia 显示机器上有用的驱动器
Xp_dirtree 允许获得一个目录树
Xp_enumdsn 列举服务器上的ODBC数据源
Xp_loginconfig 获取服务器安全信息
Xp_makecab 允许用户在服务器上创建一个压缩文件
Xp_ntsec_enumdomains 列举服务器可以进入的域
Xp_terminate_process 提供进程的进程ID,终止此进程
攻击者可以利用这些存储过程来得到服务器信息,进而去攻击服务器。
l SQL注入的防御
其实SQL注入的方式不论是Post还是Get方式,注入的参数类型也就是字符型和整型两种,对于这两种参数类型的防御,可以分别采取以下措施:
u 对参数进行判断
Ø 字符型参数:
对能够引起SQL注入的字符做替换处理,例如:
「'」→「''」
「/」→「//」
「%」→「/%」
「_」→「/_」
Ø 整型参数
对整型参数,在取得参数的值后,通过验证参数值的类型的合法化,来避免SQL
的注入。
例如:
通过VBScript的函数IsNumeric来判断整型参数的输入值是否合法;
或者通过CLng函数进行对输入值进行转换,捕获Err.Number的方式,来判断整型参数的输入值是否合法。
u PlaceHolder方式
<%
Set ObjConn = Server.CreateObject("ADODB.Connection")
ObjConn.Open "sample","dbuser","dbpass"
Set ObjCmd = Server.CreateObject("ADODB.Command")
ObjCmd.CommandText= "SELECT * FROM user WHERE userid=? AND password=?"
ObjCmd.CommandType = 1
ObjCmd.ActiveConnection = ObjConn
userid = Request.QueryString("userid")
Set ObjUserid = Server.CreateObject("ADODB.Parameter")
ObjUserid.Value = userid
ObjUserid.Size = Len(userid)
ObjUserid.Type = 200
ObjCmd.Parameters.Append ObjUserid
password = Request.QueryString("password")
Set ObjPassword = Server.CreateObject("ADODB.Parameter")
ObjPassword.Value = password
ObjPassword.Size = Len(password)
ObjPassword.Type = 200
ObjCmd.Parameters.Append ObjPassword
Set ObjRS = ObjCmd.Execute()
%>
使用上面的方法,可以将参数的检查和无害化交由系统进行处理
l 总结
SQL注入产生的后果虽然很严重,但只要我们在编码时进行正确的防御就可以了,在Web应用中,无论是采用Post还是Get方式传递SQL的参数,要做到以下几点:
1. 整型参数要验证类型的合法化
2. 字符型参数要对特殊字符进行正确的替换
3. 对DB的操作尽量使用placeholder的方式
以上。
- SQL注入--GET注入
- 注入攻击--SQL注入
- 【sql注入】mysql注入
- SQL注入
- SQL注入
- SQL注入
- sql注入
- SQL注入
- SQL注入
- SQL注入
- SQL注入
- sql注入
- SQL注入
- SQL注入
- SQL注入
- SQL注入
- SQL注入
- sql注入
- “我要金手指”——由模式谈对象对象的基本原则之依赖颠倒原则
- 软件配置管理概述
- "未将对象引用设置到对象的实例"异常的原因
- samba的配置-- 在vmware中和windows目录共享
- 鼠标消息
- SQL注入
- using JMX to Manage Web Applications (from tts)
- set constraints all deferred|immediate的作用
- 初试XSL
- 一年前的帖子,一年前的回忆(渐行渐远 2004)
- 可完全定制的Javascript日历 (Callback 实现)
- Eclipse基础--安装eclipse及语言包
- 隐藏在暗中的this指针
- 个人所得税计算器 源代码 及 程序