[代码审计]phpshe开源商城后台两处任意文件删除至getshell
0x00 背景
这套系统审了很久了,审计的版本是1.6,前台审不出个所以然来。前台的限制做的很死。
入库的数据都是经过mysql_real_escape_string,htmlspecialchars的处理。
二次注入没找到,逻辑漏洞也没找到。抛开实际利用来说,简单讲讲两个任意文件删除漏洞,在拿到后台之后的getshell方法。
0x01 phpshe程序简介
phpshe是一个开源商城程序,程序在前台入库的地方都用了pe_dbhold函数(mysql_real_escape_string,htmlspecialchars过滤),虽然用的是全局变量注册,但是进行了变量的划分。
加上了各自不同请求的前缀。使得变量不能夸请求覆盖,同时底层有入库的参数值都是用单引号进行包含。
所以注入是不可能的了,加上htmlsepcialchars的过滤,连xss都没发现一个。
上传方面用的是白名单,限死了后缀,加上文件名重命名,使用时间加上大范围随机数md5的方法。
前台就介绍到这里,讲讲后台的一些情况。
后台大部分都进行了csrf防御,只有少部分没有(一些查询操作,没有实际作用),几乎所有后台页面都是存在注入,但由于程序是没有开启报错的。
所以是没有办法通过报错的方式拿到绝对路径,后台的注入其实等于没用,也没有越权的情况(通过鉴权文件,加载后台模块)。
看了一下乌云镜像站上关于该程序的历史漏洞也是少的可怜,程序的安全性确实做得很好。
那么下面就讲讲两个后台任意文件删除,与及拿shell。
0x02 后台两处任意文件删除至getshell
1,文件module\admin\db.php( 数据库操作相关)
没有任何过滤,直接拼接路径删除。但是有csrf防御。
2,文件 module\admin\moban.php(模板操作相关)
也是等同于没有任何过滤,有csrf token防御。
再看看安装文件的逻辑。
将配置参数写入到配置文件中,直接写入,没有任何过滤,可以通过重装的方式直接getshell。(动作太大了)
0x03 更新
更新一下吧,有几个小问题。
一个是前台的任意用户密码重置,犯了最常见的用户密码重置的错误之一,直接把token返回到前端了。
当然,这个在实际环境颇为鸡肋,需要知道用户的用户名和邮箱(且这套系统的普通用户登录时不需要验证码的,直接爆破就好了)
文件:/module/user/do.php
而其实这里是我之前在找头攻击的时候无意之中发现的。
这里也是存在着host头攻击的,找回密码的方式用的是链接的方式,存在着头攻击。
文件:/module/user/do.php
这里要提一下头攻击的问题。可以参考林林总总的Host Header Attack这篇文章与及p牛提攻击《LNMP架构Web应用的几个小Tricks》提到的nignx+php获取host头的Tirck。
当环境是apache+php的时候,p牛没有说明,我自己测了一下,总结下来就是
apache 解析host头的时候取得是最后一个,而PHP通过$_SERVER['HTTP_HOST']取到的host头为所有的,用逗号隔开。
比如存在多个Host头的时候,
Host: www.phpshe.cc Host: www.unkown.com
此时apache 取得的Host是www.unkown.com,而php 通过$_SERVER['HTTP_HOST']取到的host头的值为:www.phpshe.cc,www.unkown.com。
无论是apache 还是nginx 都是可以配置多个server的,当它们找不到server的时候都会发送给默认的server进行处理。而这个默认的server是指在配置文件中排列较前的server配置。
所以这里的头攻击,倘若是apache+php的模式的话,主机上必须只能架设目标网站一个server,否则就会失效。
还有就是后台管理登录处无视验证码直接爆破。
看到文件/module/amdin/do.php, 后台登录代码:
整个逻辑判断竟然是先去数据库里面去匹配用户名和密码,如果用户名和密码正确,才判断验证码。那么完完全全可以无视验证码了。
当用户名和密码正确的时候,验证码错误时返回验证码错误。
当用户名和密码错误的时候,直接返回用户名和密码错误。
当然这里只是代码的表现,但其实在实际中是看不到这些提示的,实际操作后发现可以通过返回包中是否是直接跳转到admin.php来判断。
当用户名和密码错误的时候,跳转回登录页面继续登录。
当用户名和密码正确的时候,直接跳转到admin.php
0x04 总结
看了很久这个程序,没有审出什么来,写个总结吧!
死磕了很久,依旧没有发现比较严重的问题,颇为鸡肋。
想寻找几个经典案例感觉都挺难的,菜鸡仍需努力啊!