SQL注入原理

什么是sql注入?
为什么要sql注入?
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. 不管客户端是否做过数据校验,在服务端必须要有数据校验(长度、格式、是否必填等等)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值