Sql注入

什么是Sql注入呢?

Sql注入允许攻击者扰乱对数据库的查询,从而让攻击者查看到正常情况下看不到的数据,甚至删除或修改这些数据

Sql注入有哪些例子?

检索隐藏数据

系统会将用户输入直接拼接到Sql查询语句中,此时可通过注释符(--)取消掉后面限制条件的作用,为了让注释后的sql语句还能正常闭合需要在payload中加入配对的符号,如单引号(')

打破应用逻辑

burp以用户登录举例,正常情况下用户登录需要验证账号和密码,但是如果利用注释符发动Sql注入的话,在拼接到sql语句中时就会取消掉密码字段的作用,这样就会导致只需要用户名正确即可登入该用户

利用Union进行跨库查询

利用Union查询可以在前面语句闭合的情况下插入一条新的查询语句,这样就可以查询同一个数据库服务器下其他库的数据了,但是要想成功利用Union攻击,前后两个sql语句需要满足两个条件:

  • 两者的返回结果需要有相同列数
  • 两者查询结果的每一列中的数据类型也要兼容

那么我们为了满足这两个条件需要获取哪些数据呢:

  • 获取前者查询结果的列数
  • 判断前者查询结果中哪些列的数据类型可以存储注入攻击后的查询结果

如何确定利用Union的注入攻击所需的列数呢?

burp给出了两种获取攻击所需列数的方法

第一种,利用ORDER BY查询子句,不断递增列索引直到出现报错信息即可判断列数,究其原理,ORDER BY的用途就是将查询结果按照第几列排序,如果超出列数即会产生报错从而侧面判断出查询结果有多少列

第二种,利用在Union查询时不断添加空值(NULL)查询字段,如:

' union select [[null,]...]--

如果null的数量与前者查询结果的列数不匹配即会产生报错,反之则不会,此时即可判断前者查询结果有多少列

如何确定Union的查询结果中哪些列的数据类型是适合用来存放注入结果的呢?

在确定列数以后,将不同数据类型的测试字符串填充到不同的位置观察响应,如果某位置的数据类型与该位置的填充字符串数据类型不符即会报错,反之则不会,从而可判断当前位置适不适合存放注入的查询结果

如何利用Union注入查询敏感数据?

当知道目标表和各列的名字后即可在可存放注入结果的位置填充这些列从而得到某些敏感数据

如何在单列中检索多个值呢?

在Union注入语句中,利用不同种类数据库中的不同字段连接符将多列的查询结果连接成一个字符串,然后再添加一个可标识的符号区分不同字段

如何通过Sql注入获取数据库详细信息呢?

获取数据库的类型和版本

不同的数据库,查询数据库版本的语句不太一样,这时候可以fuzz一下对比一下结果就可以很直观地判断数据库的类型,当类型匹配时就顺便也能看到数据库版本了

枚举数据库的内容

大多数数据库会提供一个预览模式会提供关于数据库的一些信息,如当前数据库服务器有哪些库、表、列,非Oracle数据库利用的是information_schema,Oracle数据库利用的是all_tables、all_tab_columns

利用盲注

所谓盲注就是无法直接看到注入的结果,这时候Union注入就不管用了,只能靠各种方法去猜结果的每一位是什么字符,根据利用条件可以再分为三种:

  • 布尔盲注
  • 时间盲注
  • 带外盲注

布尔盲注原理是什么?

布尔盲注就是响应的结果只有两种,此时只能通过一个字符一个字符地猜,不断缩小字符的范围从而确定是什么字符,布尔盲注的流程如下:

  • 猜查询结果长度

    • length(列)[<,>,=][长度]
  • 猜每一位字符
    • substring(列,[第几位],1)[<,>,=][字符]

报错盲注原理是什么?

报错盲注就是在布尔盲注无法生效的情况下的盲注手段,通过制造报错来重新输出可表示语句执行成功与否的响应,报错盲注的流程如下:

  • 猜查询结果长度

    • 报错模板语句(length(列)[<,>,=][长度])
  • 猜每一位字符
    • 报错模板语句(substring(列,[第几位],1)[<,>,=][字符])

时间盲注原理是什么?

时间盲注就是利用延时延时函数让sql语句成功执行时延时一定的时间再接收到响应,但是时间盲注生效有个前提条件就是支持堆叠查询,延时盲注的流程如下:

  • 猜查询结果长度

    • 延时模板语句(length(列)[<,>,=][长度])
  • 猜每一位字符
    • 延时模板语句(substring(列,[第几位],1)[<,>,=][字符])

带外盲注原理是什么?

带外盲注是在以上三种盲注手段都无法得到有判断价值的响应时使用的盲注手段,这是因为有的系统对处理HTTP请求和Sql查询是采用异步的方式执行的,但是通过在payload中加入带外地址的方法就可以在执行sql查询的时候将查询结果发送到指定的带外地址,常用的带外地址协议为DNS,这里可以利用burp自带的xss平台作为接收端,带外盲注的流程如下:

  • 猜查询结果长度

    • 带外模板语句(length(列)[<,>,=][长度])
  • 猜每一位字符
    • 带外模板语句(substring(列,[第几位],1)[<,>,=][字符])

如何检测Sql注入漏洞呢?

  • 提交单引号('),并观察响应
  • 提交一些sql语句,并观察响应
  • 提交一些布尔条件语句,并观察响应
  • 提交一些延时语句,并观察响应
  • 提交一些附有带外地址的语句,并观察响应

不同情况下的Sql注入

  • 存在更新值或where子句的update语句
  • 存在插入值的insert语句
  • 存在表或列名的select语句
  • 存在oder by子句的select语句

二次Sql注入是什么?

二次注入就是将注入语句利用对输入过滤不严格存储到数据库中,当系统将该条数据取出并拼接到查询语句时执行了恶意的sql操作,如更改数据库记录等

如何防止Sql注入呢?

用参数化查询(或预编译)的方式代替简单地拼接

哈喽,这里还是梨子哦,本系列是梨子从burp官方在线靶场漏洞讲解中整理出来的配套学习笔记,难免有遗漏,若有任何疑问可以添加梨子的联系方式(base64解码)QVBDRVY1KOW+ruS/oSk=,请转载蹭流量的人自觉替换联系方式再粘贴,最后再显摆一下梨子的排名,嘻嘻嘻

梨子带你刷burp练兵场(burp Academy) - 服务端篇 - Sql注入配套漏洞讲解笔记的更多相关文章

  1. 梨子带你刷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 ...

  2. 使用Eclipse自带的Axis1插件生成Web Service服务端客户端

    JDK版本:1.5.0_22 Eclipse版本:Helios Service Release 2(3.6.2) WSDL文件的创建过程见http://blog.csdn.net/a19881029/ ...

  3. 使用poco 的NetSSL_OpenSSL 搭建https 服务端,使用C++客户端,java 客户端访问,python访问(python还没找到带证书访问的代码.)

    V20161028 由于项目原因,需要用到https去做一些事情. 这儿做了一些相应的研究. 这个https 用起来也是折腾人,还是研究了一周多+之前的一些积累. 目录 1,java client 通 ...

  4. 一篇文章带你了解SQL注入

    什么是SQL注入? 原理: Web应用程序对用户输入的数据校验处理不严或者根本没有校验,致使用户可以拼接执行SQL命令 危害: 注入可能导致数据丢失泄露或数据破坏.缺乏可审计性,有时甚至能导致完全接管 ...

  5. miniui datagrid 保存到服务端,使用.NET 自带 JSON 转换时发现日期格式不兼容。

    使用 miniui datagrid 修改表格后,保存到服务端,然后使用 .NET 自带 JSON 转换,会抛出DateTime 内容“2015-12-27T11:02:28”未按 JSON 的要求以 ...

  6. PHP - 传入WebService服务端带中文字符的序列化字串不能反序列化的解决方法

    因工作需要,用了web服务,通过远程调用的方式来检索雅虎拍卖数据.前几天遇到一个问题,现在记录一下 客户端: $res = $this->client->call('Get_YahooDa ...

  7. 51ak带你看MYSQL5.7源码4:实现SQL黑名单功能

    博客迁移至: https://www.dboop.com/ 从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 申明:个人Python编程很溜,但是C++还停 ...

  8. 利用DNS实现SQL注入带外查询(OOB)

    根据用于数据检索的传输信道,SQLi可分为三个独立的类别:inference(经典SQL注入),inband(盲注.推理注入.带内注入)和out-of-band 一.什么是OOB out-of-ban ...

  9. SQL注入篇二------利用burp盲注,post注入,http头注入,利用burpsuit找注入点,宽字节注入

    1.布尔盲注burpsuit的使用 先自己构造好注入语句,利用burpsuit抓包,设置变量,查出想要的信息. 比如----查数据库名的ascii码得到数据库构造好语句 http://123.206. ...

随机推荐

  1. 【Oracle】查看表空间是否为自动扩展

    查看指定的表空间是否为自动扩展 SQL>   select file_name,autoextensible,increment_by from dba_data_files where tab ...

  2. 【Oracle】更改oracle中的用户名称

    修改oracle中的用户名,要需要修改oracle基表中的相关内容, 1.查看user#, select user#,name from user$ s where s.name='用户修改前的'; ...

  3. Jenkins 部署打包文件 并通过SSH上传到 linux服务器

    编译 发布 打包成zip文件 dotnet clean : dotnet的命令清除解决方案 dotnet build : dotnet的命令重新生成 dotnet publish .\Hy.MyDem ...

  4. Let’s Encrypt/Certbot移除/remove/revoke不需要的域名证书

    1.首先确认你的证书不再需要,如果有必要,请执行下面的命令进行备份 cp /etc/letsencrypt/ /etc/letsencrypt.backup -r 2.撤销证书然后删除证书 [root ...

  5. LVS负载均衡NAT模式原理介绍以及配置实战

    LVS基本原理 流程解释: 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP ...

  6. 支持 gRPC 长链接,深度解读 Nacos 2.0 架构设计及新模型

    支持 gRPC 长链接,深度解读 Nacos 2.0 架构设计及新模型 原创 杨翊(席翁) 阿里巴巴云原生 2020-12-28    

  7. java虚拟机——轻松搞懂jvm

    一.JVM体系结构概述 JVM位置 JVM体系结构 1.1 类加载器 ClassLoader   类加载器(ClassLoader)负责加载class文件,class文件在文件开头有特定的文件标示,并 ...

  8. Webpack4.0各个击破(5)module篇

    一. 模块化乱炖 脚本合并是基于模块化规范的,javascript模块化是一个非常混乱的话题,各种[*MD]规范乱飞还要外加一堆[*.js]的规范实现.现代化前端项目多基于框架进行开发,较为流行的框架 ...

  9. 最全面的图卷积网络GCN的理解和详细推导,都在这里了!

    目录 目录 1. 为什么会出现图卷积神经网络? 2. 图卷积网络的两种理解方式 2.1 vertex domain(spatial domain):顶点域(空间域) 2.2 spectral doma ...

  10. Java中把对象、对象bean、list集合、对象数组、Map和Set以及字符串转换成Json

    对象转换为Json 对象bean转换为Json List集合转换为Json 对象数组转换为Json Map集合转换为Json Set集合转为Json 字符串转换为Json 把Java对常用的一些数据转 ...