MySQL学习 预处理语句prepare

一直认为预处理语句结合PHPPDO是可以用来有效防止SQL注入的,直到在writeup中看到有用预处理语句来绕过限制完成注入的,脑洞大开!


0x01 预处理语句

MySQL语法常用三个语句:

PREPARE stmt_name FROM preparable_stmt;				//预备语句
  
EXECUTE stmt_name [USING @var_name [, @var_name] ...];			//执行语句
  
{DEALLOCATE | DROP} PREPARE stmt_name;				//删除语句

学习测试一,不使用变量

mysql> prepare testpre from 'select * from studytest.test';
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> execute testpre;
+------+-------+
| id   | name  |
+------+-------+
|    1 | baynk |
|    2 | cisco |
+------+-------+
2 rows in set (0.00 sec)

mysql> drop prepare testpre;
Query OK, 0 rows affected (0.00 sec)

学习测试二,使用变量

mysql> set @a=1;
Query OK, 0 rows affected (0.00 sec)
mysql> prepare pretest2 from "select * from studytest.test where id=?";
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> execute pretest2 using @a;
+------+-------+
| id   | name  |
+------+-------+
|    1 | baynk |
+------+-------+
1 row in set (0.00 sec)

mysql> drop prepare pretest2;
Query OK, 0 rows affected (0.00 sec)

0x02 CTF测试复现

在这里插入图片描述
由于在当时的ctf环境中,将select过滤了,所以都是使用预处理语句来拼接select,有用concat(),有用char(),估计hex()也可以绕过。

但是!本地复现却不成功。

mysql> PREPARE hacker from concat(char(115,101,108,101,99,116), ' version()');EXECUTE hacker;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'concat(char(115,101,108,101,99,116), ' version()')' at line 1
ERROR 1243 (HY000): Unknown prepared statement handler (hacker) given to EXECUTE

同样的语句,无法执行。另外还测试过了把表名让?进行占位,也是失败的,猜测应该是版本的问题

查了下资料,不一定正确。

  • Mariadb 5.5 对应 mysql 5.5

  • 5.5以下的版本都是上述对应关系

  • Mariadb 10.0 对应 mysql 5.6

  • Mariadb 10.1 对应 mysql 5.7

CTF的玩意是10.3Mariadb,大概是相当于MySQL8版本了吧,我的MySQL只有5.5,估计是版本差距过大的原因。

不过本地虽然复现失败,但是还是学到了不少知识,这波强行不亏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值