0%

前端安全2-基础xss(笔记)

前言

聊一下基础的xss,等着huli大佬写奇淫技巧

触发js代码

一般来说是用script标签去触发的

1
<script>alert(1)</script>

但是除了script标签,还可以用inline event handler来进行触发
1
2
3
4
5
<img src="not_exist" onerror="alert(1)">

<button onclick="alert(1)">点我</button>

<svg/onload=alert(1)>

常见的用来触发event handler的有

  • onerror
  • onload
  • onfocus
  • onblur
  • onanimationend
  • onclick
  • onmouseenter

等等

当然还可以用伪协议去触发js

1
<a href=javascript:alert(1)>Link</a>

这里有个值得注意的点,可以把href后面的伪协议当做字符串,这时候如果用了html编码也可以触发js
1
<a href=&#x6a;avascript:alert(1)>Link</a>

在这个网站有更多的payload
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

不同的xss

注入html

1
2
3
<?php
echo "Hello, <h1>" . $_GET['name'] . '</h1>';
?>

这种就直接htmlspecialchar就可以过滤了,比较常见不多赘述了

注入属性

1
2
3
4
5
6
7
8
9
10
<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>

这段代码会获取get参数的clazz,并拼接到<div class="">

那么注入xss的方式有几种

第一种闭合div,增加一个标签

1
"><img src=not_exist onerror=alert(1)>

那么代码就会变为
1
2
3
<div class=""><img src=not_exist onerror=alert(1)>">
Demo
</div>

第二种闭合”然后增加属性

1
" tabindex=1 onfocus="alert(1)" x="

那么就会变成
1
2
3
<div class="" tabindex=1 onfocus="alert(1)" x="">
Demo
</div>

注入到js中

1
2
3
4
<script>
const name = `<?php echo htmlspecialchars($_GET['name']) ?>`;
alert(name);
</script>

当代码是这样的时候
?name=${alert(1)}可以用这种语句去注入js

如果是用双引号的形式,如下

1
2
3
4
<script>
const name = "<?php echo htmlspecialchars($_GET['name']) ?>";
alert(name);
</script>

这样可能就没法进行注入js了,但是如果没有htmlspecialchars过滤的话,就可以用闭合"或者闭合<script>标签进行注入,在注入其他标签
例如
1
2
name=";alert(1);"
name=</script><img src=1 onerror=alert(1)>