zoukankan      html  css  js  c++  java
  • [代码审计]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,文件moduleadmindb.php( 数据库操作相关)

    没有任何过滤,直接拼接路径删除。但是有csrf防御。

    2,文件 moduleadminmoban.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 总结

    看了很久这个程序,没有审出什么来,写个总结吧!

    死磕了很久,依旧没有发现比较严重的问题,颇为鸡肋。

    想寻找几个经典案例感觉都挺难的,菜鸡仍需努力啊!

  • 相关阅读:
    matlab 工具箱下载地址
    P3022 [USACO11OPEN]Odd degrees G
    P1052 过河 【dp】
    P1156 垃圾陷阱
    P1063 能量项链 【区间dp】
    P1026 统计单词个数 【dp】
    P1541 乌龟棋【记忆化搜索】
    P1736 创意吃鱼法 【dp】
    单调队列优化多重背包 洛谷P1776 宝物筛选
    单调队列 洛谷P1886 滑动窗口
  • 原文地址:https://www.cnblogs.com/r00tuser/p/8445289.html
Copyright © 2011-2022 走看看