CTF从入门到提升(二)约束条件的安全测试报错注入

简介: 关于基于约束的SQL攻击在创建数据库的时候,一般会先定义整个表的结构,假设我要做的是登录入口,先简单地创建一个用户表。(用户表中,我这里是定义了三个字段,第一个是ID,然后第二个是用户名)表已经建完之后,看起来也没什么问题,那么如果说我开发完了之后,应该有个登录入口。

关于基于约束的SQL攻击
在创建数据库的时候,一般会先定义整个表的结构,假设我要做的是登录入口,先简单地创建一个用户表。(用户表中,我这里是定义了三个字段,第一个是ID,然后第二个是用户名)
ctf2_1

表已经建完之后,看起来也没什么问题,那么如果说我开发完了之后,应该有个登录入口。

对没有账号的人来说,需要有一个注册入口。注册的本质是一个insert的过程,就是往里插入一条数据。假如里面数据库没有数据,我就要往里加一个管理员账户。这个管理员我就会对它设置成admin,密码是12346789。

(在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时2:3分0秒)

先去创建这张数据表,看一下,然后去创建一张,对吧?只有两张表,然后我就去对uc。里面是空的,对吧?我接下来就往里插条数据insert。
ctf2_2
ctf2_3
ctf2_4

刚才我们提到了去注册的时候,它的本质其实是我们一起插入一条数据,它的长度是有限制的,它限制了30位,如果说我们插入31位会这样,它会自动的把31位就是说大于30的东西给吃掉,就是相当于抹掉了,它只会插入前30位。

那么查出去插入的时候,它肯定会先去查一下,你去操作数据在表中原来存不存在。假设我去插了一个31位的数据,它自然表中是永远不会存在的,那么它就会把这31位的数据往表里去插。
ctf2_5

比如说用户名是这个密码是大于六位,且包含大写字母小写字母和数字。这么复杂的大写字母小写字母和数字,我就随便设一个,比如说大写字母,这正常登录试试看。大写字母小写字母数字就做一个段落。密码就是一个去做一个登录,发现这个时候就成功了,所以这个就是一个基于约束攻击的简单介绍。

题目:

(在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时2:10分20秒)

基于约束的就讲这么多。接下来的话就讲一下报错注的一些问题,然后去做一个简单的分析,然后也会结合一道题目来讲解。 首先来看一个简单的一个公式,直接往上套就可以去用了,但是我觉得既然学了还是要能了解就去了解一下。
ctf2_6

报错注入
首先要去了解一下一些函数:
ctf2_7
ctf2_8

flow函数是向下取整。如果我们将rand*2之后,它的结果其实就会有0和1两个结果。

ctf2_9

这张表它其实就是默认会存在,而且这张数据表中的行数是很大的,后面我们也会去讲到这个问题。在盲注中会用到一些笛卡尔积的形式调数据表数据量的问题。这个地方其实表中的数据量是很大的,所以说这个地方就是跟数据量会有一个关系,然后也可能跟后面的也会有一定的关系,要不然也不用这个横竖了。
ctf2_10

我们再继续向下看,
ctf2_11

它这个地方就是010101001,是这样子,我第二次再执行一次。0011,这两次的执行结果是不一样的,你首先明白这个问题,然后第二另外一条语句它是加了一个0。

像这地方可以看一下,如果说0选中之后,去看这个序列,它是01101100的,即前几位,我们再去做一个01101100。所以说他的前几位序列是一致的,而且你要明白一个点,就是说刚才我们去看它产生报错的原因,是不是一条数据不报错,然后调出两条数据开始报错,三条数据也可能报错。它报出的前提条件就是前面几条数据有就可以了,但到底需要几条数据,这个地方我们要进一步去看。那么所以说他肯定和序列是有关系的,因为像这种不加零的情况下,它是随机报错,就是两条数据,三条数据随机报错,但是加0必然报错。

这个地方我们来看下演示。

(在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时2:21分26秒)
ctf2_12

如果是不加零的话,我们可以是验证一下我的说法。

(在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时2:23分40秒)
ctf2_13
ctf2_14
ctf2_15
ctf2_16
ctf2_17

group,by的话它key这一列它其实必然是唯一的,不能出现重复,那么这个时候它就不符合表的一个结构问题,它自然就会报错了。就是这样的一个逻辑,可以看一下。
ctf2_19

首先它会去建立一个虚拟表,就是我刚才演示的演示的一个表,组件就是像这个地方一样的,就像这个地方那样列明,然后这个是它数量:
ctf2_20

发现第一条结果为零,查询虚拟表0不存在,它要做一次插入。插入的时候,本质其实是第二次调用,第二次调用就会在被计算一次,那么这时候插入的其实就是一个E那么插入了一周,接下来又是个E0110和幺序列,就这个序列对吧?那么又正常一的数量上去加一就是结果就是K等于1,它的那么就是数量事儿,对吧?然后接下来又是个零011,就会重复上一次的操作,查到的是零,它又想插个1,1是存在的,所以就会报错了。

ctf2_21

去做一个插入,本质是第二次计算,第二次计算它就会超的一个实际值,然后第三次计算又是一个查询,查询之后又会做一个插入,那么如果它出现报错,其实只要是插入的值两次是一致的,它就会报错,所以说在你只有表中只有两条数据的时候,如果是随机数,那它就有可能去报错,因为你两次超过值都是一样的。产生一个序列是一个0101,假设就是个去掉,查到一个0插入个1,而且它查到又是个0,又查个1,这时候就直接报错了。但是其实它查的数据只有两行,这个就是数据量少的时候报错的原因。

我们再仔细来看一下这个语句这条数据。
ctf2_22

它报错的关键点其实是在于这个里面的这条数据,假如在于这条数据,我们可以把它复制出来看一下。

ctf2_23

不一定要用0和1来代,只是为了方便大家理解。

除了这个报错函数之外,还有很多的其他的报错函数可以再去看一下,因为格式不符自然就要报错。
ctf2_24

像这个函数可以看一下,它的报错,其实就是有局限性。
ctf2_25

(在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时2:41分27秒)

这包括函数的基本原理就是这些。接下来的话我们去看一个题目,这是来自于实验题目。

ctf2_26
ctf2_27
ctf2_28
ctf2_29
ctf2_30
ctf2_31
ctf2_32
ctf2_33
ctf2_34

相关文章
|
28天前
|
测试技术 持续交付 开发者
探索自动化测试的无限可能:从入门到精通
在软件开发领域,确保产品质量是至关重要的。自动化测试作为一种高效、可靠的测试方法,正逐渐成为行业标准。本文将带你深入了解自动化测试的世界,从基础概念到实践技巧,帮助你掌握这一强大的工具。无论你是初学者还是有经验的开发者,都能从中获得宝贵的知识和启发。
|
29天前
|
Java 测试技术 开发者
初学者入门:掌握单元测试的基础与实践
【10月更文挑战第14天】单元测试是一种软件测试方法,它验证软件中的最小可测试单元——通常是单独的函数或类——是否按预期工作。单元测试的目标是确保每个模块在其自身范围内正确无误地运行。这些测试应该独立于其他模块,并且应该能够反复执行而不受外部环境的影响。
50 2
|
3月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
10天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
46 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
4月前
|
测试技术 API 数据库
Django测试入门:打造坚实代码基础的钥匙
Django测试入门:打造坚实代码基础的钥匙
45 3
|
6天前
|
Java 测试技术 Android开发
探索自动化测试的奥秘:从入门到精通
【10月更文挑战第37天】本文将带你进入自动化测试的世界,从基础知识到实战案例,逐步揭示自动化测试的神秘面纱。我们将一起探讨如何利用代码来简化测试过程,提高效率,并确保软件质量。无论你是初学者还是有经验的开发者,这篇文章都能为你提供有价值的见解和技巧。让我们一起踏上这段探索之旅吧!
|
11天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
1月前
|
测试技术 网络安全
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
文章全面介绍了软件测试的基本概念、目的、岗位分类、与开发和调试的区别,并阐述了成为优秀测试人员应具备的素质和技能。
174 1
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
|
2月前
|
Web App开发 JavaScript Java
自动化测试的利剑:Selenium WebDriver入门与实践
【9月更文挑战第21天】在软件开发的海洋中,自动化测试犹如一艘船,帮助开发者们快速航行至质量保证的彼岸。本文将作为你的罗盘,指引你了解和掌握Selenium WebDriver这一强大的自动化测试工具。通过深入浅出的方式,我们将探索Selenium WebDriver的基本概念、安装过程以及编写简单测试脚本的方法。无论你是刚接触自动化测试的新手,还是希望提升测试技能的开发者,这篇文章都将为你提供有价值的指导。
|
2月前
|
Web App开发 Java 测试技术
自动化测试的利器:Selenium WebDriver入门与实践
【9月更文挑战第8天】在软件开发的海洋中,测试是确保我们不会溺水的那根救生索。Selenium WebDriver,作为自动化测试的明星工具,让这根救生索更加结实可靠。本文将带你快速上手Selenium WebDriver,从基础设置到实际操作,再到实战演练,让你的开发之旅更加平稳顺畅。