方法一
进入页面,输入1发现:
返回我们输出的1了,然后再输入0发现:
输入1;show tables#可以发现:
从这里得知表名为Flag
,可是当我想show columns from Flag
后发现,Flag
与from
全部被ban了,从这里可以猜测一下查询语句大概是,select $_POST['query']||flag from Flag
,这个‘||’是什么意思呢?,本地测试:
测试用的表是:
这边先输入select 1||name from tb1;
:
发现返回的全是1,这边再输入select 0||name from tb1;
:
这次返回的全是0,再换过另外一个字段看看:
我们的id字段不管输入什么都是1,其实道理很简单,id字段是int型,**||逻辑就是有非0就返回1,而id字段里面全部非0,所以运算结果自然是1,而name是字符串,字符串就相当于0**,所以当输入0时返回0,输入1时返回1
知道这一点就好办了,我们接下来payload:*,1
:
道理很简单输入*,1后相当于查询语句就是select *,1||flag from Flag;
,结合上面的讲解很容易就知道结果,方便理解我在本地测试一下:
假如想反过来写记得用反引号包裹:
方法二
我们可以结合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
:
意思也就是 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.