SQL注入-概述

什么是sql注入漏洞?

攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据
库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而
实现对后台数据库乃至整个应用系统的入侵。


SQL注入原理

服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当做SQL语句执行,从而影响数据库安全和平台安全。


SQL注入条件

1 用户能够控制输入
2 原本程序要执行的SQL语句,拼接了用户输入的恶意数据


注入过程


sql注入漏洞形成原因

1.动态字符串构建引起

①不正确的处理转义字符(宽字节注入)

有些网站为了防止用户判断sql注入点  会将用户输入的单引号'前增加一个转义符\ 对单引号进行转义 变成一个普通字符 不会与服务器端的单引号形成闭合关系

针对这种机制 有些黑客脑洞大开 如果数据库或者应用程序对于字符编码方式为GBK
很多字符通过多字节方式进行编码的 如果在\前面加加入%df 得到%df\ 在GBK编码方式下会变成一个汉字 这样一来\就变成了汉字 单引号相当于逃逸了出来 和服务器中的固定代码的单引号进行结合 这种方式称为宽字节注入  不正确的处理转义字符造成的


不正确的处理错误(报错泄露信息)

数据库中通常会有报错函数 这个报错函数 原本是为了方便程序员调试程序 观察错误原因 比如输入的命令中出现了一个错误的字符 这个时候通过报错函数 可以提醒程序员 但是呢报错函数也有可能被黑客用来作为注入的手段 因为可以构造一些信息 故意让数据库报错 从报错信息中提取关键信息

比如提取数据库类型 数据库型号 甚至可以得到数据库中存放的数据


不正确的联合查询

sql语法中 有个命令是union  他可以进行联合查询 可以构造语句 使联合查询的语句和正常输出的语句拼接 一起输出  前提是 原列的数量与union查询的数量相等  这样就迫使页面返回管理员不期望得到的结果  对union没有过滤机制的话 很有可能造成一些注入漏洞


不正确的处理多次提交(二次注入

第一次提交的时候 虽然语句精心构造  但是前端有防御机制 语句被写入数据库中了 没有引发SQL注入攻击 但是这时数据库已经把提交的语句存储到了数据库中了 等别的用户从数据库中读取的时候 这个时候如果读取的时候没有防御机制的话 就有可能造成二次注入

2.后台存在的问题

后台无过滤或编码用户数据

数据库可以拼接用户传递的恶意代码

3.错误处理不当

详细的内部错误消息显示给用户或攻击者

错误信息可以直接给攻击者提供下一步的攻击帮助

4.不安全的数据库配置

默认账户

sql server "sa" 作为数据库系统管理员账户

MySQL使用 root 和anonymous 用户账户

Oracle 则在创建数据库是通常默认会创建SYS SYSTEMS DBSNMP 和 OUTLN账户

5.权限

问题 系统和数据库管理员在安装数据库服务器时允许roots SYSTEM或 Administrator特权系统用户账户身份执行操作

正确方法 应该始终以普通用户身份你运行服务器上的服务 降低用户权限 将用户权限只限于本服务


SQL注入带来的危害

  1. 绕过登录验证:使用万能密码登录网站后台等
  2. 获取敏感数据:获取网站管理员帐号、密码等
  3. 文件系统操作:列目录,读取、写入文件等
  4. 注册表操作:读取、写入、删除注册表等
  5. 执行系统命令:远程执行命令

sql 注入分类

按照数据型分类

  • 数字型(整型)注入

输入的参数为整数 如:id 年龄 页码 如果存在注入型漏洞 则为数字型(整型)注入

http://www.baidu.com/user.php?id=1

实际查询代码原型类似于 select ... from ... where id=$id...

数字型注入测试方法

http://www.baidu.com/user.php?id=3'          返回错误,未对单引号做处理(多了一个' 语法错误)

http://www.baidu.com/user.php?id=3 and 1=1  运行正常

http://www.baidu.com/user.php?id=3 and 1=2  运行异常


  • 字符型注入

与数字型注入的区别在于:字符型的注入一般要使用单引号来闭合

http://www.baidu.com/user.php?user=admin

际查询代码原型类似于 select ... from ... where user='$user'...

字符型注入测试方法 

http://www.baidu.com/user.php?user=admin'                 返回错误(多了一个' 语法错误)

http://www.baidu.com/user.php?user=admin' --+           运行正常 

http://www.baidu.com/user.php?user=admin' and '1'='1 运行正常

http://www.baidu.com/user.php?user=admin' and '1'='2 运行异常

解释:为什么注释 -- 要写成+ 注释语法格式 --空格 但是空格大概率会被url去除 从而导致语法错误 所以要写加上一个+号 +号到后面会被转换成空格


  • 搜索型注入

这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在连接地址中有"keyword=关键字",有的不显示链接地址,而是直接通过搜索框表单提交。

此类注入点提交的sql语句原型大概为:select * from 表名 where 字段 like '%关键字%'

当我们提交注入参数为keyword='and[查询条件] and '%'=',则向数据库提交的sql语句为:select * from 表名 where 字段 like '%' and [查询条件] and '%'='%'

按照注入技术(执行效果)分类

  • 基于布尔的盲注:可以根据返回页面判断条件真假的注入
  • 基于时间的盲注:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断
  • 基于报错的注入:即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中
  • 联合查询注入:可以使用union的情况下的注入
  • 堆查询注入:同时执行多条语句的注入

sql注入简单示例

  • 通过在用户名处传入参数' or 1=1 -- 进行万能密码登录

SELECT username,password FROM users WHERE username='textvalue1' or 1=1 -- 'AND password='textvalue2'(-- 后面有一个空格)

输入的参数值为:

usr=' or 1=1 --   

pwd=anything

实际查询代码

SELECT * FROM users WHERE username= '' or 1=1 -- 'AND password='anything'

  • 判断一个HTTP请求是否存在SQL注入的方式

and 1=1 | and 2>1 | or 1=1 | or 1<1   (and 一假则假 or 一真则真)

sleep(4)=1 | length(user())>3

单引号' 双引号"


注入点位置

1,GET方法

注入点在url中 动态参数在url中

一种请求服务器的HTTP方法 也就是获取资源的方法 使用该方法时 信息包含在URL中

点击一个链接时 一般会使用该方法

GET请求方法的格式

?test=value1&cat=value2&num=value3... (num cat test 属于动态参数)

修改方法

浏览器的导航栏中直接修改即可操纵这些参数

HackBar插件


2,POST方法

注入点在表单中 动态参数在表单中

POST是一种用于向web服务器提交信息的HTTP方法

数据信息无法再URL中看到

可以发送字节大的数据

消息存放在报文的请求体中 由于在POST表单当中 所以数据信息无法再url中查看到

POST相较于GET 安全性高 传递的消息在表单中 无特殊工具 是看不到表单中的信息

Hackbar需要点击post data 由于使用表单提交数据  无法直接看出动态参数名 所以先使用F12查看 在源码中查看动态参数名

burpsuite直接就能抓取到表单信息 直接就能显示动态参数名 无语额外操作


3,HTTP头部

如果数据会要对头部信息提取数据 就有可能造成sql注入

Cookie

Host

User-Agent

关于注入点的总结

只要后台接收前端输入的数据 并且未对数据进行过滤处理 最后直接进入到数据库中 从而都能构成威胁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello-smile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值