解决办法防护建议包括部署分层安全措施(包括在接受用户输入时使用参数化的查询)、确保应用程序仅使用预期的数据、加固数据库服务器防止不恰当的访问数据。

建议使用以下措施防范SQL注入漏洞:

对于开发

========

使用以下建议编写不受SQL注入***影响的web应用。

参数化查询:SQL注入源于***者控制查询数据以修改查询逻辑,因此防范SQL注入***的最佳方式就是将查询的逻辑与其数据分隔,这可以防止执行从用户输入所注入的命令。这种方式的缺陷是可能对性能产生影响(但影响很小),且必须以这种方式构建站点上的每个查询才能完全有效。只要无意中绕过了一个查询,就足以导致应用受SQL注入的影响。以下代码显示的是可以进行SQL注入的SQL语句示例。

sSql = "SELECT LocationName FROM Locations "; sSql = sSql + " WHERE LocationID = " + Request["LocationID"]; oCmd.CommandText = sSql;

下面的例子使用了参数化的查询,不受SQL注入***的影响。

sSql = "SELECT * FROM Locations ";

sSql = sSql + " WHERE LocationID = @LocationID"; oCmd.CommandText = sSql; oCmd.Parameters.Add("@LocationID", Request["LocationID"]);

应用程序没有包含用户输入向服务器发送SQL语句,而是使用-@LocationID-参数替代该输入,这样用户输入就无法成为SQL执行的命令。这种方式可以有效的拒绝***者所注入的任何输入,尽管仍会生成错误,但仅为数据类型转换错误,而不是***可以利用的错误。

以下代码示例显示从HTTP查询字符串中获得产品ID并使用到SQL查询中。请注意传送给SqlCommand的包含有SELECT的字符串仅仅是个静态字符串,不是从输入中截取的。此外还请注意使用SqlParameter对象传送输入参数的方式,该对象的名称(@pid)匹配SQL查询中所使用的名称。

C#示例:

string connString = WebConfigurationManager.ConnectionStrings["myConn"].ConnectionString;

using (SqlConnection conn = new SqlConnection(connString))

{

conn.Open();

SqlCommand cmd = new SqlCommand("SELECT Count(*) FROM Products WHERE ProdID=@pid", conn);

SqlParameter prm = new SqlParameter("@pid", SqlDbType.VarChar, 50);

prm.Value = Request.QueryString["pid"];

cmd.Parameters.Add(prm);

int recCount = (int)cmd.ExecuteScalar();

}

VB.NET示例:

Dim connString As String = WebConfigurationManager.ConnectionStrings("myConn").ConnectionString

Using conn As New SqlConnection(connString) conn.Open()

Dim cmd As SqlCommand = New SqlCommand("SELECT Count(*) FROM Products WHERE ProdID=@pid", conn)

Dim prm As SqlParameter = New SqlParameter("@pid", SqlDbType.VarChar, 50)

prm.Value = Request.QueryString("pid")

cmd.Parameters.Add(prm)

Dim recCount As Integer = cmd.ExecuteScalar()

End Using

验证输入:可通过正确验证用户输入的类型和格式防范大多数SQL注入***,最佳方式是通过白名单,定义方法为对于相关的字段只接受特定的帐号号码或帐号类型,或对于其他仅接受英文字母表的整数或字母。很多开发人员都试图使用黑名单字符或转义的方式验证输入。总体上讲,这种方式通过在恶意数据前添加转义字符来拒绝已知的恶意数据,如单引号,这样之后的项就可以用作文字值。这种方式没有白名单有效,因为不可能事先知道所有形式的恶意数据。

对于安全操作

============

使用以下建议帮助防范对web应用的SQL注入***。

限制应用程序权限:限制用户凭据,仅使用应用运行所必需权限的。任何成功的SQL注入***都会运行在用户凭据的环境中,尽管限制权限无法完全防范SQL注入***,但可以大大增加其难度。

强系统管理员口令策略:通常***者需要管理员帐号的功能才能使用特定的SQL命令,如果系统管理员口令较弱的话就比较容易暴力猜测,增加成功SQL注入***的可能性。另一个选项就是根本不使用系统管理员口令,而是为特定目的创建特定的帐号。

一致的错误消息方案:确保在出现数据库错误时向用户提供尽可能少的信息。不要泄漏整个错误消息,要同时在web和应用服务器上处理错误消息。当web服务器遇到处理错误时,应使用通用的web页面响应,或将用户重新定向到标准的位置。绝不要泄漏调试信息或其他可能对***者有用的细节。

有关如何在IIS中关闭详细错误消息的说明请见:

http://www.microsoft.com/windows2000/en/server/iis/default.asp?url= /windows2000/en/server/iis/htm/core/iierrcst.htm

使用以下句法在Apache服务器上取缔错误消息:

Syntax: ErrorDocument <3-digit-code>

Example: ErrorDocument 500 /webserver_errors/server_error500.txt

WebSphere之类的应用服务器通常默认安装启用了错误消息或调试设置。有关如何取缔这些错误消息的信息,请参考应用服务器文档。

存储过程:如果不使用的话,请***master..Xp_cmdshell、xp_startmail、xp_sendmail、

sp_makewebtask之类的SQL存储过程。

SQL注入漏洞根本上还是取决于web应用程序的代码。尽管不是修复,但可以通过向IDS中添加结合了正则表达式的规则作为紧急措施检测SQL注入***。尽管这无法修复所有可能的SQL注入漏洞,但便于实施,并且要求***者必须要改进其方法才能实现成功的***。可如下使用正则表达式。

***SQL元字符的正则表达式:

/(\%27)|(\')|(\-\-)|(\%23)|(#)/ix

可如下将上述正则表达式添加到Snort规则:

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"SQL Injection- Paranoid";flow:to_server,established;uricontent:".pl";pcre:"/(\%27)|(\')|(\-\-)|(%23)|(#)/i"; classtype:Web-application-attack; sid:9099; rev:5;)

传统SQL注入***的正则表达式:

/\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

***有UNION关键字的SQL注入***的正则表达式:

/((\%27)|(\'))union/ix

(\%27)|(\')

可为其他的SQL查询(如select、insert、update、delete、drop等)编写类似的正则表达式。

在MS SQL服务器上检测SQL注入***的正则表达式:

/exec(\s|\+)+(s|x)p\w+/ix

对于质量保证

============

解决SQL注入缺陷最终要求基于代码的修复,“对于开发”和“对于安全操作”部分所述的步骤提供了修复这些漏洞所必要的信息。以下步骤概述了如何对应用程序手动测试SQL注入。

如何对应用程序手动测试SQL注入:

1. 在浏览器中打开希望测试SQL注入漏洞的web应用。

2. 将鼠标光标悬停在Web站点的链接上并注意底部的状态栏,可以看到链接所指向的URL。找到其中带有参数的URL,如http://www.site.com/articleid.asp?id=42

注释:如果没有在状态栏中看到任何URL,请点击链接然后查看地址栏,直到找到带有参数的URL。

3. 找到带有参数的URL后,点击链接进入网页,在地址栏中可以看到状态栏中的URL。

4. 有两种测试SQL注入脚本的方法,请使用全部两种方式依次测试每个参数值。

方法1. 在地址栏中点击光标,高亮显示参数值,如高亮显示name=value中的value并用单引号(')替换,这时应类似于name='。

方法2. 在地址栏中点击光标,在value中间输入单引号('),这时应类似于name=val'ue。

5. 点击GO键将请求发送到Web服务器。

6. 分析Web服务器响应中的错误消息,大多数数据库错误消息都类似于以下示例:

Example error 1:

Microsoft OLE DB Provider for SQL Server error '80040e14'

Unclosed quotation mark before the character string '51 ORDER BY some_name'. /some_directory/some_file.asp, line 5

Example error 2:

ODBC Error Code = S1000 (General error)

[Oracle][ODBC][Ora]ORA-00933: SQL command not properly ended

Example error 3:

Error: 1353 SQLSTATE: HY000 (ER_VIEW_WRONG_LIST)

Message: View's SELECT and view's field list have different column counts

7. 有时错误消息并不明显,隐藏在页面源码中。如果要查看这些消息,必须查看页面的HTML源码并搜索错误。如果要在Internet Explorer中实现这个操作,点击“查看”菜单,然后选择“源码”选项,这可以打开记事本显示页面的HTML源码。在记事本中,打开“编辑”菜单并选择“查找”。这时会出现一个对话框询问“查找内容”。输入Microsoft OLE DB或[ODBC]然后点击“查找下一个”。

8. 如果6或7步成功,则Web站点存在SQL注入漏洞。

url存在链接注入漏洞_检测到目标URL存在SQL注入漏洞相关推荐

  1. java host头攻击漏洞_Java Web项目漏洞:检测到目标URL存在http host头攻击漏洞解决办法...

    检测到目标URL存在http host头攻击漏洞 详细描述 为了方便的获得网站域名,开发人员一般依赖于HTTP Host header.例如,在php里用_SERVER["HTTP_HOST ...

  2. spring mysql防注入攻击_【spring】(填坑)sql注入攻击 - 持久层参数化

    结果 填坑失败,并没有看懂是如何检测sql攻击的. 只能说的是:建议都使用参数化传递sql语句参数.(所以,用hibernate.mybatis等框架的真不用太担心sql攻击问题.) 前言 在上文中的 ...

  3. Java Web项目漏洞:检测到目标URL存在http host头攻击漏洞解决办法

    2019独角兽企业重金招聘Python工程师标准>>> 如果此博文很幸运的帮助到了您,请问我点个赞吧(✪ω✪)谢谢 1.问题漏洞描述 2.JSP头部中有如下代码,这样的使用方法就会被 ...

  4. 检测到目标URL存在http host头攻击漏洞

    一.前言 漏洞描述:为了方便的获得网站域名,开发人员一般依赖于HTTP Host header.例如,在php里用_SERVER["HTTP_HOST"].但是这个header是不 ...

  5. 检测到目标URL存在http host头攻击漏洞,修复方案:在Web服务器防止Host头攻击

    一.前言 漏洞描述:为了方便的获得网站域名,开发人员一般依赖于HTTP Host header.例如,在php里用_SERVER["HTTP_HOST"].但是这个header是不 ...

  6. thinkphp漏洞_【组件攻击链】ThinkCMF 高危漏洞分析与利用

    一.组件介绍 1.1 基本信息 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架.ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形 ...

  7. 检测到目标URL启用了 Microsoft ASP.NET 调试

      检测到目标URL启用了 Microsoft ASP.NET 调试 1 详细描述 Microsoft ASP.NET 很容易受到信息泄露***.***者可以发送一个通知是否支持调试支持的恶意请求.  ...

  8. php登录框注入,分享一个php的防火墙,拦截SQL注入和xss

    这个是一个一个基于php的防火墙程序,拦截sql注入和xss攻击,无需服务器支持 安装 composer require xielei/waf 使用说明 $waf = new \Xielei\Waf\ ...

  9. 检测到目标url存在框架注入漏洞_HOST注入攻击剖析

    关于网站的渗透测试可能师傅们都有自己一套思路,有个共同点就是目标网站基本属于全静态页面,几乎很少存在动态参数这时意味着客户端无法通过提交参数形式进行测试,理论上也规避掉了许多风险.既然无法从参数层面进 ...

  10. wap建站程序_因建站系统存在SQL注入漏洞,国内两家网络公司被CNVD公开点名

    2月27日,国家信息安全漏洞共享平台(CNVD)的漏洞列表收录了两个新的SQL注入漏洞--CNVD-2019-04308和CNVD-2019-05341.根据CNVD公布的信息来看,这两个漏洞的危害级 ...

最新文章

  1. openSUSE 11 上的配置可以Xmanager远程桌面
  2. python——函数 11、命名空间
  3. 《linux c编程指南》学习手记4
  4. 高通量数据分析必备|基因组浏览器使用介绍 - 1
  5. [流体输配管网]古罗马渡槽从水源到城市的落差估计
  6. 对于数据库视图的一些理解
  7. C语言 pthread_create
  8. 求锤得锤,你要的一致性 hash 来了! | 附代码
  9. Java类加载原理解析(转)
  10. linux文泉驿字体调用,Ubuntu 上安装文泉驿字体的脚本
  11. c语言编程界面优化输出图形,C语言编程实例—输出指定图形
  12. win10默认壁纸_Win10瞬间审美爆炸,5分钟一键美化,不输万元Mac!
  13. 计量经济学实验报告计算机,计量经济学实验报告记录.doc
  14. 微信做图小程序有哪些_高质量的五个微信办公小程序,轻松提高工作效率,办公族必备...
  15. 淘宝怎么提升商品的自然流量效果好?
  16. 修改注册表来修改文件关联
  17. 应用层协议 HTTP HTTPS
  18. 在windows本地创建svn及遇到错误:svn create repository here 报错
  19. 【Yolact训练自己的数据从实战到调参】
  20. go语言项目结合k8s

热门文章

  1. Python 线程复习
  2. group by调优的一些测试
  3. centos安装mysql wsl_windows 10 WSL 安装 Centos
  4. c语言 数组 迷宫,迷宫问题(C语言实现)
  5. shell 启动进程 问号_shell的问号
  6. An NVIDIA kernel module ‘nvidia-drm‘ appears to already be loaded in your kernel...
  7. ac自动机 匹配最长前缀_傻傻分不清吗?——Trie Tree,字典树、前缀树概述
  8. java自动行走_java数据结构实现机器人行走
  9. QT 中QComboBox控件鼠标事件过滤
  10. Qt控件背景图片自适应