SQL注入(SQL Injection)

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。攻击者通过web请求提交带有影响正常SQL执行的参数(arlen’ OR ‘1’=’1),服务端在执行SQL时参数的特殊性影响了原本的意思(select * from table where user=’arlen\’ OR \’1\’=\’1’;),执行了非预期的操作(select * from table where user=’arlen’ OR ‘1’='1’),从而是攻击者获取到了其他用户的信息或者对服务造成了攻击。

SQL注入操作简单,危害严重,现在也有比较成熟的防范措施,但是往往因为开发人员操作不当(例如:忘记过滤参数、不当的错误处理、配置失误)而产生风险,如果未被发现SQL注入漏洞并不影响任何系统功能,往往也不被察觉,一旦攻击者发现SQL漏洞,后果就比较严重。

SQL注入技术原理

    在大多数web接口传入的参数最终都会反映到数据库表中的某一字段,例如用户登录的例子:

后端代码通过如下方法实现:

<?php
$con = mysql_connect("localhost", "xxx", "xxx");
if (!$con)
{
die('Could not connect: '.mysql_error());
} $db_selected = mysql_select_db("xxx", $con);
if (!$db_selected)
{
die('select db test failed: '.mysql_error());
} $user = $_REQUEST["user"];
$pwd = $_REQUEST["password"]; $sql = "select count(*) as count from user_info where user = '$user' AND password = '$pwd';"; $sql_query = mysql_query($sql, $con);
if (!$sql_query)
{
die(' mysql_query failed: '.mysql_error());
} $num = 0;
if (!$data = mysql_fetch_object($sql_query))
{
die('mysql_fetch_object failed: '.mysql_error());
}
else
{
$num = $data->count;
} if (0 >= $num)
{
echo "user[$user] login failed!";
}
else
{
echo "user[$user] login succ!";
} ?>

在后端实现是通过下面SQL来判断用户和密码是否匹配:

SELECT COUNT (*) as count FROM user_info WHERE user='arlen' AND password='';

如果服务器没有做过滤操作,可以令user=arlen’ or ‘1’='1来进行登录,即便完全不知道用户arlen对应的密码一样可以校验通过,php拼装的SQL语句为:

SELECT COUNT (*) as count FROM user_info WHERE user='arlen' or '' = '' AND password='';

这样只要user_info表中有数据就能通过login的校验。

SQL注入的原理就是在正常station 字段中注入特征字符,能组合成新的SQL 语句。SQL注入学习成本低,攻击性高,容易防范,但往往因为工作上的失误或者测试的不足而留下漏洞。

SQL注入防御

SQL注入原理简单易学,但防范起来却略为复杂,本质就是防止用户输入的不安全参数放映到具体的SQL语句上,例如:

1. web参数过滤,只允许约定的字符出现,比如数字、字母,100%解决问题,但过于暴力;

2. 对需要拼装SQL语句的参数做过滤,例如PHP自带的mysql_real_escape_string()函数,修改上述代码如下:

if (!$db_selected)
{
die('</br>select db test failed: '.mysql_error());
} $user = mysql_real_escape_string($_REQUEST["user"]);
$pwd = mysql_real_escape_string($_REQUEST["password"]); $sql = "select count(*) as count from user_info where user = '$user' AND password = '$pwd';"; echo $sql; $sql_query = mysql_query($sql, $con);

这样实际执行的SQL为:

select count(*) as count from user_info where user = 'arlen\' or \'1\' = \'' AND password = '';

3. 小心拼写SQL语句,一定要注意拼接SQL字段各个字段的来源,如果是外部传入的,根据不信任原则,一定要严格校验过滤;

4. 设置Mysql权限,只给访问数据库的web应用功能所需的最低权限帐户,这种只能降低损失,并不能避免注入;

5. 避免将数据库的错误信息直接返回,对于Mysql错误,程序一定要识别后再做返回,避免将错误描述直接返回给前端。

6. 小心、细心,SQL注入最常出现在开发人员粗心时;

7. 借助SQL注入扫描工具。

SQL注入其他资料

百度百科:http://baike.baidu.com/view/3896.htm

SQL注入危害:http://www.cnblogs.com/hkncd/archive/2012/03/31/2426274.html

WebGoat学习——SQL注入(SQL Injection)的更多相关文章

  1. SQL注入(SQL Injection)案例和防御方案

    sql注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. SQL注入攻击的主要危害包括:非法读取.篡 ...

  2. SQL注入——SQL Injection

    本文部分内容转自:https://www.cnblogs.com/rush/archive/2011/12/31/2309203.html http://www.diybl.com/course/7_ ...

  3. Web安全相关(五):SQL注入(SQL Injection)

    简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...

  4. DVWA 黑客攻防演练(八)SQL 注入 SQL Injection

    web 程序中离不开数据库,但到今天 SQL注入是一种常见的攻击手段.如今现在一些 orm 框架(Hibernate)或者一些 mapper 框架( iBatis)会对 SQL 有一个更友好的封装,使 ...

  5. 仿sql注入 sql

    <?phpclass sqlsafe { //(and|or)\\b 表示以and和or结尾的单词如:aand,band,都可以匹配//如果匹配and或or则使用 \\b(and|or)\\b来 ...

  6. JDBC课程4--使用PreparedStatement进行增删查改--封装进JDBCTools的功能中;模拟SQL注入 ; sql的date()传入参数值格式!

    主要内容: /*SQL 的date()需要传入参数值: preparedStatement().setDate(new java.util.Date().getTime()); 熟悉了使用Prepar ...

  7. 梨子带你刷burp练兵场(burp Academy) - 服务器篇 - Sql注入 - SQL injection UNION attack, determining the number of columns returned by the query

    目录 SQL injection UNION attack, determining the number of columns returned by the query SQL injection ...

  8. SQL注入学习资料总结

    转载自:https://bbs.ichunqiu.com/thread-12105-1-1.html  什么是SQL注入 SQL注入基本介绍 结构化查询语言(Structured Query Lang ...

  9. 干货 | 精选《SQL注入、渗透、反病毒》学习总结集锦给你们~

    学到手的都是本事,如果觉得对你有帮助也欢迎分享给身边的基友们吧! 分享干货,手留余香哦~ 本次“开学季拜师活动”的徒弟们在师父的精心指导下,在短短5天内得到了迅速地成长,以前或当时遇到的问题都能够柳暗 ...

  10. 风炫安全Web安全学习第十节课 数字型的Sql注入

    数字型的Sql注入 风炫安全Web安全学习第十一节课 字符型和搜索型的sql注入 风炫安全Web安全学习第十二节课 mysql报错函数注入 风炫安全Web安全学习第十三节课 CUD类型的sql注入 风 ...

随机推荐

  1. 纯HTML标签详解

    HTML标签很多,可是实际上常用的却就那么十几二十个,很多标签的功能渐渐的被大家忽略了.然后,如果在适当的时候,用一用,还是能在一定程序上 给我们的页面设计带来一点小小的方便的.下面这些HTML标签基 ...

  2. python -- 一致性Hash

    python有一个python模块--hash_ring,即python中的一致性hash,使用起来也挺简单. 可以参考下官方例子:https://pypi.python.org/pypi/hash_ ...

  3. 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)

    参考了多篇文章,分别记录,如下. 下面是第一篇的总结 http://www.jb51.net/article/76007.htm: 在MySQL中,InnoDB引擎表是(聚集)索引组织表(cluste ...

  4. jQuery_效果(隐藏和显示)

    一.jQuery hide() 显示和 show()隐藏 通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: <script type=" ...

  5. 线程——QQ邮件发送

    一.造一个QQ邮件发送的窗体 二.开始编写关于邮件发送的代码,以及当点发送按钮的时候,给发送按钮单独造了一个新的线程.这样如果发送的附件太多的话,如果不给发送按钮造新的线程,便会卡住,但是如果给发送按 ...

  6. hdu 4622 Reincarnation trie树+树状数组/dp

    题意:给你一个字符串和m个询问,问你l,r这个区间内出现过多少字串. 连接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 网上也有用后缀数组搞得. 思路 ...

  7. 多个MapReduce作业相互依赖时,使用JobControl进行管理

    要处理复杂关系的数据,一个工程里面绝对不止一个MapReduce作业,当有多个MapReduce作业时,       并且每个作业之间有依赖关系,所谓的依赖就是一个作业得到的结果是另外一个作业的输入, ...

  8. [Swift 语法点滴]——数组参数

    Swift语言一如既往的继承了苹果公司卓尔不群的奇葩思维方式,总是要弄得跟别的语言不一样,才能显出它的特殊 比如用数组作为参数上,这格式实在是没有试出来,找了stackoverflow,才找到相应信息 ...

  9. makefile learning

    Copy:http://graybull.is-programmer.com/posts/37758.html 本文给出万能Makefile的具体实现,以及对其中的关键点进行解析.所谓C++万能Mak ...

  10. Http进行网络通信

    http使用get的方式进行网络通信: package com.testGet; import java.io.BufferedReader; import java.io.IOException; ...