前言
前两天看到dede的这个预警,然后看了一下详情,有的分析文章其实有点毛病。比如安全客这篇,他说“在这里可以明显的看到逻辑错误,这里针对文件名中的异常符号进行了替换为”的操作,并且随后的正则过滤条件限定宽松”,这个是明显的逻辑错误吗?前半段的异常符号的过滤应该没什么问题吧,问题主要在于后面的正则少了个$,但是再具体下去的话,其实也不是这样的,如果真的只是正则问题,那么上传1.jpg.php
也是可以的,但并不是这样,估计是有多个过滤和判定的,那就稍微分析一下。
不过这个真的很鸡肋,表面上说是前台,实际上还是得要后台管理员才行。
写着写着,我终于意识到这个漏洞似曾相识,感觉在哪见过,当时没仔细看,就此停笔吧。
问题定位
先用admin账号复现一下,先把会员功能给开了,然后在这里上传一下
拿到直接处理代码了,位于/include/dialog/select_images_post.php
,在这里断下调试一下
这里和他们分析的一样。我把文件名改成1.jpg.php
传过去试一下
给我提示了Not Admin Upload filetype not allow !
,而且没有进入断点,也就是说有另一处判断,全局搜一下,发现了这里,位于include/uploadsafe.inc.php
1 | $cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml"; |
我们再看一下相关调用栈
这样逻辑就很清楚了,对于上传的文件过滤,这边先是走了一遍系统公用的include/uploadsafe.inc.php
安全防护,而这里用的是黑名单机制,然后再走一遍include/dialog/select_images_post.php
的过滤和白名单机制。
如果说整个系统在不同地方的功能不太一样,公用安全粒度粗分,然后具体功能进行细分,其实无可厚非,而且先过滤后判断最后决定执行这个顺序也没有问题,主要的问题是后面那个白名单正则写错了。
此外,又看了看,同一个正则写出问题的也不止这一个地方,还有俩呢
1 | include/dialog/select_templets_post.php |
打开http://localhost/include/dialog/select_templets.php
和http://localhost/include/dialog/select_soft.php
而且还有重命名和路径设置,通过重命名直接就能传php文件了,甚至不需要啥特殊字符过滤,然后还可以跨路径。