目录
白天写题目,晚上留四个小时实践,(名次不重要,过程才重要)网上说的,觉得挺对的
开局一张,填空题
首先分析一下,这个是什么提交的,拿出我的burp
ok,是post,提交数据应该都是post,那又有什么关系呢,都说了是sql注入,为什么我找不到他的闭合符号,
'--+闭合不了,闭合了一个就是正常显示了,666,看答案有过滤
看到后端源代码了,源代码这样,很好奇是怎么猜出来的
select $_GET['query'] || flag from flag
直接就越级挑战了,之前的sql注入都不适合了
先把答案写下来、这里有sql注入关键字字典
SQL注入过滤关键字的Fuzz字典_sql注入过滤关键字字典-CSDN博客
set sql_mode的用法(||的用法为逻辑或)
1;set sql_mode=PIPES_AS_CONCAT;select 1
1;show databases;
先爆破一下过滤哪些关键字,按照下面的博客写的
然后有这么多被过滤了,就算不过滤我也不一定会写,具体在下面的博客
有;没有被过滤,那就是可以进行堆叠注入
PIPES_AS_CONCAT:将 || 或运算符 转换为 连接字符,即将||前后拼接到一起。
那么如果他是或运算符,那结果就是不会返回flag值吗,
输入1返回这个
也就是||本来的作用是逻辑或的意思,也就是两边有一个条件为真,则结果为真
但是查询的结果又是那个条件呢,那这个的结果应该是查询1在flag的值吧,因为没有出现flag信息
select 1||flag from Flag
那想执行后面的语句的话就需要使用,PIPES_AS_CONCAT
最后使用select 1拼接后面的语句,最后就将1的值和flag的值全都显示出来
1;set sql_mode=PIPES_AS_CONCAT;select 1
但是怎么做这个题目就非常奇怪,怎么猜出来他后面的语句就很牛逼。就不纠结是怎么猜出来了
插入之后的语句应该是这样的,先查询1的值,再将||符号设置为连接符,也就是查询1和flag的值
select 1;sql_mode=PIPES_AS_CONCAT;select 1||flag from flag;
简化的查询结果是这样
*,1的用法(||的用法为逻辑或)
考点是sql_mode参数,还有个堆叠注入,至于*,1的那种解法,很麻烦,还是写一下把
这种方法是不更改||逻辑或的用法
判断一下为什么会,我的理解是||符号是逻辑或的意思,也就是1||flag,判断1为真,flag为假
我感觉Flag表中是含有flag的列的,flag中也是会有内容的
所以
select *,1||flag from Flag
所以就查找所有的值,并且创建名字为1的列,内容也为1,这个列是临时的,并不会创建到表中
这个目的就是为什么查找Flag表中的所有的值
select *,1 from Flag
随机找了个表测试了一下
列是临时的
我尝试查找||的用法,询问ai,有发现mysql中0值为假,非0值为真,c语言中也是一样的
所以就是1,2,3这些数字是为真的,0是为假的,那flag是为真还是假
在MySQL中,1||flag表达式中,只要flag不是0或者NULL,整个表达式的结果都为真。
逻辑运算符||是逻辑或(OR)操作符,用于连接两个条件。当两边的任意一个条件为真时,整个表达式就为真。在MySQL中,非零值被视为真,而零和NULL被视为假。因此,在这个表达式中,如果flag的值不是0且不是NULL,那么整个表达式的结果就为真。
例如:
如果flag的值为1,那么1||1显然为真。
如果flag的值为非零的其他数值,如5,那么1||5也为真。
如果flag的值为0,那么1||0为假,因为此时两个操作数中有一个为假。
如果flag的值为NULL,那么1||NULL也为假,因为在MySQL中,NULL与任何值进行逻辑运算的结果都是NULL,而NULL在布尔上下文中被视为假。
需要注意的是,虽然||可以用作逻辑运算符,但在MySQL中,它更常用作字符串连接操作符。为了避免混淆,建议在涉及逻辑运算时使用OR关键字而不是||。
经过我的测试,select *,1||value from sys_config,并不会增加1的列,反而增加了逗号后面的内容,也就是||在mysql中不起作用,已经起作用了,就是查找1的值,只是将1||value,其实查找的1的值,
[SUCTF 2019]EasySQL | CTF Writeup (gitbook.io)
反而是使用一个|这种可以查到值
两个||只能查到1的值
这篇挺详细的