sql注释符注入防御_SQL注入(SQL Injection)案例和防御方案

sql注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

SQL注入攻击的主要危害包括:

非法读取、篡改、添加、删除数据库中的数据;

数据库信息泄漏:数据库中存放的用户的隐私信息的泄露,攻击者盗取用户的各类敏感信息,获取利益。

网页篡改:通过修改数据库来修改网页上的内容。

数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改,攻击者私自添加或删除账号

网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击;

服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。

破坏硬盘数据,瘫痪全系统。

SQL注入的产生原因通常表现在以下几方面:

1. 不当的类型处理;

2. 不安全的数据库配置;

3. 不合理的查询集处理;

4. 不当的错误处理;

5. 转义字符处理不合适;

6. 多个提交处理不当。

SQL注入攻击案例:

查看文章的注入案例:

查看某篇文章的url参数为:?id=1

则通过注入命令:?id=1 or 1=1,则可以列出整个数据表里面的所有文章。

如果查看用户是通过user_id来访问,如:?uid=1

则通过注入命令:?id=1 or 1=1, 则可以把整个用户表的记录全部显示出来

SQL命令如下:

通过?id=1的SQL命令为:select * from article where id=1,此语句查询到1条结构

通过?id=1 and 1=1的SQL命令为:select * from article where id=1 or 1=1,此语句查询到整个表的记录

用户登录的注入案例:

登录表单有user_name字段,查询语句为:select * from users where nickname='{user_name}'

则可以在user_name文本框填入:(' or 1='1),这样可以构造出注入的SQL命令:select * from users where user_name='' or 1='1',这样很容易就进入系统了。

SQL注入猜表:

在登录页面的用户名字段填入:(' or 1=(select count(0) from t_porg_document) or 1='1),可以构造出注入的SQL命令:select * from users where user_name='' or 1=(select count(0) from recharge) or 1='1'

这样就可以猜测是否recharge表存在.存在则语句正常执行,否则就报错了。

猜中表名后,就可以对数据表进行增删改查的操作,如:

在登录页面的用户名字段填入:('; delete from users),可以构造出危险的SQL命令:select * from users where user_name=''; delete from users;

通过加分号,可以构造出任意增删改查sql语句,整个数据库就被攻击者随意控制了。

对SQL注入的防御方法主要有:

1. 字符串长度验证,仅接受指定长度范围内的变量值。sql注入脚本必然会大大增加输入变量的长度,通过长度限制,比如用户名长度为 8 到 20 个字符之间,超过就判定为无效值。

2. 对单引号和双"-"、下划线、百分号等sql注释符号进行转义

3. 对接收的参数进行类型格式化,如id参数值获取后,进行int类型转换

4. 永远不要使用动态拼装SQL,推荐使用参数化的SQL或者直接使用存储过程进行数据查询存取。sql注入最主要的攻击对象就是动态拼装的SQL,通过参数化查询可以极大减少SQL注入的风险。

5. 永远不要使用管理员权限的数据库连接(sa、root、admin),为每个应用使用单独的专用的低特权账户进行有限的数据库连接。

6. 不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。这样对方就算获取到整个表的数据内容,也没什么价值。

7. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息输出到日志而不是在页面中展示。

8. 做好XSS跨站攻击的防护,防止攻击者伪造管理员信息进入系统后台

9. 不管客户端是否做过数据校验,在服务端必须要有数据校验(长度、格式、是否必填等等)

SQL注入检测工具:

http://blog.jobbole.com/17763/ 10个SQL注入工具

http://netsecurity.51cto.com/art/201412/458837.htm 国产SQL注入漏洞测试工具——SSQLInjection

https://www.oschina.net/search?scope=project&q=sql注入 sql注入工具排行榜

编程语言自带的过滤方法:

PHP

普通输入可以用mysql_real_escape_string() / mysqli_real_escape_string()来转义特殊的输入字符;

like查询语句中,如果用户输入的值有"_"和"%",则会出现这种情况:用户本来只是想查询"abcd_",查询结果中却有"abcd_"、"abcde"、"abcdf"等等;用户要查询"30%"(注:百分之三十)时也会出现问题。

在PHP脚本中我们可以使用addcslashes()函数来处理以上情况,如下实例:

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");

// $sub == \%something\_

参考文章:

http://blog.csdn.net/stilling2006/article/details/8526458 (SQL注入原理讲解,很不错!)

http://netsecurity.51cto.com/art/201009/226227.htm (SQL注入攻击三部曲之入门篇)

http://www.runoob.com/mysql/mysql-sql-injection.html (MySQL 及 SQL 注入)

http://www.jb51.net/article/18874.htm (SQL注入中绕过 单引号 限制继续注入)

http://www.knowsky.com/441536.html (让SQL注入攻击危害最小化三大措施)

http://www.cnblogs.com/smilewxt/p/4229810.html (SQL注入的原理以及危害)

http://blog.jobbole.com/105586/ (记一次SQL注入实战)

https://my.oschina.net/qjedu/blog/1504004 (SQL注入详解)

演示文件下载:

版权声明:本文采用署名-非商业性使用-相同方式共享(CC BY-NC-SA 3.0 CN)国际许可协议进行许可,转载请注明作者及出处。

本文标题:SQL注入(SQL Injection)案例和防御方案

本文链接:http://www.cnblogs.com/sochishun/p/6994918.html

本文作者:SoChishun (邮箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)

发表日期:2017年6月12日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值