xss


XSS跨站脚本攻击

简介

xss,又称跨站脚本攻击,是一种网站应用程序的安全漏洞。是代码注入漏洞的一种,使用巧妙方法想网页中注入恶意代码,用户浏览器在加载网页,渲染HTML文档时恶意代码就会被执行。

一直在OWASP top 10 中出现,在CTF比赛中也很常见。

按照漏洞成因,一般分为三类

  • 反射型,

  • 存储型,

  • DOM型

还可以根据输出地点不同分为三类

  • 输出在 HTML代码中
  • 输出在CSS代码中
  • 输出在JavaScript代码中

反射性xss

xss代码作为客户端URL输入的内容提交给服务器,服务器解析后在相应内容中返回输入的XSS代码。最终由浏览器输出,(没有存储在服务器的数据库中,只是经过了处理被展示出来)原型如下:

</php
echo 'your input:' . $_GET['input'];    //这里是网站源码的示例,服务器接收input
?>

如果在服务器端没有对input进行任何过滤。那攻击者在网页上提交一段代码,以input形式上传,最那echo语句会将客户端输入的代码输出到HTTP相应中,浏览器解析并执行,比如

http://aaa.com/index.php/?input=<script>alert(hello)</script>

这样就会执行这一段代码中语句,在页面上弹出”hello”的弹窗

反射型xss需要在url中有提交的参数即get型传输数据,只有这样才能通过构造出一个恶意的url,黑客对反射型xss的使用一般都是通过让用户访问带有xss攻击的url完成的。

其实这里有html的原理,就是需要标签闭合,我们在进行xss利用的时候是需要检查网页元素的,需要依照实际情况使HTML语句闭合,再插入xss代码。

一般反射型xss漏洞是在搜索栏中,也可能出现在别的get型的传输数据处,需要进行测试。

存储型xss

存储型xss是指恶意代码上传至服务器数据库中,在正常用户访问该页面时恶意代码被取出并解析执行,导致了xss攻击。

一般我们会在发布帖子,回复帖子,编辑资料等需要将输入数据上传至服务器数据库的页面行为中发现xss漏洞,如果验证存在该漏洞后,就可以在这里插入xss代码进行攻击行为,

一般来说我们检验后端源码可以看到如下语句:

$name=$_POST['name'];
$content=$_POST['content'];

可以看到这是从客户端post上来的数据中取出数据赋值给变量,这里没有过滤,就会导致存储型xss漏洞的存在,此时就会使用一些过滤函数来对语句进行过滤,让xss语句被过滤。具体不表。如何绕过过滤会在后续记录

dom型xss

dom型xss是指攻击者在url中插入xss代码,清单页面直接从url中获取xss代码并输出到页面,导致xss代码攻击,攻击者将带有xss代码的url发送给用户,用户打开后收到攻击,注意在dom型xss中没有经过后端,直接是通过前端的处理来执行的xss攻击,一般是使用js脚本进行执行代码,还是需要多次的实验以及验证

其实很多时候反射型和dom型看似很类似,但是原理有本质上却别的,因为代码执行的地点并不相同。

dom型比较多的还是存在于搜索功能框中,找dom型可以仔细看一看网页源代码,注意script中是否会有注入点。

所以需要有一定的前端代码知识

Electron xss

electron是一个开源的基于浏览器内核的框架,使用 JavaScript、HTML 和 CSS 构建跨平台桌面应用程序,可以调用一些底层的api,对其可以进行普通的xss攻击,但也有一些特殊的利用点,就是利用了其使用到node.js,可以通过输入框等实现命令执行,达到更大的影响

postMessage xss

postMessage是html5引入的API,是js的一种用法。postMessage()方法允许来自不同源的脚本采用异步方式进行有效的通信,可以实现跨文本文档,多窗口,跨域消息传递.多用于窗口间数据通信,这也使它成为跨域通信的一种有效的解决方案.

\window.postMessage()** 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全

但通过这种方法发送到信息也可能造成xss攻击,需要开发者做相应措施来规避,下面是两个案例

https://www.anquanke.com/post/id/85634

http://www.mottoin.com/94130.html

localStorage xss

只读的localStorage 属性允许你访问一个Document 源(origin)的对象 Storage;存储的数据将保存在浏览器会话中。localStorage 类似 sessionStorage,但其区别在于:存储在 localStorage 的数据可以长期保留;而当页面会话结束——也就是说,当页面被关闭时,存储在 sessionStorage 的数据会被清除 。

应注意,无论数据存储在 localStorage 还是 sessionStorage ,它们都特定于页面的协议

一般来说如果使用来localstorage,那么有可能通过反射型xss利用localstorage来使其成为一个存储型的xss

xss持久控制

通过一个任意的xss,注入ServiceWorker,在浏览器后端达到持久控制的目的。service worker 是一个服务器与浏览器之间的中间人角色,如果网站中注册了service worker那么它可以拦截当前网站所有的请求,进行判断(需要编写相应的判断程序),如果需要向服务器发起请求的就转给服务器,如果可以直接使用缓存的就直接返回缓存不再转给服务器。从而大大提高浏览体验。

Service Worker常驻在浏览器中,即便注册它的页面已经关闭,Service Worker 也不会停止。本质上它是一个后台线程,只有你主动终结,或者浏览器回收,这个线程才会结束,serviceworker只能注册在https和localhost上

if ('serviceWorker' in window.navigator) {
  navigator.serviceWorker.register('./zero.js', { scope: './' })
    .then(function (reg) {
      console.log('success', reg);
    })
    .catch(function (err) {
      console.log('fail', err);
    });
}

这是serviceworker注册的代码。其中的zero.js就是判断以及控制程序,这也是实现xss的地方,而要想实现通过同源js脚本控制serviceworker,可以通过文件上传或者jsonp跨站请求实现。

利用思路:通过文件上传或者其他方法能控制文件,通过这个文件来注册servieceworker,通过serviceworker来实现xss 的持久化,可以参考:

http://zerobs.top/2020/11/15/71.html


文章作者: 0xahh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0xahh !
评论
  目录