您的位置:首页 > 数据库

SQL注入之我见

2016-04-22 15:37 232 查看

什么是sql注入

指的是通过构建特殊的输入(大都是SQL语法里的一些组合)作为参数传入Web应用程序,并最终达到欺骗服务器执行恶意的SQL命令。其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

sql注入的原理

SQL注入攻击技术就其本质而言,它利用的工具是SQL的语法,针对的是应用程序开发者编程中的漏洞,当攻击者能操作数据,向应用程序中插入一些SQL语句时,SQL注入攻击就发生了。

攻击者直接将代码插入与SQL命令串联并执行的用户输入变量中,间接的将恶意代码注入要在表中存储或作为元数据存储的字符串,在存储的字符串随后串连到一个动态SQL命令中时,执行该恶意代码。

SQL注入攻击是存在于常见的多连接的应用程序中的一种漏洞,攻击者通过在应用程序预先定义好的查询语句结尾加上额外的SQL语句元素,欺骗数据库服务器执行非授权的任意查询。这类应用程序一般是Web应用程序,它允许用户输入查询条件,并将查询条件嵌入SQL语句中,提交到数据库中执行。通过构造畸形SQL语句攻击者能够获取额外的信息数据。

举个例子

假设链接http://10.2.9.68/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit# 中的参数id存在sql注入,那么我们如何确认参数id是注入点呢?

通常我们使用or 1=1或 and 1=2判断有无注入点前者的意义是使sql语句中的where语句永远为真,后者的意义恰恰相反,是使where语句永远为假。另外我们也可以通过使用单引号‘或者双破折号--使原有的SQL语句报错进行判断(往往会在页面中显示sql语句的具体错误信息)

这里我让id的值为1’or 1=1 --。为什么选择这样的值呢?首先通过’号闭合原来SQL语句的’号,or 1=1设置where语句永远为真,--注释掉后面的sql语句。

大家可能还是有些不懂,那么我们看一下源代码中sql语句是如何编写的



当我们设置id的值为1’or 1=1 –时,SQL语句变成了SELECT first_name, last_name FROM users WHERE user_id = '1' or 1=1-- ' ,等效于SELECT first_name, last_name FROM users

这样我们就获取到了users表中的first_name, last_name两列的所有数据。

前面的例子只是一个普通的sql注入,页面上会显示一些错误信息从而帮助攻击者进行判断,而另外一种sql注入是sql盲注,返回给我们的结果永远只有两种TRUE和FALSE。在这种情况下我们往往会通过猜测表名,列名的方式来获取信息,而且非常耗时且需要向Web服务发送很多请求。

sql注入的危害及防范方法

危害:攻击者不仅可以获取网站数据,还可以生成网站后门,后门程序可以得到web用户的所有权限,包括对数据库的增删改查,文件的修改等

防范方法:最简单最容易的是限制用户输入,特殊字符过滤。最好的办法就是不写拼接SQL,改用参数化SQL或者使用存储过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息