March 2, 2023

[SUBCTF 2019] EasySQL

方法一

进入页面,输入1发现:

image-20221002114646907

返回我们输出的1了,然后再输入0发现:

image-20221002114722010

输入1;show tables#可以发现:

image-20221002114800610

从这里得知表名为Flag,可是当我想show columns from Flag后发现,Flagfrom全部被ban了,从这里可以猜测一下查询语句大概是,select $_POST['query']||flag from Flag,这个‘||’是什么意思呢?,本地测试:

测试用的表是:

image-20221002122407631

这边先输入select 1||name from tb1;

image-20221002122435267

发现返回的全是1,这边再输入select 0||name from tb1;

image-20221002122700582

这次返回的全是0,再换过另外一个字段看看:

image-20221002122735358

我们的id字段不管输入什么都是1,其实道理很简单,id字段是int型,**||逻辑就是有非0就返回1,而id字段里面全部非0,所以运算结果自然是1,而name是字符串,字符串就相当于0**,所以当输入0时返回0,输入1时返回1

知道这一点就好办了,我们接下来payload:*,1:

image-20221002123000783

道理很简单输入*,1后相当于查询语句就是select *,1||flag from Flag;,结合上面的讲解很容易就知道结果,方便理解我在本地测试一下:

image-20221002123316191

假如想反过来写记得用反引号包裹:

image-20221002123407552

方法二

我们可以结合set指令和sql_mode变量来得到答案

set指令:就是设置一个变量的值https://blog.csdn.net/JesseYoung/article/details/40779631

sql_mode变量:https://www.cnblogs.com/clschao/articles/9962347.html

sql_mode变量里面有一个很重要的常用值sql_mode=PIPES_AS_CONCAT,意思就是 将”||”视为字符串的连接操作符而非或运算符,也就是把||当做concat函数,payloadquery=1;set sql_mode=PIPES_AS_CONCAT;select 1:

image-20221002124012053

意思也就是 select 1;set sql_mode=pipes_as_concat;select 1||flag from Flag,这里变成了三条语句,由于设置了sql_mode的值,所以最后||相当于concat,也就是concat(1,flag)

About this Post

This post is written by Boogipop, licensed under CC BY-NC 4.0.

#CTF#SQL