Cookie注入
0x00 前言
Cookie注入常见于老一点的ASP站。在PHP中,小于5.4的版本可能存在,5.4及以上版本,”$_REQUEST[]”不再接受Cookie传参。
当对一个网站进行SQL注入时,如果发现存在waf或者传参过滤时,可以尝试Cookie注入,因为有可能网站可以接受Cookie传参,但是waf等只对GET/POST传参做了检测和限制。
0x01 条件
1、网站接受Cookie传参
2、没有对Cookie做防护限制
0x02 代码审计
第14行,if语句判断如果Cookie中没有参数uname,就会生成一大堆的HTML代码,当作登录界面。所以第14-41行代码的作用就是判断Cookie中有没有uname这个参数,如果没有,就说明当前没有登录,并生成一个登录界面。
第47行定义了一个函数check_input(),用于对参数的过滤:
当传递进来的值不为空时,会截取前20个字符,当开启魔术引号时,会删除转义生成的反斜杠。接下来检测是否全部为数字,如不并不全为数字或存在负数、小数时,先调用mysql_real_escape_string()函数对SQL语句中的关键字做转义处理,再在首尾分别添加一个单引号。
若传递进来的值为空时,调用intval()函数获取其整数值,若为空或者则返回0。
第73行判断当变量uname和passwd都以POST方式传递进来时,会调用check_input()函数对其进行过滤,再拼接到SQL语句中执行,并且根据执行结果返回登录成功或登录失败。并且把变量username的值赋值给变量cookee。
如果Cookie中没有uname传参,则执行第119行的else语句
第124行,如果POST传参中没有submit字符时,就将Cookie中的uname变量赋值给变量cookee,并且第147行直接拼接到SQL语句中查询,如果数据库中username字段存在变量cookee的值,就直接返回用户名和密码。
因此,存在Cookie注入。只要POST传参中没有submit,就可以通过Cookie传参uname进行SQL注入。
0x03 靶场复现
访问靶场,是一个登陆框,根据审计结果,直接抓包构造语句进行SQL注入
删掉POST传参的内容,在请求投中添加Cookie字段 uname=admin
获取数据库名