Access注入

 

一、注入漏洞形成原理

网站分类

  • 静态网站

html或htm,是一种静态的页面格式,不需要服务器解析其中的脚本,由浏览器解析。特点:

  1. 不依赖数据库
  2. 灵活性差,制作、更新、维护麻烦
  3. 交互性较差,在功能方面有较大的限制
  4. 安全,不存在sql注入漏洞
  • 动态网站

asp、aspx、php、jsp等,由相应的脚本引擎来解释执行,根据指令生成静态网页.

特点:

1.依赖数据库

2.灵活性好,维护简便

3.交互性好,功能强大

4.存在安全风险,可能存在SQL注入漏洞

常见脚本对应的数据库

Asp/aspx + access占多

Asp +sqlsever (一般是学校的网站)

Aspx +sqlsever占多(中小型企业站点居多) +access少见

Jsp +mysql多/sqlserver/oracle少 (一般是一些大型网站搭载jsp)

Php +mysql

利用针对数据库,漏洞产生于数据交互,注入漏洞产生于脚本

伪静态:

Index.jsp改成index.html

怎么辨别是否是伪静态:

1.www.xxx.com/index.html通过访问固定的首页文件如index.asp看是否返回正常,如果返回正常说明有这个文件,支持这个脚本,可能源码就是asp脚本,但显示出来的是index.html,改变了后缀,而实际上是asp脚本。

2.index.html?Id=xx,这种带参数的也是

注意:如果无论访问asp jsp php 都返回正常且显示index.html 这种是网站的容错处理,要通过容器来看。

比如sever:nginx——php;iis——asp/aspx

Linux一般是php/jsp

静态是长期不更新的网站,现在的网站一般都是动态。

二、Access手工注入

Access数据库

封装了多个表,每个表里有列,或者称为字段,每个列下放数据mdb后缀,可以由这俩打开

  1. 网站上一般数据库在目录data/data.mdb,或许后缀名会被更改,下载下来自行改成.mdb就可以打开了。
  2. 后缀.asp的可以在前台(如留言板、注册)上传文件直接菜刀getshell。
  3. 数据库被下载下来需要密码:
    1. 找源码
    2. 用工具

    字符型注入

    1. 用户输入的内容被当做字符来处理,而字符需要用引号引起来,如果是双引号,会把引号都当作字符,不会被干扰闭合;所以如果是单引号引起来就可能产生字符型注入,输入单引号会干扰闭合,然后加入查询语句,最后用#进行闭合。
    2. 一般出现于搜索框,用户注册、登录。
    3. 修复方法可以用双引号,因为双引号的容错较高。或者将字符型强制转换成数字类型。
    4. +代表空格,-正常执行

        二阶注入:

    对于用户提交参数在后面添加语句后代入数据库执行,通过判断页面回显正常与否来辨别是否有注入

    但是查询没有输出也不是代表一定没有注入,有可能带入到其他页面进行输出,称为二阶注入

     

    常见的判断注入语句

    1. and 1=1,and 1=2
    2. /,-0

    常见的挖掘位置:

    1. get提交,即url参数中
    2. post提交,搜索框,留言板

    Access常见的注入类型

    1. bool盲注

    特点:通过语句(如:and 1=1,and 1=2)看显示页面是否正常来判断

    1. union联合查询

    特点:可以执行order by的

    以下是一些高阶的数据库才有的注入类型 如sqlsever、oracle、mysql

    1. 时间盲注
    2. 显错注入
    3. 多语句查询
    4. 内联注入

     

     

     

     

     

     

    E.g union联合查询

    这里id=19是数字型注入,图中显示的3,5,9是查询的表中与数字型不匹配的字符型的列,所以可以在字符列查询列名。

    联合查询时不知道表名可以通过bp抓包,在from后加个变量用字典来跑表名

    常见的管理员表名:admin,manager,admin_name,admin_user,admin_users

    注意:

    1. 要是这个网站为xxx.baidu.com,它的管理员表名可能是admin_xxx 利用拼接猜表名
    2. 后台目录也可能是表名

    猜对列名就会在页面上显示

    可能遇到的问题

    得到数据登录不进后台

    1. 查询的表名不对,可能还有其他的管理员表
    2. 后台地址不对,存在多个后台
    3. 用户名密码错位,管理园员表下不止一个用户,有多个管理员,得到的admin对应的密码其实是其他账号的。

    这种问题常在同时爆账号密码时出现

    解决:

    1. 在字符列用count(admin) 统计有多少个admin 如果只有1个,用户名和密码错位就不会产生了

    1. 爆密码时添加一个条件where admin ='admin ',也不会错位

    另:如果爆出来还是登录不了,那就用爆出来md5反过来爆用户名

  4. Access注入工具

    穿山甲Pangolin

     

    Sqlmap

    Access 只需跑--tables

    Sqlmap -u ····· -T 表名 --columns

    Sqlmap -u ····· -T 表名 -C 字段名1,字段名2··· --dump

  5. Access偏移注入

    适用环境:知道表名而不知道列名

    注入流程:

    1. 用 * 代替列数:union select 1,2,3,4,5,6,7,8,* from admin,报错就减去一个数,即union select 1,2,3,4,5,6,7,* from admin,到一定程度会随机爆出来某个表里的一个内容
    2. 如果列数比较多,那么减去的数字数量遵循等差数列,如减去10个数字爆出数据,那么下一个爆出的数据就在当前位置再减十个数字
    3. 如果查第二次没有查出来,那么带入内联查询(但非注入类型的内联): union select 1,2,3,4,5,6,7,8,9,10,11,12,* from (admin as a inner join admin as b on a.id=b.id)
    4. 查第三次:union select 1,2,* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on b.id=c.id)
    5. 以此类推,如果加了还没有查出来就在数字后面星号前面加a.id,b.id,第几次就对应几个

     

    跨库查询

    1. 应用环境:当目标有注入但是查询不出来表名列名,同时得到了数据库的绝对路径,知道数据库的表名和列名
    2. union select 1,2,3,4,5,6,7 from [c:\inetpub\wwwroot\8004\xydata\xycms.mdb].admin_user,接下来猜表名的列
    3. 和正常注入相同,但查的是另一个网站数据库上的表名列名,用的是本网站的权限查询另一个网站的数据库,需要有权限读取

    Exp构造

    cms通用漏洞原因:同一个cms具有同一个页面,而页面所对应的表名和列名都一

    样,所以exp可以直接利用,但如果管理员做了手动修改可能就不能利用

     

    绕过防护

    通用型防注入代码绕过

    1. 通用弹框拦截:可以改变提交方式,即get、post、cookie不同方式切换,get\post在hackerbar里面更改,cookie用bp抓包后更改再发送。
    2. 代码防御:用+代替空格,或用%0a,%a0代替空格,大小写,url编码(但次数多了服务器会不识别)

    Waf绕过

    1. 360绕过:

    将注入语句中的空格替换为%0a

    1. WTS拦截(西部数码):

    加%%%%%0a,多个%再加0a

    1. 安全狗:

    增加其他参数,用注释符把原本参数包围起来如 ?id=9 and 1=1

    变成 ?fuid=123/*&id=9 and 1=1&bid=123*/

    安全狗认为后面的参数被注释了,注释的东西不拦截,而服务器只接收中间部

    变换提交方式

    1. 宝塔:
    2. %%%%%0a
    3. 多个%%%截断关键字,如 a%%%%%%nd 1%%%%=1
    4. 大小写
    5. 对符号进行url编码,如 and 1%3d1

     

     

     

     

posted @ 2023-12-12 21:21  4A16  阅读(51)  评论(0编辑  收藏  举报