Access:是一种数据库,和MySQL、MSSQL是一样的,都是存东西的
Cookie注入:就是接受Cookie传参而产生的注入
Cookie是什么呢?
Cookie就是代表你身份的一串字符串,网站用来验证你的身份的东西
我们进入百度,按F12,找到application,点击cookies,就能看到我们的cookie了。
Cookie注入老一点的ASP网站常见,PHP5.4及以上的版本他的$_REQUEST就不再接受cookie传参了
如果说开发用了$_REQUEST来接受传参,而POST和GET传参都被WAF拦截了,那我们或许可以尝试一下COOKIE进行传参,万一对COOKIE没有检测呢,那是不是就绕过检测了
设置cookie的方法
一、Burp抓包,修改数据包,直接添加一个cookie字段在里面
注意,cookie传参值需要URL编码一下,编码后再传入
二、直接在浏览器当前页面按F12,找到Console,输入document.cookie="id="+escape("171")
这里演示的是Google浏览器,火狐的话也是按F12,然后找到存储就好了、其他的一样
注意,document.cookie=这是一个整体,"id="这是一个整体u,+是用来拼接的,escape()是JS的一个函数,用来编码字符串的,是为了更好地兼容,这样传参的时候记得删掉蓝色箭头指的?id=171的部分,因为GET传参的优先性比COOKIE传参的优先性高,浏览器会优先接受GET传参
当我们将GET传参的部分删掉以后,在F12页面,输入document.cookie="id="+escape("171"),页面显示的是id=171的内容,输入document.cookie="id="+escape("172"),的时候页面会显示id=172的内容,输入以后按回车,然后按回车刷新一下页面就好了
那么在进行Cookie注入的时候,其实我们的步骤和前面的显错注入、盲注这些是一样的
判断有无注入,and 1=1 、and 1=2 这样,知道了有注入之后,就是判断字段数,然后判断库名
当然,Access数据库呢,就Access一个数据库,所以没必要知道库名,Access数据库呢也没有自带表,所以我们无法通过联合查询的方法来直接知道表名、字段名
方法就只有爆破了
爆破的时候,我们需要用到 exists(检测子查询中是否有值)
我们输入 and exists(select*from 表名)
例如:and exists(select*from admin),如果页面正常,就是有这个表,如果没有这个表,页面显示错误。那我们就可以利用这一点,抓包,然后选中admin这个地方,然后爆破就好了
这里爆破的话,可以直接用SQLmap的字典,在你安装SQLmap的目录下,找到data这个文件夹,找到txt这个文件夹,然后找到common-tables.txt这个文件就行了。
在爆破的时候,点击Load这个地方加载字典,找到刚才所说的SQLmap的目录,然后把不需要的点击Remove删掉就行了,然后点击开跑右上角那个地方,然后看长度就可以知道哪个有,哪个没有了,长度差别还是挺大的
跑字段的话,就选中*那个地方就好了,然后选中SQLmap目录里的data文件夹、txt文件夹下的common-columns.txt文件就好了
想要知道里面的数据,这时候我们就需要知道他的显错位,我们输入 and exists(order by 1),这样一直试到页面出错为止,这里我们查出来有十个字段,然后输入union select 1,2,3,4,5,6,7,8,9,10 from admin,这里一定要跟一个刚才查出来的表名,查看页面显错位
然后在显错位上面输入我们想要的数据,比如:username和password(这两个是我们跑出来的,存储账号密码的字段),这里就成功拿到了管理员的账号密码,这里的密码使用MD5加密过的,解密以后就好了
当然,如果嫌麻烦的话,也可以直接使用SQLmap一把梭,直接使用命令:sqlmap.py -u "网址" --cookie "id=171" --level 2,就OK了
偏移注入
偏移注入要注入表的字段数,要小于当前页面的字段数
在了解偏移注入之前,我们需要知道下面这个知识点
我们在查询某个表里面的所有字段的时候,我们一般写的查询语句是这样的:select * from admin,这个*号表示查询这个表下面的所有字段,我们也可以这样写:select admin.* from admin,.表示拼接,*表示所有字段,这个意思就是查询admin表下的所有字段
我们可以在下图看到,这两个语句查询到的东西都是一样的
我们假设news这个表里面有十个字段,5这个位置是显错位,写以下语句
select * from news where id=1 union select 1,2,3,4,5,6,7,8,9,10
我们再假设admin这个表里面有三个字段,分别是id、username、password,我们把这个拼接到上面这个查询语句的显错位中,这个语句就变为了
select * from news where id=1 union select 1,2,3,4,id,username,password,6,7,8,9,10
这个news表中原本有十个字段,我们将admin表中的三个字段拼接上去以后,就变为了十二个字段,明显不对,所以我们需要删掉两个字段,让他重新变为十个字段,上面我们说了,查询所有字段有一个更为简单的写法,那就是admin.*,所以这个语句就变为了
select * from news where id=1 union select 1,2,admin.*,6,7,8,9,10 这个语句等价于
select * from news where id=1 union select 1,2,id,username,password,6,7,8,9,10
而5这个位置是显错位,所以password这个字段的数据就显示出来了,当我们把admin.*的位置上移动以后,就可以一步一步地将id、username的数据知道
例如:select * from news where id=1 union select 1,2,3,admin.*,7,8,9,10 这个语句等价于
select * from news where id=1 union select 1,2,3,id,username,password,7,8,9,10
这样就把username字段的数据知道了,再将admin.*往后移一位,就得到了id字段的数据
例如:select * from news where id=1 union select 1,2,3,4,admin.*,8,9,10
这个就是偏移注入
为什么偏移注入要注入表的字段数,要小于当前页面的字段数呢?我们可以在靶场试一下
我们输入union select 1,2,amdin.*,4,5,6,7,8,9,10 from admin,如果说admin表中只有一个字段的话,页面会回显正常,如果大于一个字段,就会回显错误,那我们就可以利用这个办法来试出admin表中有几个字段数,我们一个一个试,最后发现admin表中的字段要大于这个页面的十个字段
这样的话,就无法进行偏移注入了,这个就相当于你有一把尺子,长度是8,而你要量的东西长度是20,就没办法一下子量出来,这样的话,我们就需要找一个字段数比较多的页面了
偏移注入的步骤:
判断出来就注入以后,查询字段数、查看回显点、然后用表名.*来判断你要注入的表的字段数,然后偏移位数,让你想要的数据在显错位上面显示出来
偏移注入的局限性也是比较大的,如果显错位比较少,你就可能没办法得到你想要的数据
当然,也有可能存在隐藏的显错位,我们可以给页面的显错位一个标示性的数字,比如520520,然后给所有字段后面添加上,然后在前端页面查看一下,有没有没在页面显示,但是能在前端代码中看到你这个标识的