没有标题的渗透
2020-12-13 16:13:37 Author: forum.90sec.com(查看原文) 阅读量:309 收藏

一切的故事都源自一条大晚上qq消息

image


我当时正在看一套.net程序然后这个逼大晚上找过来,想着直接睡觉不回的,怕我师傅第二天打我。

image

拿到源码直接拖进Sublime Text(很多人问代码审计应该用编辑器方便,只要你想,记事本都可以挖洞。)

image

审thinkphp,我喜欢先看版本然后方便快速定位漏洞

image

还有就是看TP的common.php这种类似文件,有无使用全局函数

protected function _get_where(){
        $data = param_filter($_GET, array("mobile","realname","status","uid","start_create_time","end_create_time","card_id","status"));
        
        
        $where = "1";

        if(is_set($data, 'mobile')){
            $where .= " AND mobile='".$data['mobile']."'";
        }
        if(is_set($data, 'realname')){
            $where .= " AND realname like '%".$data['realname']."%'";
        }
        if(is_set($data, 'status')){
            $where .= " AND status='".$data['status']."'";
        }
        if(is_set($data, 'uid')){
            $where .= " AND uid='".$data['uid']."'";
        }
        if(is_set($data,'start_create_time')){
            $where .= " AND create_time>='".$data['start_create_time']."'";
        }else{
            $it = time()-30*6*24*60*60;
            $times = date("Y-m-d H:i:s",$it);
            $where .= " AND create_time>='".$times."'";
        }

通过全局GET获取内容经过param_filter函数

function param_filter($param,$allow,$must=NULL,$filter=false,$notnull=false){
    if(empty($param)) return false;
    $newAllow = $newMust = array();
    $param = (array)$param;
    //判断必须参数
    if(!empty($must)){
        foreach ($must as $k){
            if(!isset($param[$k])) {//没有字段就返回
                return false;//缺少必须字段
            } else {
                $newMust[$k] = trim($param[$k]);//符合要求放在新数组,过滤空格
                if($filter){
                    //$newMust[$k] = htmlspecialchars($newMust[$k]);
                }
                if($notnull){
                    if($newMust[$k] == ""){
                        return false;
                    }
                }
            }
        }
    }
    
    // 过滤无效参数
    if(!empty($allow)){
        foreach($allow as $k) {
            if(isset($param[$k])) {
                //符合要求的字段放在新数组
                $newAllow[$k] = trim($param[$k]);//过滤空格
                if($filter){
                    $newAllow[$k] = htmlspecialchars($newAllow[$k]);
                }
            }
        }
        //请求参数全部都不是允许的字段返回false
        if(empty($newAllow)){
            return false;
        }
    }

    //整合返回数组,相同字段会覆盖
    return $allow = array_merge($newAllow, $newMust);
}

遍历获取指定key的内容,期间未使用任何安全函数之类所以这里可以注入

image

nms

	public function iupload($type="qrcode"){
	
	    $upload = new \Think\Upload();
	    $upload->rootPath  =  "/";
	    $upload->savePath  = "/upload/".$type."/";
	    $filrInfo   =   $upload->upload();
	    if($filrInfo == false){
	        $this -> error = $upload -> getError();
	    }
	    return $filrInfo;
	}

在base内发现了一处上传,跟进upload看看有没针对


发现有针对后缀的白名单处理,瞬间就不美丽。想着TP如何快速getshell


TP很喜欢在Runtime里面缓存模版或者数据缓存之类的。快速函数定位寻找可控点

	public function __construct() {
	    $this->_getConfig();//获取配置文件
	    //读取模板id并缓存
	    //TODO

	    $tmpl = S("TMPL");
	    if(empty($tmpl) || 1){
	        $tmpl = $this->_getTmpId();//获取模板id
	        S("TMPL",$tmpl);
	    }
	    $this->tmpl = $tmpl;

在base文件发现有从数据库取tmpl内容然后缓存写入,都2020年了,很多都支持pdo。直接让他去操作了

image

文章来源: https://forum.90sec.com/t/topic/1462/3
如有侵权请联系:admin#unsafe.sh