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. Loadrunner参数化数据配置与更新方式

    之前遇到过一种情况,对脚本进行并发测试时,脚本没有报错,但是有丢失的事物,与开发配合检查确定不是代码的问题,然后检查脚本,更换参数化数据配置与更新方式,问题解决.现在对参数化数据配置和更新方式进行总结 ...

  2. DOI技术扫盲一

    DOI:  desktop office intergration   桌面办公软件集成简单的将,就是我们在Windows桌面中打开的办公软件(如:word,excel,pdf等等)可以在SAP系统进 ...

  3. C++11中string与数值类型的转换

    C++中string与数值类型的相互转换记录 string转int.double.long string s = "123.456"; // string -> int co ...

  4. 浅析鸿蒙中的 Gn 与 Ninja(一)

    目录: Ninja简介 make 的 3 个特性 举例说明Ninja 的用法 如何向构建工具 Ninja 描述构建图 后记 鸿蒙系统的编译构建是基于 Gn 和 Ninja 完成的,那么 Gn 和 Ni ...

  5. PE节表

  6. Ubuntu16 安装 OpenSSH-Server

    Ubuntu16.04 桌面版默认是没有安装 SSH 服务的,需要手动安装服务: 更新源:sudo apt-get update 安装服务:sudo apt-get install -y openss ...

  7. 内存模型 Memory model 内存分布及程序运行中(BSS段、数据段、代码段、堆栈

    C语言中内存分布及程序运行中(BSS段.数据段.代码段.堆栈) - 秦宝艳的个人页面 - 开源中国 https://my.oschina.net/pollybl1255/blog/140323 Mem ...

  8. Canvas实现弧线时钟

    最近试着用canvas元素的2d绘图函数做了一个弧线形的时钟. 我也没啥好说的,直接上代码: <div id="myclock"></div> <sc ...

  9. LOJ10202樱花——数论

    题目描述 原题来自:HackerRank Equations 求不定方程: 1/x+1/y=1/n! 的正整数解 (x,y) 的数目. 输入格式 一个整数 n . 输出格式 一个整数,表示有多少对 ( ...

  10. ModelArts 与HiLens Kit联合开发丨行人社交距离风险提示Demo

    摘要:本Demo使用YOLOv3_Resnet18模型来检测的视频流中的行人,获取行人坐标(即图中蓝色方框),然后计算所有检测到的人之间的相互"距离". 前情提要 听到行人社交距离 ...