学习数据库原理查询语句后的Mysql注入思考
学习数据库原理查询语句后的Mysql注入思考
今天《数据库原理》课上学习了Mysql查询语句, 发现有几个语句是可以作为SQL注入if函数取代的参考点, 记录一下:
- 学习数据库原理查询语句后的Mysql注入思考
- 0x01 between < arg1> and < arg2>
- 0x02 < arg1> in (< arg1>[, < arg2>])
- 0x03 is Null
- 0x04 order by
- 0x05 Case < command > when < case1> then < end1> when < case2> then < end2> else < else_end> end [another_comm]
- 0x06 join < table_name> on < 条件1> [and < 条件2>...]
- 0x07 jion拓展: 左(右)外连接
- 0x08 having < arg1>
- 0x09 union intersect except
- 0xa0 exists(< select arg1...>)
- END
0x01 between < arg1> and < arg2>
这个就一普通的判断语句, 就不需要再说的了吧,
between and 的运算优先级也还是高于or的, 否则上面的语句先执行0||id
操作就直接报错了
我突然想到如果一些比较运算和函数都不能用了之后, 除了正则匹配的regexp
rlike
和 like
之外,
貌似使用between< arg1>and< arg2>语句, 使用二分法逐个比较单字符最终还原得到完整的字符串也不失为一个好方法
0x02 < arg1> in (< arg1>[, < arg2>])
需要注意的一点是in的运算优先级是要高于or的, 并且in后面加的参数必须为一个元组(可能是吧), 不能是一个单独的数据, 在=被过滤但括号不受限制的情况下可以用in代替=, 同时可以用in来筛选元组: 'xxx' in (`column_name`)
补一个知识:
其实除了直接放参数之外也可以放一个select的查询操作, 将查询结果作为筛选的标准
select
0x03 is Null
is 后面除了Null之外还能加什么我也不知道, 目前我试了字符串, 数字, 元组类型都是失败的
此外需要注意的是Null!=0
Null!=''
0x04 order by
如果空格允许被绕过的话我们还可以使用oder by来使语句出错而出现不同的结果(order by不存在的0字段)
这个可以说是sql注入的时候学的第一个知识点了(判断字段数), 不过这么久以来都没用过差点就忘了hhhh
0x05 Case < command > when < case1> then < end1> when < case2> then < end2> else < else_end> end [another_comm]
嗯,,,,其实这个方法昨天的HFCTF-2022的SQL注入题我就是这个语句注入出来的, 主要是这个语句可以不用空格也不用逗号但是可以使得语句在不同条件下得到差异化的结果, 真的香......
需要注意的是其实到end
的时候case
语句就已经结束了, 但是为什么我会在后面还加了一个可选操作命令呢, 那是因为这时候在end
后的操作就是对case
语句执行结果的操作, 什么意思可参考下面的在end
后的+1
,这个+1操作在exp和0取反操作中就是精华所在了
但是有点离谱的是不知道为什么我在后面加了limit 1
之后就都是返回第一条数据了, 比赛中也有limit 1
也还是正常的出现结果差异化了的, 原因求解, 麻了
0x06 join < table_name> on < 条件1> [and < 条件2>...]
此外如果union被ban了的话我们可以使用join联合查询的方法将我们构造的表加入到结果中
但需要注意的是如果我们的语句是在where的后面那么join就不可用了
除了使用join结合建立虚表导致输出结果数据添加之外我们还可以用join后面的on执行条件判断
可以看到直接使用join操作两个表的话输出的是两个表的笛卡尔积, 相同字段的值会被单独列出, 这时候我就有一个问题就是在我们的开发环境中如果加了limit 1
对输出结果限制为一条数据, name获取得到的结果取name的值会取table1.name还是table2.name进行检验还是会报错呢, 又或者说,,,tabel1_name这种格式?
其实我们上面的用法并不是标准的连接查询, 因为没有table1.attrm=table2.attrm的过滤条件, 但是问题不大好吧
join的形式只是联接查询的一种ANSI方法,
select < attr1>,< attr2>... from < table1> join < table2> on < table1.attrm>=< table2.attrm> [and ...]
除了jion语句外还有一个theta方法语句:
select < attr1>,< attr2>... from < table1>,< table2>... where < table1.attrm> = < table2.attrm> [and ...]
0x07 jion拓展: 左(右)外连接
左右外连接只要把上面的连接查询语句中的jion改为right(left) outer join
效果显而易见, 标准的左右外连接就是把无匹配的左(右)表中的数据添加到新表中, 另一个表中的属性用Null补全,
有一道关于使用外连接查询跳出update语句,临时表的where放置查询语句
的小题目:关于一个sql注入注入题目的思考
update `table` t left join (select \‘1\’ as user from dual where (extractvalue(1,concat(0x7e,(select user()),0x7e)))) tt on tt.user=t.username`
set username ='admin'
where id=1
0x08 having < arg1>
这个语句需要注意的是having后的条件作用时间是在已经获取了确定的数据表之后(作用时间在where语句之后),
期初我看到having这个单词第一个想到的是have, 所以就试了一下匹配字符的用法, 但是后来发现having后的参数只能为数字或布尔值, 如果为字符串的话就会报错(也不算吧就是给一个warning且无输出结果)
0x09 union intersect except
union
intersect
except
这三个操作都是用于集合运算连接查询
union
就不必介绍了,相当于两个表的并运算,intersect
则相当于交运算, expect
相当于减运算
语法 :
< table1> union < table2>
< table1> intersect [all] < table2>
< table1> except < table2>
至于两个表之间
0xa0 exists(< select arg1...>)
exists语句用于查询是否存在数据, 不可直接加数字或者字符, 括号里面必须为一个获取表查询结果的查询语句
END
今天上的数据库原理涉及到的查询操作中wo觉得可能在注入中使用到的目前就是这么几个点, 数据库原理这门课还是有点意思的哈哈哈