SQL学习之SQL注入学习总结

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

测试数据库

我们本文就以如下数据库作为测试数据库,完成我们的注入分析。

相关函数

在学习盲注之前,首先要了解一下在sql盲注中所涉及到的函数以及使用方法。

mid()---从文本字段中提取字符

SELECT MID(column_name,start[,length]) FROM table_name;  

column_name 必需。要提取字符的字段。

start 必需。规定开始位置(起始值是 1)。

length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。

limit()---返回前几条或者中间某几行数据

select * from table limit m,n;    

其中,记录从index 0开始,m表示第m条记录 ,n指第m+1条开始取n条

concat、concat_ws、group_concat

 MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL

和concat不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL

group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

Count()---聚集函数,统计元祖的个数

rand()---用于产生一个0~1的随机数

floor()---向下取整

group by---依据我们想要的规则对结果进行分组

length()---返回字符串的长度

Substr()---截取字符串 三个参数 (所要截取字符串,截取的位置,截取的长度)

Ascii()---返回字符串的ascii码

报错注入

 基于floor,UpdateXml(有长度限制,最长32位),ExtractValue(有长度限制,最长32位)进行报错注入。

floor报错

  • 获取数据库
  • 获取表名
  • 获取字段名
  • 获取内容

UpdateXml报错注入

  • 获取表名
  • 获取字段
  • 获取内容

 extractvalue报错

  • 获取表名
  • 获取字段

extractvalue报错注入

  • 获取字段

基于布尔盲注

通过构造sql语句,通过判断语句是否执行成功来对数据进行猜解。

  • 查看表名
  • 获取表名第一个字符
  • 获取表名第一个字符的ASCII

获取字段名与字段内容原理一样。

以Sqli-labs Less8为例,无论输入什么就只有正确和错误,于是可以判断基于布尔的盲注。

  • 先判断当前数据库的长度

发现当值为8的时候,页面就没有显示。那么说明database()的长度是8

  • 获取数据库名

可以使用如下脚本猜解数据库名字:

  • 获取表长度

发现当值为6的时候,页面就没有显示。那么说明表的长度是6

  • 获取表名

和上面类似,只需要把payload修改为下面即可:

  • 获取列名
  • 获取内容

基于时间盲注

基于的原理是,当对数据库进行查询操作,如果查询的条件不存在,语句执行的时间便是0.但往往语句执行的速度非常快,线程信息一闪而过,得到的执行时间基本为0。但是如果查询语句的条件不存在,执行的时间便是0,利用该函数这样一个特殊的性质,可以利用时间延迟来判断我们查询的是否存在。这便是SQL基于时间延迟的盲注的工作原理

首先理解一下下面的语句:

判断数据库名是否为security,正确返回1,错误返回2。基于时间的注入和基于布尔差不多,引入了if语句进行判断。

以Sqli-labs Less8为例,无论我们怎么输入,输出结果都是You are in ,所以判断为基于时间的盲注。

  • 数据库长度判断
  • 使用二分法获得数据库名

剩余步骤和基于布尔的差不多,只是加了一个if判断语句进行判断

  • 获取表名:
  • 获取列名:
  • 获取内容:

总结

 本文总结了关于sql注入中的报错注入和盲注的一些原理以及测试方法。感谢Hello_C的总结分享。

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

1 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

使用Scala的强大api快速加工数据

3294
来自专栏架构师之路

1分钟懂awk-技不在深,够用就行

1分钟懂awk-技不在深,够用就行 1.AWK (1)Aho、Weinberger、Kernighan三位发明者名字首字母; (2)一个行文本处理工具; 2.基...

3724
来自专栏DOTNET

【翻译】MongoDB指南/CRUD操作(一)

【原文地址】https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档...

2859
来自专栏Golang语言社区

go语言的sql包原理与用法分析

本文实例讲述了go语言的sql包原理与用法。分享给大家供大家参考,具体如下: go的sql包是在pkg/database中,里面的两个包sql和sql/driv...

4216
来自专栏技术博客

Entity Framework DataAnnotations

DataAnnotation 特性由.NET 3.5中引进,给.NET中的类提供了一种添加验证的方式。但是在EF中它又可以对映射关系进行控制,相比较Fluent...

673
来自专栏大数据和云计算技术

MongoDB系列6:MongoDB索引的介绍

1、前言 和关系型数据库一样,MongoDB的索引可以提高查询执行效率。索引就好比书中的目录,可以快速定位书中某一页。适当的索引查询,优化器可以快速地返回结果集...

38410
来自专栏Danny的专栏

未经处理的异常在 System.Data.dll 中发生。其他信息:在应使用条件的上下文(在 '***' 附近)中指定了非布尔类型的表达式。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

752
来自专栏Golang语言社区

go语言的sql包原理与用法分析

go的sql包是在pkg/database中,里面的两个包sql和sql/driver可以一起看。建议看这个两个包之前可以先看看sql文件夹下的doc.txt。...

2844
来自专栏Hongten

python开发_pickle

pickle模块使用的数据格式是python专用的,并且不同版本不向后兼容,同时也不能被其他语言说识别。要和其他语言交互,可以使用内置的json包使用pickl...

592
来自专栏bdcn

Flask学习笔记-在Bootstrap框架下Web表单WTF的使用 顶

表单的处理一般都比较繁琐和枯燥,如果想简单的使用表单就可以使用Flask-WTF插件,同时我们把WTF融合到Bootstrap中这样样式的问题都自动解决了,本篇...

1074

扫码关注云+社区