Access注入
一、注入漏洞形成原理
网站分类
- 静态网站:
html或htm,是一种静态的页面格式,不需要服务器解析其中的脚本,由浏览器解析。特点:
- 不依赖数据库
- 灵活性差,制作、更新、维护麻烦
- 交互性较差,在功能方面有较大的限制
- 安全,不存在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后缀,可以由这俩打开
- 网站上一般数据库在目录data/data.mdb,或许后缀名会被更改,下载下来自行改成.mdb就可以打开了。
- 后缀.asp的可以在前台(如留言板、注册)上传文件直接菜刀getshell。
-
数据库被下载下来需要密码:
- 找源码
- 用工具
字符型注入
- 用户输入的内容被当做字符来处理,而字符需要用引号引起来,如果是双引号,会把引号都当作字符,不会被干扰闭合;所以如果是单引号引起来就可能产生字符型注入,输入单引号会干扰闭合,然后加入查询语句,最后用#进行闭合。
- 一般出现于搜索框,用户注册、登录。
- 修复方法可以用双引号,因为双引号的容错较高。或者将字符型强制转换成数字类型。
- +代表空格,-正常执行
二阶注入:
对于用户提交参数在后面添加语句后代入数据库执行,通过判断页面回显正常与否来辨别是否有注入
但是查询没有输出也不是代表一定没有注入,有可能带入到其他页面进行输出,称为二阶注入
常见的判断注入语句
- and 1=1,and 1=2
- /,-0
常见的挖掘位置:
- get提交,即url参数中
- post提交,搜索框,留言板
Access常见的注入类型
- bool盲注
特点:通过语句(如:and 1=1,and 1=2)看显示页面是否正常来判断
- union联合查询
特点:可以执行order by的
以下是一些高阶的数据库才有的注入类型 如sqlsever、oracle、mysql
- 时间盲注
- 显错注入
- 多语句查询
- 内联注入
E.g union联合查询
这里id=19是数字型注入,图中显示的3,5,9是查询的表中与数字型不匹配的字符型的列,所以可以在字符列查询列名。
联合查询时不知道表名可以通过bp抓包,在from后加个变量用字典来跑表名
常见的管理员表名:admin,manager,admin_name,admin_user,admin_users
注意:
- 要是这个网站为xxx.baidu.com,它的管理员表名可能是admin_xxx 利用拼接猜表名
- 后台目录也可能是表名
猜对列名就会在页面上显示
可能遇到的问题:
得到数据登录不进后台
- 查询的表名不对,可能还有其他的管理员表
- 后台地址不对,存在多个后台
- 用户名密码错位,管理园员表下不止一个用户,有多个管理员,得到的admin对应的密码其实是其他账号的。
这种问题常在同时爆账号密码时出现
解决:
- 在字符列用count(admin) 统计有多少个admin 如果只有1个,用户名和密码错位就不会产生了
- 爆密码时添加一个条件where admin ='admin ',也不会错位
另:如果爆出来还是登录不了,那就用爆出来md5反过来爆用户名
-
Access注入工具
穿山甲Pangolin
Sqlmap
Access 只需跑--tables
Sqlmap -u ····· -T 表名 --columns
Sqlmap -u ····· -T 表名 -C 字段名1,字段名2··· --dump
-
Access偏移注入
适用环境:知道表名而不知道列名
注入流程:
- 用 * 代替列数:union select 1,2,3,4,5,6,7,8,* from admin,报错就减去一个数,即union select 1,2,3,4,5,6,7,* from admin,到一定程度会随机爆出来某个表里的一个内容
- 如果列数比较多,那么减去的数字数量遵循等差数列,如减去10个数字爆出数据,那么下一个爆出的数据就在当前位置再减十个数字
- 如果查第二次没有查出来,那么带入内联查询(但非注入类型的内联): 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)
- 查第三次: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)
- 以此类推,如果加了还没有查出来就在数字后面星号前面加a.id,b.id,第几次就对应几个
跨库查询
- 应用环境:当目标有注入但是查询不出来表名列名,同时得到了数据库的绝对路径,知道数据库的表名和列名
- union select 1,2,3,4,5,6,7 from [c:\inetpub\wwwroot\8004\xydata\xycms.mdb].admin_user,接下来猜表名的列
- 和正常注入相同,但查的是另一个网站数据库上的表名列名,用的是本网站的权限查询另一个网站的数据库,需要有权限读取
Exp构造
cms通用漏洞原因:同一个cms具有同一个页面,而页面所对应的表名和列名都一
样,所以exp可以直接利用,但如果管理员做了手动修改可能就不能利用
绕过防护
通用型防注入代码绕过
- 通用弹框拦截:可以改变提交方式,即get、post、cookie不同方式切换,get\post在hackerbar里面更改,cookie用bp抓包后更改再发送。
- 代码防御:用+代替空格,或用%0a,%a0代替空格,大小写,url编码(但次数多了服务器会不识别)
Waf绕过
- 360绕过:
将注入语句中的空格替换为%0a
- WTS拦截(西部数码):
加%%%%%0a,多个%再加0a
- 安全狗:
增加其他参数,用注释符把原本参数包围起来如 ?id=9 and 1=1
变成 ?fuid=123/*&id=9 and 1=1&bid=123*/
安全狗认为后面的参数被注释了,注释的东西不拦截,而服务器只接收中间部
变换提交方式
- 宝塔:
- %%%%%0a
- 多个%%%截断关键字,如 a%%%%%%nd 1%%%%=1
- 大小写
- 对符号进行url编码,如 and 1%3d1