虽然说现在的web开发框架都是挺成熟的框架,在性能、安全等方面都有比较好的表现,但问题往往出现在业务逻辑上,如上周我再公司发现的一个跨站脚本攻击,(通常公司是这么过滤的,max(0,$_GET[‘a’])、strip_tags($_GET[‘a’]),然而代码量大的话,就容易出现忽略的地方)
如下面一段代码:
(function(){
var a = {:$_GET['b']};
//....
})()
如果把接收的参数写成:””;alert(document.cookie);//,那么攻击就成功了,
有了这个漏洞之后如何利用,首先构造一个获取cookie然后跳转到指定服务器进行进行信息收集,然后再跳转回一个不易被怀疑的页面(但如果要做的事比较多,脚本比较多怎么办,
像当年新浪的xss一样,引入js脚本)。有没有更高级的做法,答案是有的,用jsonp就不用跳转了,这个我没有试验,另外还有一种方式,就是把链接生成二维码,
通过扫描二维码的方式也不易被发现,所以大家没事不要随便扫二维码,不要以为在微信中就认为链接不可见,get到链接的方法就是分享页面给自己,然后通过邮件转发就能看到链接.
优缺点:
优点:
效率高
缺点:
不便于维护,缺乏安全性
解决方案:
使用全局过滤
要求使用统一的函数进行参数接收,就算不用I函数也可以自定义一个函数
添加验证码等操作
如何减少攻击带来的损失:
在一个web项目里,由于多人合作,不一定能每一个细节都做的很好,所以
cookie启用httponly属性,thinkphp里似乎要3.2.3版本才有,没有也没关系,可以自己加上,在新版本的thinkphp找到cookie函数,跟旧版本的对比下就知道了,另外
需要在配置里配置’COOKIE_HTTPONLY’ => true,这个可以在大部分浏览器保证cookie不被偷走
bug终结者
你以为这样就完了吗,往下看:
thinkphp(3.2.3core版测试,默认过滤’DEFAULT_FILTER’=>’htmlspecialchars’,)里I函数也无能为力的地方就是
不过滤单引号
(function(){
var a = '{:$_GET["b"]}';
var b = '{:I("b")}';//变量输入 ';alert(document.cookie);//
console.log(a);
console.log(b);
})()
这种情况I函数也帮不了你,最后,使用统一的过滤函数,并且注意I函数单引号的问题
网友评论