在前面的文章中,讲述了最好懂的存储型XSS攻击和防御,本文来聊聊反射型XSS,所谓反射,就像镜子一样,一束光发过去,立即弹回来。
反射型XSS的攻击思路如下:
这里依赖于微博服务器存在反射XSS漏洞。那么,坏人C为什么不自己搭建一个反射服务器进行反射呢?
这是个好问题。以js获取cookie为例,如果坏人C自己搭建反射服务器,那么很显然document.cookie就无法获取好人A的微博cookie,所以,还是要用微博服务器做反射,这样才能获取好人A的微博cookie,从而进行攻击。
我们以localhost作为微博服务的域名,来进行模拟。好人A登录微博后的cookie如下:
坏人C开始实施攻击了:
步骤1:坏人C给好人A发送一个链接,链接示意如下(在实际场景中,这个链接需要转换):
http://localhost:8080/static?para=<script>var allcookies = document.cookie;alert(allcookies);</script>
步骤2: 好人A无意中点击了这个链接,向微博后台(localhost)发起http访问,微博后台的代码如下:
package main
import (
"io"
"log"
"net/http"
)
func staticFile(w http.ResponseWriter, r *http.Request) {
// 坏人C给好人A的http链接中,携带此参数,然后微博后台解析出此参数,即paraFromInput
paraFromInput := `<script>var allcookies = document.cookie;alert(allcookies);</script>`
str := "<html><body>" + paraFromInput + "</body></html>"
io.WriteString(w, str)
}
func main() {
http.HandleFunc("/static", staticFile)
err := http.ListenAndServe("localhost:8080", nil)
if err != nil {
log.Println(err)
}
}
步骤3:微博后台服务反射,返回js代码,于是在好人A的浏览器中就出现了弹框,获取了好人A的微博cookie:
步骤4:既然js脚本可以获取好人A的微博cookie, 很自然地,坏人C就有办法在js代码中把好人A的微博cookie劫持到坏人C的服务器,从而盗取了微博cookie, 实施破坏活动。
反射型XSS也是有防御办法的,开发人员需要对内容进行过滤和变换。当然,设置cookie为httponly也是非常推荐的。如果一个网站的输入框,存在反射场景,那么很可能就存在反射XSS漏洞。
我们可以看到,对于持久型XSS而言,只要用户正常浏览网页,就会中招,所以危害极大。而对于反射型XSS而言,需要诱导用户去点击恶意链接才能中招。提醒一下,别看到抽奖网页和红包网页就心动,别看到娱乐新闻就想八卦一下,别看到美女图片就精虫上脑,这些很多是骗子。
最后说一下,作为开发人员,还是要谨慎,毕竟新浪微博当时就出过反射型XSS漏洞: