[SUCTF 2019]EasySQL 1
根据题目所得是个sql注入题,尝试万能密码
显示不对,说明存在输入过滤,尝试堆叠注入
1;show databases;
成功显示数据库列表,并且发现数据库ctf
查询数据表,查询出表Flag
1;use ctf;show tables;
尝试select * from Flag;发现出现错误
\
思考其sql语句为
select post输入框内容 from Flag;
*所以尝试修改输入框的内容为 ,无报错,但是也无任何回显
猜测查询是使用的sql语句是或(||)回显(如果前一个操作数为真,则不看后面的语句):
select post输入框内容 || flag from Flag;
构造payload:
*,1
获得flag
tips.
这里的原理是
sql="select post[‘query’] ||flag from Flag";
如果$post[‘query’]的数据为*,1,sql语句就变成了
select *,1||flag from Flag
就是select *,1 from Flag,这样就直接查询出了Flag表中的所有内容。
这里说一下我的理解
这里输入*,1,这里会增加一个临时列,他的列名为1,然后那一列的值都为1。
当我们只关心数据表有多少记录行而不需要知道具体的字段值时,类似“select 1 from tblName”是一个很不错的SQL语句写法,它通常用于子查询。这样可以减少系统开销,提高运行效率,因为这样子写的SQL语句,数据库引擎就不会去检索数据表里一条条具体的记录和每条记录里一个个具体的字段值并将它们放到内存里,而是根据查询到有多少行存在就输出多少个“1”,每个“1”代表有1行记录,同时选用数字1还因为它所占用的内存空间最小,当然用数字0的效果也一样。在不需要知道具体的记录值是什么的情况下这种写法无疑更加可取。
标签:SUCTF,语句,查询,EasySQL,Flag,2019,sql,post,select
From: https://www.cnblogs.com/tazmi/p/18535672