之前看了看
感觉和前面一题有点像
不好做
进去就这样
先判断是否存在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
不能用双引号来引用字符串,因为它被解释为识别符