qwb随便注
本文最后更新于:2024年12月14日 下午
这个是非常经典的一个题目了,由于之前一直有点害怕这种高阶的题,就一直没有整理
这题的过滤很严格,常规注入和报错注入都行不通,主要是过滤了select等
这里给出了详细的过滤内容,一些常用的姿势都被过滤了
然后这里其实就是存在一个堆叠注入
1 |
|
1 |
|
1 |
|
关于这个反引号我一开始还是有点疑惑的,然后话不多说打开mysql实践了一下。
先说一下反引号吧
MySql 中用一对反引号来标注 SQL 语句中的标识,如数据库名、表名、字段名等
引号则用来标注语句中所引用的字符型常量或日期/时间型常量,即字段值
但是为什么正常情况下可以不加但是这里却要加呢,原因应该主要是这个表名全是数字,话不多说,看图
情况大概就是这样了。
这个姿势还是有必要记一下的
发现flag在114514表里
当然这里也能用
desc
来查看表的详细结构,效果是一样的
剩下的就是查数据了,但是这里过滤了select
,事情非常不好办。
去研究了一波大佬的wp才弄清楚具体的一些姿势
这里有两种方式
预编译
这里参考一下https://www.cnblogs.com/micrari/p/7112781.html 的一些解释
实践一下
那么现在来这题应用一下吧
这里其实刚开是我还是有点蒙比,一直想着先prepare,完事再set
其实可以直接先用set来构造一个拼接的sql语句
然后利用prepare预编译
最后用execute执行
1 |
|
去试了一下
被检测到了
但是他这里用的是strstr
函数,存在大小写绕过
虽然知道咋绕过了,但是本着深入研究的精神,咱还是去官方文档了解一下这个函数的细节
这里他给出了一个用例,且说明了此函数区分大小写(绕过之说就在这)
同时也给了一个姊妹函数
文档也给出了一个例子
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 |
|
把set和prepare大小写了得到最终payload
flag到手
修改表名
这个方法就比较朴素了
他这个查询的表应该是words
也就是说能用1'or 1=1#
的方法查出words表的所有数据
那么这里就有新的奇技淫巧了
他这个sql语句应该是
1 |
|
然后我们想查询114514表里的所有数据的话,把114514变成words不就好了吗
也就是
1 |
|
到这里还没有结束
因为上面的索引用的是id
这是words的结构
而这是114514的结构
也就是说我们得把id改为flag
但是我们没法改他的sql语句啊
我们就改一下列名
由于前面我们已经把114514改名为words了
所以这里的表名应该是words
1 |
|
也就是说最终payload为
1 |
|
成功
(我想到一个骚操作不知道可行不,有空再写)