Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

/bbs/member_confirm.php 에서 url 파라미터에 검증 미스로 인해 Open Redirect 취약점 발생 #126

Closed
me2nuk opened this issue Nov 3, 2021 · 2 comments

Comments

@me2nuk
Copy link

me2nuk commented Nov 3, 2021

gnuboard5/lib/common.lib.php

Lines 3282 to 3343 in de9ba8d

function check_url_host($url, $msg='', $return_url=G5_URL, $is_redirect=false)
{
if(!$msg)
$msg = 'url에 타 도메인을 지정할 수 없습니다.';
$p = @parse_url($url);
$host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']);
$is_host_check = false;
// url을 urlencode 를 2번이상하면 parse_url 에서 scheme와 host 값을 가져올수 없는 취약점이 존재함
if ( $is_redirect && !isset($p['host']) && urldecode($url) != $url ){
$i = 0;
while($i <= 3){
$url = urldecode($url);
if( urldecode($url) == $url ) break;
$i++;
}
if( urldecode($url) == $url ){
$p = @parse_url($url);
} else {
$is_host_check = true;
}
}
if(stripos($url, 'http:') !== false) {
if(!isset($p['scheme']) || !$p['scheme'] || !isset($p['host']) || !$p['host'])
alert('url 정보가 올바르지 않습니다.', $return_url);
}
//php 5.6.29 이하 버전에서는 parse_url 버그가 존재함
//php 7.0.1 ~ 7.0.5 버전에서는 parse_url 버그가 존재함
if ( $is_redirect && (isset($p['host']) && $p['host']) ) {
$bool_ch = false;
foreach( array('user','host') as $key) {
if ( isset( $p[ $key ] ) && strpbrk( $p[ $key ], ':/?#@' ) ) {
$bool_ch = true;
}
}
if( $bool_ch ){
$regex = '/https?\:\/\/'.$host.'/i';
if( ! preg_match($regex, $url) ){
$is_host_check = true;
}
}
}
if ((isset($p['scheme']) && $p['scheme']) || (isset($p['host']) && $p['host']) || $is_host_check) {
//if ($p['host'].(isset($p['port']) ? ':'.$p['port'] : '') != $_SERVER['HTTP_HOST']) {
if ( ($p['host'] != $host) || $is_host_check ) {
echo '<script>'.PHP_EOL;
echo 'alert("url에 타 도메인을 지정할 수 없습니다.");'.PHP_EOL;
echo 'document.location.href = "'.$return_url.'";'.PHP_EOL;
echo '</script>'.PHP_EOL;
echo '<noscript>'.PHP_EOL;
echo '<p>'.$msg.'</p>'.PHP_EOL;
echo '<p><a href="'.$return_url.'">돌아가기</a></p>'.PHP_EOL;
echo '</noscript>'.PHP_EOL;
exit;
}
}
}

gnuboard5 에서 로그인 세션을 가지고 있는 경우 /bbs/member_confirm.php 에서 ?url= 파라미터에

아래와 같은 poc로 요청을 하면 www.google.com 으로 이동하게 됩니다.

대신 //@localhost:80이 붙어 not found가 뜨지만 먼저 원하는 URL로 이동할 수 있다는 점을 이용하여 쉽게 HTTP 상태 코드 200 처리를 하여 Open Redirect 취약점을 발생시킬 수 있습니다.

POC : http://gnuboard_url/bbs/member_confirm.php?url=https://www.google.com\@localhost:80

http://gnuboard_url/bbs/member_confirm.php?url=[http/https]://[이동하고 싶은 URL]\@localhost:80

@gnuboard
Copy link
Collaborator

gnuboard commented Nov 4, 2021

Open Redirect 취약점을 알려주셔서 감사합니다.

https://github.com/gnuboard/gnuboard5/commit/73e20e7594172dc0bee2f19ac6835f5ad709461b 73e20e7

이런 방식으로 해결하면 될까요?

@me2nuk
Copy link
Author

me2nuk commented Nov 4, 2021

테스트 했던 POC로는 확실하게 막히네요 추가로 취약한 부분이 생기면 또 제보 드리겠습니다!

@me2nuk me2nuk closed this as completed Nov 17, 2021
kkigomi pushed a commit to kkigomi/gnuboard5 that referenced this issue Jul 12, 2024
암호화된 이용자 확인(CI) 추가
kkigomi pushed a commit to kkigomi/gnuboard5 that referenced this issue Jul 12, 2024
…ount

refactor: 알림 아이콘을 표시하기 위해 낭비되는 요청 제거
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant