当用户鼠标在这个块上面时即可运行(可以配合weight等参数将div覆盖页面,鼠标不划过都不行)类似的还有onclick,这个要点击后才能运行代码,条件相对苛刻,就不再详述。
有的时候,服务器往往会对代码中的关键字(如alert)进行过滤,这个时候我们可以尝试将关键字进行编码后再插入,不过直接显示编码是不能被浏览器执行的,我们可以用另一个语句eval()来实现。eval()会将编码过的语句解码后再执行,简直太贴心了。
例如alert(1)编码过后就是\u0061\u006c\u0065\u0072\u0074(1),所以构建出来的攻击语句如下:
http://192.168.1.102/xss/example5.php?name=
来看这份代码:

乍一看,哇!自带script标签。再一看,WTF!填入的内容被放在了变量里!
这个时候就要我们手动闭合掉两个双引号来实现攻击,别忘了,javascript是一个弱类型的编程语言,变量的类型往往并没有明确定义。
思路有了,接下来要做的就简单了,利用语句如下:
http://192.168.1.102/xss/example6.php?name=";alert("I am coming again~");"
效果如图。

回看以下注入完代码的网页代码,发现我们一直都在制造巧合。。

先是闭合引号,然后分号换行,加入代码,再闭合一个引号,搞定!
在实际运用中漏洞的利用可能不会这么直观,需要我们不断的尝试,甚至组合各种绕过方式来达到目的。
介绍完一些常用的绕过方式,再倒回来讲一下XSS分类,因为下面讲具体的应用时会用到。
XSS攻击大致上分为两类,一类是反射型XSS,又称非持久型XSS,另一类则与之相对,称作储存型XSS,也就是持久型XSS。
先来讲什么是反射型XSS。其实,我们上面讲XSS的利用手段时所举的例子都是非持久型XSS,也就是攻击相对于访问者而言是一次性的,具体表现在我们把我们的恶意脚本通过url的方式传递给了服务器,而服务器则只是不加处理的把脚本“反射”回访问者的浏览器而使访问者的浏览器执行相应的脚本。也就是说想要触发漏洞,需要访问特定的链接才能够实现。
再说储存型XSS,它与反射型XSS最大的不同就是服务器再接收到我们的恶意脚本时会将其做一些处理,例如储存到数据库中,然后当我们再次访问相同页面时,将恶意脚本从数据库中取出并返回给浏览器执行。这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大。还记得在文章开头提到的留言板的例子吗?那通常就是储存型XSS。当有人在留言内容中插入恶意脚本时,由于服务器要像每一个访客展示之前的留言内容,所以后面的访客自然会接收到之前留言中的恶意脚本而不幸躺枪。这个过程一般而言只要用户访问这个界面就行了,不像反射型XSS,需要访问特定的URL。
区别完两种XSS类型,下面来讲几个实例应用。
劫持访问就是在恶意脚本中插入诸如的代码,那么页面就会跳转到百度首页。劫持访问在持久型和非持久型XSS中都比较常被利用。持久型XSS中劫持访问的危害不用说大家都清楚,但有人会问非持久型XSS中劫持访问有什么作用呢?很简单,试想下像qq.com,baidu.com这样的域名下出现非持久型XSS,那么在发送钓鱼链接时就可以通过qq.com等域名进行跳转,一般人一看到qq.com之类的域名警惕性会下降,也就更容易上当了。
具体原理上文已经提到,这里做一个具体演示。由于盗取的cookie需要传回给攻击者,因此往往需要一个服务器来接收盗取的cookie,这也就是xss平台的作用了。网上的xss平台很多,但动手搭建一个也不难,建议有条件的自己搭建。
首先登录平台后台获取到js脚本地址为http://127.0.0.1/XSS/template/default.js,所以我们需要做的是把这段代码植入指定页面。
(这里以DVWA渗透测试平台为例)

我们发现网页对于message长度有限制。审查元素看一下。
打开登录界面,调出火狐的firebug插件,调至cookie选项卡(注意,如果你的firebug插件没有cookie选项卡,请再安装firecookie插件即可看到)
先简单解释以下csrf攻击。Csrf攻击就是在未经你许可的情况下用你的名义发送恶意请求(比如修改密码,银行转账等),下面演示一个用xss配合csrf修改用户密码的例子。
有人会问,这不是引用脚本吗?其实不然,本质上这还是发起了一起get请求,因此可以直接使用。与上例一样,插入到message中,再坐等上钩。等下一个用户访问该界面时,密码就会被改为123456惹~