[强网杯]easy_sql

提交1和2会回显一个数组:

相当于1对应的值为“hahahah”

是key-value形式的输出。
在这里插入图片描述
尝试输入1’.返回报错,有注入漏洞

尝试1’or 1=1#,并用#截断,输出了三个数组:
在这里插入图片描述
尝试堆叠注入,即注入多组sql语句,其中有;隔开,
在这里插入图片描述
输入show databases返回了所有的数据表,

尝试查询表名:show tables;
在这里插入图片描述
显示了表的名字,在使用sql语句,show columns from xx,来查询其中列的名称:
在这里插入图片描述
上图是word的列名,

下图,再查出1919…中的列名:
在这里插入图片描述
用sql语句注入的方式查询到了两个表’1919810931114514’和’words’,之后又查出表words有id和data两个属性,而1919…中只有’flag’一个属性,暗示flag在表’1919…'中的属性之下。

尝试利用select * from ‘1919819931114514’,直接搜索出flag,但明显被后端的preg_match过滤掉了:(如下图)
在这里插入图片描述
其表中的存储结构类似于:
在这里插入图片描述
刚开始输入’1’,'2’时的查询,是从该两个数据表中的一个进行的查询,
在这里插入图片描述
实际上,在’show tables‘那个环节中已经看出整个数据库只有两个数据表,因此结构如下:
在这里插入图片描述
查询输入的1和2还有114514明显是整型,因此只能在id里,因为id的类型为int,可以猜出hahah和miaomiaomiao,ys等是存储在data中,因为data的类型是char.

推测存储在flag中的varchar(100)类型十分像flag.

但是其对select,drop,insert,where等函数进行了正则过滤,限制了对数据库的增删改,只能通过id,即输入数字进行对表word的查询来得到数据。

那么,就有一个问题,其没有对rename以及alter等函数进行过滤,

就有如下方案:

(1)将表words的名称改为其他的,

(2)将1919810931114514改为words.

(3)将flag改为id,

(4)在输入栏中输入1’ or 1=1,将其中的数据全部输出,即为flag.

总结:

本来其查询方法是通过输入的值,在表words查找符合条件的id,输出其id-value,将’1919…'改名为words,flag改为id,则可合法输出flag.

构造sql语句:

1' ; rename tables `words` to `word1` ;
 rename tables `1919810931114514` to `words` ; 
 alter table `words` change `flag` `id` varchar(100);# 

输入上述语句后,数据库的表被改变,

((alter table 表名)意为对该表进行改变)

在输入万能密码:1’or 1 = 1#

在这里插入图片描述
则输出flag

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F1gh4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值