从哪儿来

漏洞出自

甚至可以在exploit-db上找到他的对应exp,说明用他的人还是不少

根据它的exp指示,漏洞在search.html页面,把代码添加到该页面,用post传递x=phpinfo()就可以执行phpinfo

到哪儿去

那我们先对他进行修改看看是怎么个事儿

把代码添加进去

访问页面执行

产生原因

涉及到代码执行,那么就得看看php中代码执行的函数有哪些

  • PHP中的代码执行函数主要包括以下几种‌:
  • eval()‌:将字符串作为PHP代码进行执行。例如:eval($_POST['cmd']);‌12。
  • assert()‌:执行一个表达式,如果表达式为假则抛出一个用户定义的错误。例如:assert($_POST['cmd']);‌23。
  • preg_replace()‌:使用正则表达式替换字符串,可以执行代码。例如:preg_replace('/pattern/', 'code', 'input');‌14。
  • call_user_func()‌:调用用户指定的函数。例如:call_user_func($_POST['func']);‌12。
  • create_function()‌:动态创建一个匿名函数并执行。例如:create_function('', $_POST['code']);‌34。
  • array_map()‌:对数组的每个元素应用回调函数。例如:array_map('eval', array($_POST['code']));‌34。
  • array_filter()‌:使用回调函数过滤数组中的元素,可以执行代码。例如:array_filter($array, 'assert');‌34。
  • uasort()‌:使用用户自定义的比较函数对数组排序。例如:uasort($array, 'custom_sort_function');‌4。

最常见的就属eval了,我们的一句话后门它可做出了不少贡献。就最后一个zzz_template.php中是对代码执行的

请看这句话,eval会对里面的if语句直接执行,如果ifstr是一段可执行代码的话就会产生漏洞

那么就跟踪ifstr的出处,来自matches数组-matches来自被正则表达式匹配后的zcontent,zcontent来自调用该函数的地方

看到这里其实就可以对应上面添加的代码,可以确定是刚好匹配上这个正则表达式的

共有两处调用

在这个类下

共有九处调用这个类的parserCommom,而且都长得一模一样

经过对比发现代码也长得差不多,根据分析我们保存的时候在后台,应该和这个save.php有关,然后要执行的时候会请求客户端client,那么我们就去看这个zzz_client.php

这个php文件中有对我们寻找的函数多处调用,暂时不看,于是在文件中找到了关键词,对应漏洞产生的search页面

于是我看得老眼昏花,因为几处代码都调用了该函数,实在有点难分析它去往了哪步,调试一下

根据访问对应页面,我们首先来到了下的第一处断点

步过后发现此处判断不成功,进入了elseif环节

此时我们已经可以读出zcontent的值了

新建完对象后对它直接执行,对于执行结果有一个输出,可以看到是经过正则表达式匹配完后的phpinfo

此时的逻辑就很清楚了,首先是case等于search,给tplfile赋值为search,导致没有进去第一个if语句而满足了elseif,于是就在elseif里面执行。通过load_file加载search.html,并且将读到的内容给zcontent,zcontent会读取到已经被添加phpinfo的代码段,然后给parserCommom执行,parserCommom会对整个html文件交给不同的函数去提取里面的相关信息,在parserIfLabel中正好就被带有if和endif代码段给匹配上了,获取到post请求x和phpinfo,最后给到执行