| 关键词:SQL 攻击者 查询 数据库 语句 用户 Password Username 输入 权限 |
![]() SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。 可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作, 甚至有可能获取数据库乃至系统用户最高权限。 而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码, 程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变, 额外的执行了攻击者精心构造的恶意代码。 ![]() SQL注入实例很多Web开发者没有意识到SQL查询是可以被篡改的,从而把SQL查询当作可信任的命令。 殊不知,SQL查询是可以绕开访问控制,从而绕过身份验证和权限检查的。更有甚者,有可能通过SQL查询去运行主机系统级的命令。 下面将通过一些真实的例子来详细讲解SQL注入的方式。 考虑以下简单的登录表单: 我们的处理里面的SQL可能是这样的: String username = request.get("username");
String password = request.get("password");
String sql = "SELECT * FROM user WHERE username="+username+" AND password="+password+"";
如果用户的输入的用户名如下,密码任意: myuser or foo = foo -- 那么我们的SQL变成了如下所示: SELECT * FROM user WHERE username=myuser or foo = foo -- AND password=xxx 在SQL里面–是注释标记,所以查询语句会在此中断。这就让攻击者在不知道任何合法用户名和密码的情况下成功登录了。 对于MSSQL还有更加危险的一种SQL注入,就是控制系统, 下面这个可怕的例子将演示如何在某些版本的MSSQL数据库上执行系统命令: sql:="SELECT * FROM products WHERE name LIKE %"+prod+"%" Db.Exec(sql) 如果攻击提交 a% exec master..xp_cmdshell net user test testpass /ADD -- 作为变量 prod的值,那么sql将会变成 sql:="SELECT * FROM products WHERE name LIKE %a% exec master..xp_cmdshell net user test testpass /ADD--%" MSSQL服务器会执行这条SQL语句,包括它后面那个用于向系统添加新用户的命令。 如果这个程序是以sa运行而 MSSQLSERVER服务又有足够的权限的话,攻击者就可以获得一个系统帐号来访问主机了。 对其他数据库也有类似的攻击。 如何预防SQL注入永远不要信任外界输入的数据,特别是来自于用户的数据,包括选择框、表单隐藏域和 cookie。 就如上面的第一个例子那样,就算是正常的查询也有可能造成灾难。 下面这些建议或许对防治SQL注入有一定的帮助:
![]() 总结SQL注入是危害相当大的安全漏洞。所以对于我们平常编写的Web应用,应该对于每一个小细节都要非常重视。 |
| 本文出处: https://www.toutiao.com/a6642850219375460868/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|