设为首页 收藏本站
查看: 3345|回复: 0

[经验分享] 检测到目标URL存在SQL注入漏洞

[复制链接]

尚未签到

发表于 2018-10-24 10:21:39 | 显示全部楼层 |阅读模式
防护建议包括部署分层安全措施(包括在接受用户输入时使用参数化的查询)、确保应用程序仅使用预期的数据、加固数据库服务器防止不恰当的访问数据。  建议使用以下措施防范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
  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";>  传统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注入漏洞。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625807-1-1.html 上篇帖子: 给xen server添加一个ISO的本地存储,让xen server冲本地读取ISO-Acadia的技术小站 下篇帖子: SQL存储过程中游标的用法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表