2023年6月21日发(作者:)

SQL注入成因:

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的。

SQL注入攻击原理:

当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字 符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程 的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序 存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。

SQL注入危害:攻击者可以获得网站敏感信息,例如:网站管理员的用户名以及密码。从而对网站的信息进行窃取或篡改。

入侵操作步骤:

一、找一个类似/?p=YY 的网站。

二、在/?p=YY 后面追加“and 1=1”,并访问该网址即/?p=YY and 1=1 应该与访问原地址得到的结果相同。

三、在/?p=YY 后面追加“and 1=2”,并访问该网址即/?p=YY and 1=2应该与访问原地址得到的结果不同,并提示数据库错误。

(二,三同时满足则此网站必定存在SQL漏洞。)

四、访问/?p=YY and exists (select * from 网站数据库常用表段名)

网站数据库常用表段名:admin users administrator 等,如果进入的网页像步骤二一样,是正常网页,证明存在该表段名。找寻该SQL数据库使用的表名,进而寻找网站的管理员名、密码等信息。我们可以通过Socket编程,把常用表段名写成一个链表,通过Socket编程遍历一边,并找到可入侵点。

五、访问/?p=YY and exists (select [网站数据库常用字段名] from 第四步找到的可入侵表名)

网站数据库常用字段名:admin password username 等,如果进入的网页像步骤二一样,是正常网页,证明存在该字段名。找寻该SQL数据库使用的字段名,进而寻找网站的管理员名、密码等信息。我们可以通过Socket编程,把常用字段名写成一个链表,通过Socket编程遍历一边,并找到更多有用的信息。

六、访问/?p=YY and exists (select *from第四步找到的可入侵表名where第五步找到的可入侵字段名like '_ „)

下划线的长度等于猜测的字段名长度,admin password username 等,如果进入的网页像步骤二一样,是正常网页,证明“_”的长度为该字段长度。找寻该SQL数据库中字段名例如admin、password等字段的长度,进一步得到某些字段的长度信息。我们可以通过Socket编程,写一个for循环,测试各敏感字段的长度。

七、利用第六步中得到的下划线的长度,把其中部分下划线替换为a-z或0-9穷举出字段值。我们可以通过Socket编程,写一个for循环,得到具体字段值。

八、访问/可入侵后门字段名,找到网站后门。我们可以用Socket编程穷举常见网站后门地址。

九、利用从数据库中查到的敏感数据进入网站后门。

如何防止SQL注入:

1>在后台方面:

1) 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。

在构造动态SQL语句时,一定要使用类安全(type-safe)的参数加码机制。大多数的数据API,包括ADO和ADO. NET,有这样的支持,允许你指定所提供的参数的确切类型(譬如,字符串,整数,日期等),可以保证这些参数被恰当地escaped/encoded了,来避免黑客利用它们。一定要从始到终地使用这些特性。

例如,在ADO. NET里对动态SQL,你可以象下面这样重写上述的语句,使之安全:

Dim SSN as String = tring("SSN")

Dim cmd As new SqlCommand("SELECT au_lname, au_fname FROM authors WHERE

au_id = @au_id")

Dim param = new SqlParameter("au_id", r)

= SSN

(param)

这将防止有人试图偷偷注入另外的SQL表达式(因为ADO. NET知道对au_id的字符串值进行加码),以及避免其他数据问题(譬如不正确地转换数值类型等)。注意,VS 2005内置的TableAdapter/DataSet设计器自动使用这个机制,ASP. NET 2.0数据源控件也是如此。 一个常见的错误知觉(misperception)是,假如你使用了存储过程或ORM,你就完全不受SQL注入攻击之害了。这是不正确的,你还是需要确定在给存储过程传递数据时你很谨慎,或在用ORM来定制一个查询时,你的做法是安全的。

2) 在部署你的应用前,始终要做安全审评(security review)。建立一个正式的安全过程(formal security process),在每次你做更新时,对所有的编码做审评。后面一点特别重要。很多次我听说开发队伍在正式上线(going live)前会做很详细的安全审评,然后在几周或几个月之后他们做一些很小的更新时,他们会跳过安全审评这关,推说,“就是一个小小的更新,我们以后再做 编码审评好了”。请始终坚持做安全审评。

3) 千万别把敏感性数据在数据库里以明文存放。我个人的意见是,密码应该总是在单向(one-way )hashed过后再存放,我甚至不喜欢将它们在加密后存放。在默认设置下,ASP.

NET 2.0 Membership API 自动为你这么做,还同时实现了安全的SALT 随机化行为(SALT

randomization behavior)。如果你决定建立自己的成员数据库,我建议你查看一下我们在这里发表的我们自己的Membership provider的源码。同时也确定对你的数据库里的信用卡和其他的私有数据进行了加密。这样即使你的数据库被人入侵(compromised)了的话, 起码你的客户的私有数据不会被人利用。

4)确认你编写了自动化的单元测试,来特别校验你的数据访问层和应用程序不受SQL注入攻击。这么做是非常重要的,有助于捕捉住(catch)“就是一个小小的更新,所有不会有安全问题”的情形带来的疏忽,来提供额外的安全层以避免偶然地引进坏的安全缺陷到你的应用里去。

应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。

5)锁定你的数据库的安全,只给访问数据库的web应用功能所需的最低的权限。如果web应用 不需要访问某些表,那么确认它没有访问这些表的权限。如果web应用只需要只读的权限从你的account payables表来生成报表,那么确认你禁止它对此表的

insert/update/delete 的权限。

2>预防工具:

Pangolin(中文译名为穿山甲)一款帮助渗透测试人员进行Sql注入测试的安全工具,是深圳宇造诺赛科技有限公司(Nosec)旗下的网站安全测试产品之一。

Pangolin能够通过一系列非常简单的操作,达到最大化的攻击测试效果。它从检测注入开始到最后控制目标系统都给出了测试步骤。Pangolin是目前国内使用率最高的SQL注入测试的安全软件,可以说是网站安全测试人员的必备工具之一。

JSky(中文名字为竭思),是深圳市宇造诺赛科技有限公司的产品是一款简明易用的Web漏洞扫描软件,是一款针对与网站漏洞扫描的安全软件,JSky能够评估一个网站是否安全,对网站漏洞分析,判断是否存在漏洞,又称为网站漏洞扫描工具。

JSky可以检测出包括SQL注入、跨站脚本、目录泄露、网页木马等在内的所有的WEB应用层漏洞,渗透测试功能让您熟知漏洞危害。

2023年6月21日发(作者:)

SQL注入成因:

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的。

SQL注入攻击原理:

当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字 符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程 的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序 存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。

SQL注入危害:攻击者可以获得网站敏感信息,例如:网站管理员的用户名以及密码。从而对网站的信息进行窃取或篡改。

入侵操作步骤:

一、找一个类似/?p=YY 的网站。

二、在/?p=YY 后面追加“and 1=1”,并访问该网址即/?p=YY and 1=1 应该与访问原地址得到的结果相同。

三、在/?p=YY 后面追加“and 1=2”,并访问该网址即/?p=YY and 1=2应该与访问原地址得到的结果不同,并提示数据库错误。

(二,三同时满足则此网站必定存在SQL漏洞。)

四、访问/?p=YY and exists (select * from 网站数据库常用表段名)

网站数据库常用表段名:admin users administrator 等,如果进入的网页像步骤二一样,是正常网页,证明存在该表段名。找寻该SQL数据库使用的表名,进而寻找网站的管理员名、密码等信息。我们可以通过Socket编程,把常用表段名写成一个链表,通过Socket编程遍历一边,并找到可入侵点。

五、访问/?p=YY and exists (select [网站数据库常用字段名] from 第四步找到的可入侵表名)

网站数据库常用字段名:admin password username 等,如果进入的网页像步骤二一样,是正常网页,证明存在该字段名。找寻该SQL数据库使用的字段名,进而寻找网站的管理员名、密码等信息。我们可以通过Socket编程,把常用字段名写成一个链表,通过Socket编程遍历一边,并找到更多有用的信息。

六、访问/?p=YY and exists (select *from第四步找到的可入侵表名where第五步找到的可入侵字段名like '_ „)

下划线的长度等于猜测的字段名长度,admin password username 等,如果进入的网页像步骤二一样,是正常网页,证明“_”的长度为该字段长度。找寻该SQL数据库中字段名例如admin、password等字段的长度,进一步得到某些字段的长度信息。我们可以通过Socket编程,写一个for循环,测试各敏感字段的长度。

七、利用第六步中得到的下划线的长度,把其中部分下划线替换为a-z或0-9穷举出字段值。我们可以通过Socket编程,写一个for循环,得到具体字段值。

八、访问/可入侵后门字段名,找到网站后门。我们可以用Socket编程穷举常见网站后门地址。

九、利用从数据库中查到的敏感数据进入网站后门。

如何防止SQL注入:

1>在后台方面:

1) 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。

在构造动态SQL语句时,一定要使用类安全(type-safe)的参数加码机制。大多数的数据API,包括ADO和ADO. NET,有这样的支持,允许你指定所提供的参数的确切类型(譬如,字符串,整数,日期等),可以保证这些参数被恰当地escaped/encoded了,来避免黑客利用它们。一定要从始到终地使用这些特性。

例如,在ADO. NET里对动态SQL,你可以象下面这样重写上述的语句,使之安全:

Dim SSN as String = tring("SSN")

Dim cmd As new SqlCommand("SELECT au_lname, au_fname FROM authors WHERE

au_id = @au_id")

Dim param = new SqlParameter("au_id", r)

= SSN

(param)

这将防止有人试图偷偷注入另外的SQL表达式(因为ADO. NET知道对au_id的字符串值进行加码),以及避免其他数据问题(譬如不正确地转换数值类型等)。注意,VS 2005内置的TableAdapter/DataSet设计器自动使用这个机制,ASP. NET 2.0数据源控件也是如此。 一个常见的错误知觉(misperception)是,假如你使用了存储过程或ORM,你就完全不受SQL注入攻击之害了。这是不正确的,你还是需要确定在给存储过程传递数据时你很谨慎,或在用ORM来定制一个查询时,你的做法是安全的。

2) 在部署你的应用前,始终要做安全审评(security review)。建立一个正式的安全过程(formal security process),在每次你做更新时,对所有的编码做审评。后面一点特别重要。很多次我听说开发队伍在正式上线(going live)前会做很详细的安全审评,然后在几周或几个月之后他们做一些很小的更新时,他们会跳过安全审评这关,推说,“就是一个小小的更新,我们以后再做 编码审评好了”。请始终坚持做安全审评。

3) 千万别把敏感性数据在数据库里以明文存放。我个人的意见是,密码应该总是在单向(one-way )hashed过后再存放,我甚至不喜欢将它们在加密后存放。在默认设置下,ASP.

NET 2.0 Membership API 自动为你这么做,还同时实现了安全的SALT 随机化行为(SALT

randomization behavior)。如果你决定建立自己的成员数据库,我建议你查看一下我们在这里发表的我们自己的Membership provider的源码。同时也确定对你的数据库里的信用卡和其他的私有数据进行了加密。这样即使你的数据库被人入侵(compromised)了的话, 起码你的客户的私有数据不会被人利用。

4)确认你编写了自动化的单元测试,来特别校验你的数据访问层和应用程序不受SQL注入攻击。这么做是非常重要的,有助于捕捉住(catch)“就是一个小小的更新,所有不会有安全问题”的情形带来的疏忽,来提供额外的安全层以避免偶然地引进坏的安全缺陷到你的应用里去。

应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。

5)锁定你的数据库的安全,只给访问数据库的web应用功能所需的最低的权限。如果web应用 不需要访问某些表,那么确认它没有访问这些表的权限。如果web应用只需要只读的权限从你的account payables表来生成报表,那么确认你禁止它对此表的

insert/update/delete 的权限。

2>预防工具:

Pangolin(中文译名为穿山甲)一款帮助渗透测试人员进行Sql注入测试的安全工具,是深圳宇造诺赛科技有限公司(Nosec)旗下的网站安全测试产品之一。

Pangolin能够通过一系列非常简单的操作,达到最大化的攻击测试效果。它从检测注入开始到最后控制目标系统都给出了测试步骤。Pangolin是目前国内使用率最高的SQL注入测试的安全软件,可以说是网站安全测试人员的必备工具之一。

JSky(中文名字为竭思),是深圳市宇造诺赛科技有限公司的产品是一款简明易用的Web漏洞扫描软件,是一款针对与网站漏洞扫描的安全软件,JSky能够评估一个网站是否安全,对网站漏洞分析,判断是否存在漏洞,又称为网站漏洞扫描工具。

JSky可以检测出包括SQL注入、跨站脚本、目录泄露、网页木马等在内的所有的WEB应用层漏洞,渗透测试功能让您熟知漏洞危害。