首页 > 技术文章 > Access手工注入

Timesi 2018-08-07 10:53 原文

access手工注入

哈哈哈哈,,,我顾北清又回来啦,接着更新。
实验环境:win2008R2虚拟机,物理机(也就是我的win10)。
搭建环境用的是access+asp源码。

环境搭建可以参照这里,不同的是在第六步勾选应用程序开发选项。
环境搞完之后大概是这个样子的:

接着来手工注入一下。
首先判断有没有注入点,随便点进一个页面:


%20是空格的转码。
and 1=1没有出错,再来试试and 1=2

出错了,说明它将这条语句带入查询了,说明存在注入点。

1.联合查询法
先判断字段长度,使用order by 猜测的长度
我这里猜测长度是22(因为我事先知道/滑稽脸,所以命令是order by 22


判断到22的时候是正常的,到23的时候报错了,说明,字段长度是22。
然后来猜解表名,使用的命令是:union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin.
admin是我猜解的表名。

发现这里爆出一个315,说明315这两个位置存在数据,接着来用猜解的数据替换这两个位置。

图中的adminpassword是猜解的字段,如果此阿姐正确就会爆出这两个位置的数据,这样就拿到了账号密码。

2.逐字猜解法
首先判断是否存在某个表:
这里使用的命令是and exists ( select * from admin),判断是否存在admin表。

没有报错,说明存在admin表,接着来判断admin表中的字段,这里使用and exists ( select admin from admin)命令判断在admin表中是否存在admin字段。

没有报错说明存在,接着看看有没有password字段。

发现也没有报错,说明存在。
然后判断这两个字段对应数据的长度。
因为我事先知道对应关系,所里我就直接判断admin的长度是5,password的长度是16。
使用语句是and (select top 1 len(列名) from admin)=长度值
可以使用and (select top 1 len(列名) from admin)>长度值来缩小范围。


这样我就判断出了数据的长度,然后根据数据长度反推数据。
使用的命令是and (select top 1 asc(mid(列名,第几位,1)) from admin)=长度值,这里的长度值是ASCII码。

我使用的命令是and (select top 1 asc(mid(admin,1,1)) from admin)=97
可以看到没有报错,这里97对应的是a,而我的admin列里的数据是admin,刚好对应,如果换成98,那么就会报错。
以此类推,猜解出数据。

推荐阅读