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. javascript把IP地址转为数值几种方案,来挑战一下效率吧

    先看看什么是IP地址: IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节).IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~25 ...

  2. sql2000无法打开1433端口及解决方法

    1.如果你是win2003,那么一定要安装sql的补丁sp3a以上版本SP 检查你的SQL有没有打补丁,没有的话要打上补丁,检查的方法是在查询分析器中运行:select @@version如果出来的版 ...

  3. 19.allegro过孔设置[原创]

    一.根据线宽设置过孔 在规则管理器下 --- --- ---- --- --- 二.设置原点 法1: -- -- 法二: 然后鼠标点选 ---option栏目在哪? --- 三:过孔问题1 当一个过孔 ...

  4. [POJ3061]Subsequence(二分,前缀和)

    题目链接:http://poj.org/problem?id=3061 题意:给一个长为n的数列和整数s,求一个连续的子序列,使得这个子序列长度最短并且不小于这个整数s. 统计[1~i]的子序列和su ...

  5. 用vi修改文件,保存文件时,提示“readonly option is set”的解决方法

    来源:http://superuser.com/questions/300500/ubuntu-unable-to-edit-bashrc-file-because-of-readonly This ...

  6. phpStorm中ftp的配置与使用

    小结:很方便,支持ftp功能和比较. 扩展,可以查看远程文件和日期

  7. 【Todo】深入理解Java虚拟机 读书笔记

    有一个在线系列地址 <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M ...

  8. bzoj2119

    题意就是差分后求形如ABA的串的个数,B的长度为M 这是2011国家集训队互测的试题,是道好题,我直接给出出题人的题解吧: 对于这种在线性序列上的组合计数问题,我们很容易想到一个工具:分治!分治算法在 ...

  9. HDU 1244 Max Sum Plus Plus Plus

    虽然这道题看起来和 HDU 1024  Max Sum Plus Plus 看起来很像,可是感觉这道题比1024要简单一些 前面WA了几次,因为我开始把dp[22][maxn]写成dp[maxn][2 ...

  10. 报错:对象必须实现 IConvertible;以分隔符进行分割链接concat_ws的使用方法;mysql数据类型转换cast,convert

    错误故障,mysql  服务器上用 concat_ws 函数,连接了一串数字,最后 服务器返回的字段就变成了一个 byte ,而我们想要的类型是  string 类型,那么转换的时候,就报错了. 正确 ...