导语

从今天开始,来开一个新坑,学期结束,看看能不能利用一些零散的时间在寒假结束前完成一个web安全的靶场,portswigger的靶场算是比较入门的,希望能够在写博客的基础上好好坚持下来。明确一下任务:*就题论题,熟练地了解并掌握在靶场题目限定下的操作

注:文章所添加的题目,翻译来自浏览器系统自带,倘若有愚蠢至极的翻译,并不代表本人水平,仅作大体表达参考!

友链:

靶场平台:Web Security Academy: Free Online Training from PortSwigger

CTF-Web修炼手册:XSS 完全指南 - CTF-Web修炼手册

跨站脚本攻击(XSS)

XSS攻击主要有三种类型。它们分别是:

  • 反射型XSS,恶意脚本来自当前的HTTP请求。
  • 存储型XSS,恶意脚本存在于网站数据库。
  • 基于DOM的XSS,其中漏洞存在于客户端代码中,而非服务器端代码。

题目一

  • 解答:这个题目直接在可利用的搜索栏输入<stript>alert('XSS')</stript>有”XSS”回显,就说明有XSS漏洞
  • 总结:熟悉最基本的HTML语言,菜鸟教程:HTML 教程 | 菜鸟教程

题目二

  • 解答:原理和方法同上,这次的漏洞存在于评论区中,要在表单其他信息填充任意的信息
  • 总结:无

题目三

注释:翻译问题,水槽就是sink

  • 解答:本实验通过检查DOM是对于输入文本的简单粘贴,只需要闭合原属性并加以利用,就可以进行攻击
  • 解析:DOM是浏览器对网页的编程接口,它把 HTML 文档转换为一个树形对象结构,让 JavaScript 能够动态地访问和操作页面内容。DOM XSS就是基于浏览器不安全的处理HTML,本实例中利用document.write('<img src="...">');浏览器从url中获取输入保存在query变量中再通过拼接'<img src="/tracker?q=' + query + '">';写入document.write中

  • 初学补充:

    • 概念1:前端三件套

      1
      2
      3
      HTML像房子的墙、门、窗(结构),
      CSS像墙漆、地板、窗帘(外观),
      JavaScript像电灯开关、遥控器、智能家居(交互功能)
    • 概念2:Source(源头):用户能控制的数据入口

      1
      2
      3
      - URL参数(`?q=xxx`)
      - 表单输入
      - 网页片段(`#xxx`)
    • 概念3:Sink(汇点):危险的DOM

      1
      2
      3
      document.write()     // 最危险
      element.innerHTML // 很危险
      eval() // 极度危险
    • 概念4:数据流

      1
      用户输入 → 网页获取 → 不检查 → 直接使用 → 执行恶意代码

题目四

  • 解答:基本原理同上。playload:<img src=1 onerror=alert(1)>
  • 解析:漏洞触发点:使用了 innerHTML 和 location.search。location.search 获取 URL 中的查询参数(例如 ?search=xxx)。将参数值直接通过 innerHTML 插入到 DOM 中。对于该playload:img元素里存在src属性,只需要随便给一个值,关键是onerror 是 <img> 标签的标准事件处理器,当图片加载失败时,浏览器会自动执行 onerror 中的JavaScript代码,这样就能执行任意恶意代码,这里是 alert(1)

题目五

  • 解答:锚定window.location.search这个属性,它把window.location.search,即URL问号后面的returnPath值给了href,所以只要构造一个含有脚本指令的伪URL即可
  • 解析:利用window.location.search找XSS的注入点

题目六

  • 解答:在靶场模拟的攻击服务器里构造攻击载荷:<iframe src="https://0a1b2c3d4e5f6789.web-security-academy.net(注释:你指定的网站)/#" onload="this.src+='<img src=x onerror=print()>'"></iframe>

  • 效果预览:

  • 解析:对于攻击载荷各部分解析

  • 部分 作用 示例值
    <iframe> 创建一个内嵌窗口 容器
    src="..." 指定加载哪个网页 你的实验页面
    # URL的哈希部分(锚点) 用于触发漏洞
    onload="..." 页面加载完成后执行 触发攻击的关键
    this.src+= 修改iframe的URL 添加恶意代码到hash
    '<img src=x onerror=print()>' 恶意代码 触发print()函数

题目七

  • 解答:这个题目要求我们做的是在某个属性处注入,所以只需要闭合前属性,添加新属性即可:" onclick="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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// 点击相关
onclick // 单击
ondblclick // 双击
onmousedown // 鼠标按下
onmouseup // 鼠标释放
oncontextmenu // 右键菜单

// 悬停相关
onmouseover // 鼠标进入
onmouseenter // 鼠标进入(不冒泡)
onmouseout // 鼠标离开
onmouseleave // 鼠标离开(不冒泡)
onmousemove // 鼠标移动

//按键类
onkeydown // 按键按下
onkeypress // 按键(字符键)
onkeyup // 按键释放

//焦点类
onfocus // 获得焦点
onblur // 失去焦点
onfocusin // 即将获得焦点
onfocusout // 即将失去焦点

//表单类
onchange // 值改变
oninput // 输入时
onselect // 文本被选中
onsubmit // 表单提交
onreset // 表单重置
oninvalid // 输入无效时

//加载类
onload // 加载完成
onerror // 加载错误
onabort // 加载中止
onunload // 离开页面
onbeforeunload // 离开页面前

//其他操作
onresize // 大小改变
onscroll // 滚动时
oncut // 剪切
oncopy // 复制
onpaste // 粘贴
ondrag // 拖动
ondrop // 放置
onwheel // 滚轮滚动
ontoggle // 详情元素展开/收起

//加载或报错
onload // 加载完成
onerror // 加载错误
onabort // 加载中止
onunload // 离开页面
onbeforeunload // 离开页面前

题目八

  • 解答:审题可以知晓:注入点是属性值,触发事件是点击评论作者名字。本题是一个存储型XSS,提交表单至数据库,所以我们要利用BP去修改,提交一个恶意表单。

这里有四项,我们先提交一个POST,使得其成功上传。接着再访问页面,搜索关键字找到准确的注入点!

咦~我们发现,我们输入的123456.com成功写进了href标签里,这就是题目所说的漏洞所在,现在只要填入palyload即可,如下图

题目九

  • 解答:通过BP发现出现在变量赋值里,只需要搜索palyload:';alert(1);//,做到:把字符串闭合;添加函数;注释掉后引号

题目十

  • 解答:输入的有效palyload:product?productId=1&storeId="></select><img%20src=1%20onerror=alert(1)>

题目十一

  • 解答:在搜索框输入载荷{{$on.constructor('alert(1)')()}},成功alert
部分 分析
双大括号 AngularJS表达式定界符,表示内部代码会被解析执行
$on AngularJS作用域内置方法,用于事件监听。这里作为获取Function构造函数的入口点
.constructor JavaScript函数对象的属性,指向创建该函数的构造函数(即Function构造函数)
(‘alert(1)’) 传递给Function构造函数的字符串参数,会被编译为函数体代码

题目十二

  • 解答:playload为{"searchTerm":"\\"-alert(1)}//", "results":[]}

题目十三

  • 解答:在存在漏洞的博客处输入评论,注意本题存在初步的漏洞检测,第一个尖括号会被转化为字符串,但是从第二个尖括号开始就不会转换,只需要输入载荷:<><img src='' onerror=alert(1)>

题目十四