MySQL_强网杯_supersqli

考点

  • mysql中的show,alert,rename操作
  • 万能密码
  • 堆叠注入

正文

一进入页面就是简单直接,尝试输入1',发现报错如下:error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1,我们可以判断在后台的语句便是where xxxxx = 'xx'

然后利用order by来判断发现只有2列

接下来尝试联合注入:1' union select 1,2# ,但是发现它返回给我们一句话

image-20201225135249444

发现例如select / where 都被过滤了,所以我们得放弃这个方法。

分析现在的情况

  • 可回显:所以我们放弃时间注入或者是逻辑注入
  • 过滤了where / select:所以我们不得不放弃联合注入
  • 利用UA注入等简直离谱

我们可以发现我们得想一个办法,又不能使用slect等语句,又必须能狗查看数据库中得相关信息。所以这个时候我们只剩下了show,但是我们又不可能出现类似:where xxx = '1 show '的语句,因此可以总结出, 必须得要重新写一句话,利用show来爆破数据库。

这个时候就轮到了堆叠注入,拨云见日。

注入的本质其实都是大同小异,只不过方法的区别,我们和联合注入那样,先爆破数据库的名字
payload如下:0';show databases;#

image-20201225140805720

发现没有什么特别的,于是我们爆破表,payload如下:0';show tables;#

image-20201225140938846

这下就有点猫腻了,我们分别查询两个表:0';show columns from `1919810931114514`;# 以及0';show columns from words#

image-20201225141313472

我们查出来的数据就是表中所有字段的属性:words表中有两个字段分别是id和data,在1919810931114514表中只有flag一个字段,我们的目标已经很明确了,就是得查到这个flag

回想一下刚开始的时候我们输入1,得出来的结果是这样的

array(2) {
  [0]=>
  string(1) "1"
  [1]=>
  string(7) "hahahah"
}

所以不难看出,这是自动查询了words表格。接下来就是要想办法让后台能够查询1919810931114514这个表。

这个时候应该将表的名字改变【因为没有过滤rename】,把words表格改成words1,把1919810931114514改成words这样子就可以查询了,构造payload如下:1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`;

但是等一下!我们还有个问题没有解决,就是我们可以通过表的结构推出,注入的语句是传给id的,而我们原来数字表中却没有id这个字段,所以如果直接改了之后,我们还是照样查不出数据。因此我们还需要对原来的数字表进行一些操作。

我们有两个办法:一个是修改flag的字段名,将它变成id;还有一种方法就是添加id这个字段。两个方法自己选择【因为没有过滤alert】

我们选择改名字,构造payload如下:alter table `words` change `flag` `id` varchar(100);#

我们将这两部payload结合在一起:1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#,进行注入。

最后我们利用万能密码就可以完美的爆破出flag

image-20201225143914017

binggo!