0x00 前言

Cookie注入常见于老一点的ASP站。在PHP中,小于5.4的版本可能存在,5.4及以上版本,"$_REQUEST[]"不再接受Cookie传参。

当对一个网站进行SQL注入时,如果发现存在waf或者传参过滤时,可以尝试Cookie注入,因为有可能网站可以接受Cookie传参,但是waf等只对GET/POST传参做了检测和限制。

0x01 条件

1、网站接受Cookie传参

2、没有对Cookie做防护限制

0x02 代码审计

Cookie注入1.png

第14行,if语句判断如果Cookie中没有参数uname,就会生成一大堆的HTML代码,当作登录界面。所以第14-41行代码的作用就是判断Cookie中有没有uname这个参数,如果没有,就说明当前没有登录,并生成一个登录界面。

Cookie注入2.png

第47行定义了一个函数check_input(),用于对参数的过滤:

当传递进来的值不为空时,会截取前20个字符,当开启魔术引号时,会删除转义生成的反斜杠。接下来检测是否全部为数字,如不并不全为数字或存在负数、小数时,先调用mysql_real_escape_string()函数对SQL语句中的关键字做转义处理,再在首尾分别添加一个单引号。

若传递进来的值为空时,调用intval()函数获取其整数值,若为空或者则返回0。

Cookie注入3.png

第73行判断当变量uname和passwd都以POST方式传递进来时,会调用check_input()函数对其进行过滤,再拼接到SQL语句中执行,并且根据执行结果返回登录成功或登录失败。并且把变量username的值赋值给变量cookee。

Cookie注入4.png

如果Cookie中没有uname传参,则执行第119行的else语句

第124行,如果POST传参中没有submit字符时,就将Cookie中的uname变量赋值给变量cookee,并且第147行直接拼接到SQL语句中查询,如果数据库中username字段存在变量cookee的值,就直接返回用户名和密码。

因此,存在Cookie注入。只要POST传参中没有submit,就可以通过Cookie传参uname进行SQL注入。

0x03 靶场复现

访问靶场,是一个登陆框,根据审计结果,直接抓包构造语句进行SQL注入

Cookie注入5.png

删掉POST传参的内容,在请求投中添加Cookie字段 uname=admin

Cookie注入6.png

获取数据库名

Cookie注入7.png