中国红客联盟 首页 资讯 国内安全 查看内容

Pikachu之XSS防御秘籍:从“漏洞制造者”到“安全守卫者”

2025-3-3 08:31| 发布者: Honkers| 查看: 41| 评论: 0

摘要: XSS防御秘籍:从“漏洞制造者”到“安全守卫者” 上集回顾 ​在之前的章节中,我们解锁了XSS攻击的十八般武艺,从偷Cookie到盲狙管理员,从绕过安全措施到PHP函数的暗坑,成功从“

XSS防御秘籍:从“漏洞制造者”到“安全守卫者”

上集回顾

​在之前的章节中,我们解锁了XSS攻击的十八般武艺,从偷Cookie到盲狙管理员,从绕过安全措施到PHP函数的暗坑,成功从“脚本小子”进化为“漏洞收割机”。


XSS防御两大神器

神器一:输入过滤——把恶意代码“扼杀在摇篮”

核心原则

“只允许该进的,挡住不该进的!”
根据业务场景限制输入内容,比如:

  • 手机号:只允许数字和+号
  • 用户名:只允许字母、数字和下划线
  • 评论内容:过滤<script>、onerror等危险标签和属性
实战代码(PHP示例)
[code]// 手机号过滤:只保留数字和+ $phone = preg_replace('/[^0-9+]/', '', $_POST['phone']); // 用户名过滤:只允许字母数字和下划线 $username = preg_replace('/[^\w]/', '', $_POST['username']); // 评论内容过滤:移除危险标签 $comment = strip_tags($_POST['comment'], '<p><a><strong>'); // 只允许保留部分安全标签 [/code]

神器二:输出转义——让恶意代码“变成哑巴”

核心原则

“输出到哪里,就按哪里的规矩转义!”
不同的输出场景需要不同的转义方式:

场景1:输出到HTML正文
[code]// PHP推荐写法:默认转义双引号+单引号 echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8'); // 转义效果:<script> → &lt;script&gt; [/code]
场景2:输出到JavaScript代码
[code]// 先HTML转义,再JSON编码 $js_data = json_encode(htmlspecialchars($user_input, ENT_QUOTES)); echo "<script>var data = $js_data;</script>"; // 转义效果:</script> → \u003C/script\u003E [/code]
场景3:输出到URL参数
[code]// URL编码 $url = "https://example.com?param=" . urlencode($user_input); // 转义效果:空格 → %20,& → %26 [/code]

案例分析:那些年我们踩过的坑

案例一:a标签的href属性

  1. 进入靶场后我们就看到了一个输入框,说是请输入一个你常用的网站url地址,我就知道你是什么人,二话不说上百度。

    在这里插入图片描述

    ???我咋啦???
    在这里插入图片描述

  2. 输入其他试试?

    在这里插入图片描述

    点了一下,然而没有什么用。。。

  3. 看一下网页源码吧,看看发生了什么事

    在这里插入图片描述

    嗷嗷嗷~原来是直接用a标签直接href输出的啊,那不就直接输入脚本就可以了嘛

  4. 直接输入

    在这里插入图片描述

    点击submit后直接点击超链接
    在这里插入图片描述

    哈哈哈,出来了吧?

漏洞示例代码
[code]<a href="<?php echo $_GET['url']; ?>">点击领红包</a> [/code]
  • 攻击payload:javascript:alert('XSS')
  • 结果:点击链接直接执行脚本!
修复方案
[code]// 只允许http/https协议 $url = $_GET['url']; if (!preg_match('/^https?:\/\//', $url)) { $url = '#'; // 非法链接直接屏蔽 } echo '<a href="' . htmlspecialchars($url, ENT_QUOTES) . '">点击领红包</a>'; [/code]

案例二:动态生成JavaScript

  1. 我们直接进入关卡,看到了一个名为which NBA player do you like? 的输入框,好像和第一关是一样的哦

    在这里插入图片描述

  2. 老样子,我们还是随便输入一些内容,从源码当中看看有没有什么猫腻

    在这里插入图片描述

    我们发现我们输入的内容直接动态生成在了javascript 中,这咋办呢?

    不慌,复制下来,粘贴到文本文档中先。

    在这里插入图片描述

  3. 其实,我们只需要尝试把第一个<script>标签尝试闭合,在新的标签里面直接写入我们的代码就可以了。比如像下面这样。

    在这里插入图片描述

    图中,红色代表把原始的标签闭合了,橙色代表把变量构造给闭合了,蓝色就是我们自己构建的语句啦。

    接下来把变量里的东西复制并粘贴到输入框中,就OK了。其实就是下面这个。

    在这里插入图片描述

    效果如下

    在这里插入图片描述

    在这里插入图片描述

漏洞示例代码
[code]<script> var username = "<?php echo $_GET['name']; ?>"; </script> [/code]
  • 攻击payload:";alert('XSS');//
  • 结果:闭合字符串,注入恶意代码!
修复方案
[code]<script> var username = <?php echo json_encode(htmlspecialchars($_GET['name'], ENT_QUOTES)); ?>; </script> // 输出效果:var username = "\";alert('XSS');\/\/"; [/code]

总结

​XSS防御的本质是一场“输入与输出的攻防战”。记住:“永远不要相信用户输入,永远谨慎处理输出!”

​最后,送大家一句安全界的至理名言:“安全不是功能,而是习惯!” 无论是前端还是后端,只有将安全思维融入每一行代码,才能真正做到“防患于未然”。


结束——下机


免责声明:本内容来源于网络,如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

路过

雷人

握手

鲜花

鸡蛋

发表评论

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行