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或者使用存储过程。
相关文章推荐
- SQL中的三值逻辑
- SQL Server 作业批量停止
- 结束SQL阻塞的进程
- 动态生成SQL Server视图作业
- SQL Server 语句操纵数据库
- SQL(结构化查询语句)
- oracle sql日期比较
- linux快速部署mysql服务器
- BBSXP漏洞再探究
- sql 存储过程分页
- 在WINXP系统上安装SQL Server企业版的方法
- Dedecms getip()的漏洞利用代码
- 通过批处理调用SQL的方法(osql)
- SQL Server 存储过程的分页
- ASP程序与SQL存储过程结合使用详解
- SQL SERVER编写存储过程小工具
- 防御SQL注入攻击时需要注意的一个问题
- PostgreSQL教程(十九):SQL语言函数