๊ธ€ ์ž‘์„ฑ์ž: heogi

Gnuboard 5.4.5.1 ๋ฒ„์ „ ๋ฉ”์ธํ™”๋ฉด XSS ์ทจ์•ฝ์  [KVE-2020-1616]

1. ์ˆ˜์ •๋œ ์ฝ”๋“œ ํ™•์ธ

adm/menu_list_update.php
- ๊ธฐ์กด(5.4.5.1 ver)

$_POST = array_map_deep('trim', $_POST);

$_POST['me_link'][$i] = is_array($_POST['me_link']) ? clean_xss_tags(clean_xss_attributes($_POST['me_link'][$i], 1)) : '';

$code    = is_array($_POST['code']) ? strip_tags($_POST['code'][$i]) : '';
$me_name = is_array($_POST['me_name']) ? strip_tags($_POST['me_name'][$i]) : '';
$me_link = (preg_match('/^javascript/i', $_POST['me_link'][$i]) || preg_match('/script:/i', $_POST['me_link'][$i])) ? G5_URL : strip_tags(clean_xss_attributes($_POST['me_link'][$i]));

 

- ์ˆ˜์ • ํ›„(5.4.5.2 ver)

$_POST = array_map_deep('trim', $_POST);

if(preg_match('/^javascript/i', preg_replace('/[ ]{1,}|[\t]/', '', $_POST['me_link'][$i]))){
	$_POST['me_link'][$i] = G5_URL;
}

$_POST['me_link'][$i] = is_array($_POST['me_link']) ? clean_xss_tags(clean_xss_attributes(preg_replace('/[ ]{2,}|[\t]/', '', $_POST['me_link'][$i]), 1)) : '';

$code    = is_array($_POST['code']) ? strip_tags($_POST['code'][$i]) : '';
$me_name = is_array($_POST['me_name']) ? strip_tags($_POST['me_name'][$i]) : '';
$me_link = (preg_match('/^javascript/i', $_POST['me_link'][$i]) || preg_match('/script:/i', $_POST['me_link'][$i])) ? G5_URL : strip_tags(clean_xss_attributes($_POST['me_link'][$i]));

 

2. ๊ธฐ๋Šฅ ํ™•์ธ

adm/menu_list_update.php๋Š” ๊ด€๋ฆฌ์ž๊ถŒํ•œ์ด ์žˆ์„๋•Œ ๋ฉ”์ธํ™”๋ฉด์— ํ‘œ์‹œ๋  ๋งํฌ๋ฅผ ๊ฑธ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.

๋ฉ”๋‰ด์™€ ๋งํฌ ๋ฐ ์˜ต์…˜์„ ์„ค์ •ํ•˜๊ณ  ์ถ”๊ฐ€ํ•˜๊ฒŒ๋˜๋ฉด ๋ฉ”์ธํ™”๋ฉด์— <a> ์˜ href ์— ์‚ฝ์ž…์ด ๋˜์–ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.

3. ์ฝ”๋“œ ๋ถ„์„

preg_match๋ฅผ ํ†ตํ•œ javascript, script: ํ‚ค์›Œ๋“œ์˜ ํ•„ํ„ฐ๋ง
clean_xss_tag, clean_xss_attribute๋ฅผ ํ†ตํ•œ xss ๊ด€๋ จ ํƒœ๊ทธ์™€ ์†์„ฑ์˜ ์ œ๊ฑฐ๋ฅผ ์šฐํšŒํ•˜์—ฌ ์ง„ํ–‰ํ•ด์•ผํ•œ๋‹ค.

javascript์™€ script: ํ•„ํ„ฐ๋ง์˜ ๊ฒฝ์šฐ HTML Encoding์„ ํ†ตํ•ด ์šฐํšŒํ•˜์˜€๋‹ค.
javascript์™€ script: ๋™์‹œ์— ์šฐํšŒํ•ด์•ผํ•˜์—ฌ ์•„๋ž˜์ฒ˜๋Ÿผ javascript ์‚ฌ์ด์—๋Š” (&#x09;)๊ณต๋ฐฑ, : ๋Š” &colon;์œผ๋กœ ์šฐํšŒํ•œ๋‹ค.

clean_xss_tag์˜ ๊ฒฝ์šฐ xss ๊ด€๋ จ ํƒœ๊ทธ๋ฅผ ํ•„ํ„ฐ๋งํ•˜์ง€๋งŒ preg_match์—์„œ ์ด๋ฏธ ์šฐํšŒ๋œ javascript๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ ์žˆ์–ด
๋ฌด๋‚œํ•˜๊ฒŒ ํ†ต๊ณผ๊ฐ€๋˜์—ˆ๋‹ค.

clean_xss_attribute์˜ ๊ฒฝ์šฐ onclick, onload๋“ฑ ๋‹ค์–‘ํ•œ attribute๋ฅผ ํ•„ํ„ฐ๋งํ•˜์ง€๋งŒ ์œ„ ์ฒ˜๋Ÿผ ๋™์ผํ•˜๊ฒŒ HTML Encoding์„ ํ†ตํ•ด ์šฐํšŒ๊ฐ€ ๋œ๋‹ค.

4. ๊ณต๊ฒฉ ์ฝ”๋“œ

ํ•ด๋‹น ํ•„ํ„ฐ๋ง์„ ์šฐํšŒํ•˜์—ฌ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

java&#x09;script&colon;alert(document.cookie);

์ด๋ฅผ $_POST['me_link']์— ์ „๋‹ฌํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.

 

'๐ŸŒWeb' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Web Server vs WAS(Web Application Server)  (0) 2023.09.29
Broken API Authorization  (0) 2023.08.13
AeroCTF - Localization is hard  (0) 2023.08.13
RCE via Server-Side Template Injection  (0) 2023.08.13
SSTI(Server Side Template Injection)  (0) 2022.01.29