文件读写漏洞,是黑帽SEO技术、web渗透测试中广泛应用的基本漏洞,利用好,可以威力无穷。
原理:某个文件目录对用户权限没有进行降权或者限制,通过将精心构造的文件放置在目录下,利用R/W/E权限进行渗透。 精华: (1)利用上传文件后缀名不过滤漏洞上传执行文件; (2)利用执行权限漏洞执行文件; (3)利用读取权限漏洞回溯上级目录; (4)利用php弱类型语言特点,得到关键源码,并进行分析推出项目结构; (5)利用.svn和php业务信息推出源码项目名称和svn外网路径。 案例如下: 团队在做个JavaEE项目,上头要我们参考一个电商erp系统,目标www.demo.com的业务流程,分配模块设计电商erp系统功能流程、数据表结构等文档了,整天就写文档了。。。这表关联有点多呀,就想着如果能拿到源码或者数据库表设计,有了现成那就不用辛苦的建表了。
首页有个登录页面,不过下面算叫社工了吧,假装成要买软件的顾客来考察,让客服开了一个帐号出来,这步就跳过了。 有了帐号,登录进去大概浏览了下那个网站,功能比较杂,前台用户并没有管理员权限。因为看到有商品图片了,想着会不会没有过滤直接能上传webshell,看来看去,就找到个图片管理。
里面有个上传文件的功能,可是图片没有回显绝对地址,而且变成个文件服务器,到另一个子域名去了。
访问的图片链接如下,不是直接访问文件地址。 http://tupian.demo.com/index.php?xxxxxxx&image=xxxxxxxxxxxxxxxxx.jpg 考虑这个子域名上(Server)会不会解析脚本,能不能顺利上传,也不知道绝对路径,再说也不是主站。
就先尝试下,抓包后改后缀为php,此时发现php文件是能够上传的,但仅有Response的数据并不能获知文件的web地址。
但是仔细观察这个image参数,感觉会不会能读取文件,测试后的确存在任意文件读取漏洞,00截断不管用,但是用../跳到上一层,可读出index.php代码。
又根据这个源码继续读出几个文件出来,比较关键的有数据库的配置信息,可惜这个还不能外连。
为了知道上传的绝对路径,看了index.php的逻辑,找到controller层的目录
传递进$m变量,进而加上m前缀就可以读出上传和读取图片功能的源码,如下图所示。其中显示图片只是简单的处理url参数并拼接固定的上传目录xxx,调用file_get_contents来echo输出
根据参数裁剪几位 再跟编号组合,取得最终的地址字符串。
浏览器访问下计算出来的路径,还好不像之前遇到的,这个能解析,接下来很轻松就能getshell了。
(前面两个请求500错误的是因为shell代码出错,本还以为不能用的,自己另外写了个php一句话就行了)
然后在shell上先做好一些清理工作,接下来想直接连mysql,看出当前用户权限不算大,但能看一堆看起来能外连的帐号,有部分的mysql5密码能解出,只有部分库有访问权限,这种情况下必要时候可以收集。
在服务器上找到nginx.conf,看了里面的虚拟路径映射,也确定主站不在这台服务器上
翻了翻也没什么好看的。 主站一堆增删查改的操作,也没明显的注入什么的,旁站查询了下也就多了些wiki站,没多少功能 简单扫下主站目录得出几个文件
但是后面在webshell中居然看到了那个图片服务器上存在.svn,进而猜想主站会不会也有。
可是无法访问svn文件,用源码泄漏工具也下载不了
然而在webshell打开svn文件,发现了一个可连外网的svn仓库地址。。。里面只有帐号名,不过配合之前的mysql.user等也好猜密码。
这个地址似乎是共用的,但尝试跳转上一级去访问svn根目录就会拒绝访问,也就是说要想获得主站的svn源码也许得猜对目录名
思索了一会目录命名规则,主站总猜不到,倒是猜到一些其他的web项目。
先把svn中能导出来导出来研究下
看了之后研究了下命名规则,辛运的是之前在主站扫描目录出来info.php就派上用场了,这个文件正好是phpinfo能获取到主站的web路径,这样配合就猜解到svn目录了,顺利导出主站全部源码。
虽然已经导出源码了,不过抱着学习的态度,可以继续尝试getshell下。
手上有了源码就稍微审计了下php,就项目结构来看,另有一套admin管理系统也在一个子域名,web项目分出多个文件夹,这个后台上传文件功能,有效验后缀,白名单验证重名,短时间也没找到包含、文件处理什么的问题,主要看看有没有高危函数的调用。
浏览看了半天源码,
还好找到个转化html文件的功能,发现里面居然调用到了exec,部分参数可控,存在命令注入。
调用wkhtmltopdf程序转化pdf。
URL是调用其他方法获取的,从这里可以看出利用点$params可控的地方有个companyId。
感谢info.php爆出了路径,这样直接就可以写shell了。构造闭合参数,使用urlencode,执行命令,写了个eval小马。
不过不知道是否是WAF什么的原因,写完后刷新几次居然都404了,在传个txt就不会出现这样。(后续感觉可能跟分布式部署负载均衡有关)
后面换了个强一点的一句话,直接echo进去的话,php代码中的$字符会消失,就使用base64从输入流读入解码,-n参数去掉回车符,最终参数大概就弄成这样就行了。 companyId=5555.pdf && echo -n "PD9waHAgJGE9ImFhYWEiO2VjaG8gInpoaXNoaWdlIGNlIHNoaSBkZSBsYSI7Pz4=" | base64 -d > /xxxx/xxxx/xxxx.php && echo 111
主站getshell之后这时候包括svn其实已经能获取所有的源码了,
抱着学习研究的态度,只看了部分模块相关的表结构。 没有做什么破坏,本想自己把漏洞补了,但是文件www用户组写不了,提权暂算了。
|