题目
点进页面,页面显示为
没有其他的提示信息,查看源代码看看是否有提示
什么都没有,由题目名为easysql,能想到这道题与sql注入有关
先输入1查看回显
再输入其他数字或字母看看回显
都是无显示
先验证是否存在sql注入
构造payload
1' or 1=1 #
显示为nonono,可能是对部分关键字设置了过滤
使用堆叠注入查看信息
先查看数据库
构造payload
1;show databases;
再查看一下表
构造payload
1;show tables;
查到了flag
查看flag文件
构造payload
1;show columns from Flag;
被过滤掉了
这里参考了别的大佬wp,发现是这里后端语句,因为只有当我们输入非零数字时才会会显出1,而0和其他全都无回显
即输入数字有回显而字符没有回显,说明了语句中存在||结构
在mssql中,||表示连接操作符,不表示或的逻辑
方法一:
需要把payload中的||或逻辑改成连接符的作用
这里需要用到
设置 sql_mode=PIPES_AS_CONCAT来转换操作符的作用。(sql_mode设置)
利用PIPES_AS_CONCAT令||起到连接符的作用。
构造payload
1;set sql_mode=PIPES_AS_CONCAT;select 1
注:这里的逻辑是先把||转换为连接操作符,注意分号隔断了前面的命令,所以要再次添加select来进行查询,这里把1换成其他非零数字也一样会回显flag
得到flag
方法二:
构造payload
*,1
直接得到flag
已知后端语句是select 输入内容 || flag from Flag,输入*,1就相当于构造了select *,1 || flag from Flag,这条语句执行起来相当于select *, 1 from Flag
1||flag是个短路算法,直接输出1了
select *和select 所有列的意义相同,那么我们构造的select *,1 || flag from Flag ==select *,1 from Flag
总结
PIPES_AS_CONCAT:将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似.
SELECT * 和 SELECT 所有列,两者差别几乎可忽略。所以查询所有字段(或者大多数字段)的时候,可以用select *来操作。
短路算法:
|| 逻辑或的短路:a||b
计算机发现a是真,那么输出a;如果a是假,那么输出b
select 1 from :建立一个临时列,这个列的所有初始值都被设为1。
Mysql中的||
||运算符相当于or,即 :
- 0 || 1 = 1
- 3 || 4 = 1
- 0 || 0 = 0
我们可以修改sql_mode的值,将||视为字符串的连接操作符而非或运算符,即set sql_mode=PIPES_AS_CONCAT;
参考学习文章链接:
BUUCTF [SUCTF 2019]EasySQL1 writeup(详细版)_buuctf easysql_今天不用学物理吧的博客-CSDN博客
[SUCTF 2019]EasySQL 1-【SQL注入】 - 知乎