[SUCTF 2019]EasySQL

[SUCTF 2019]EasySQL_____ wp from Kuller_Yan

原理:堆叠注入原理

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句
后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。
而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?
区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,
而堆叠注入可以执行的是任意的语句。例如以下这个例子。
用户输入:1; DELETE FROM products服务器端生成的sql语句为:
(因未对输入的参数进行过滤)Select * from products where productid=1;
DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

这一题其实我在尝试出堆叠注入之后就下不了手了,就只能弄个表名,弄个列名,

由官方wp的解释来看,这道题目需要我们去对后端语句进行猜测,有点矛盾的地方在于其描述的功能和实际的功能似乎并不相符,通过输入非零数字得到的回显1和输入其余字符得不到回显来判断出内部的查询语句可能存在有||,也就是select 输入的数据||内置的一个列名 from 表名,进一步进行猜测即为select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用。
解法1
输入的内容为*,1
内置的sql语句为sql=“select”.
sql=“select”.post[‘query’]."||flag from Flag";
如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容
解法2
输入的内容为1;set sql_mode=pipes_as_concat;select 1
其中set sql_mode=pipes_as_concat;的作用为将||的作用由or变为拼接字符串,这是我在本地做的测试,我们执行的语句分别为select 1和set sql_mode=pipes_as_concat和select 1||flag from Flag,读出flag

posted @ 2020-05-18 02:37  Kuller_Yan  阅读(37)  评论(0编辑  收藏  举报