반응형
ref
- https://github.com/thorsten/phpmyfaq/commit/128ef85f8e3ab7869d3107aa4d0b6867b53391d7
- https://huntr.dev/bounties/24c0a65f-0751-4ff8-af63-4b325ac8879f
배경
- phpMyFAQ - Open Source FAQ web application for PHP 7+ and MySQL, PostgreSQL and other databases
- phpMyFAQ 는 사용자를 대상으로 하는 FAQ 어플리케이션이다.
- sprintf 로 화면에 표시할때 태그를 포함한 데이터를 입력 가능하다.
분석
- 이 프로그램은 php7 을 기반으로 하고 있다.
- https://github.com/thorsten/phpmyfaq/commit/128ef85f8e3ab7869d3107aa4d0b6867b53391d7 참고하여 코드를 확인하자.
- setComment 에 적절한 태그 sanitize가 이루어지지 않고 데이터를 입력할 수 있다.
//phpmyfaq/ajaxservice.php
->setType($type)
->setUsername($username)
->setEmail($mailer)
**->setComment(nl2br($comment))**
->setDate($_SERVER['REQUEST_TIME']);
- 화면에 표시되는 코드는 다음과 같다.
//phpmyfaq/src/phpMyFAQ/Comments.php
$output .= sprintf(
'<strong><a href="mailto:%s">%s</a></strong>',
$mail->safeEmail($item->getEmail()),
$item->getUsername()
);
$output .= sprintf(' <span class="text-muted">(%s)</span>', $date->format($item->getDate()));
$output .= ' </div>';위의ㅇㅇㅇㅇ
- 위의 코드는 strip_tags를 이용하여 태그를 제거하는 방식으로 수정되었다.
//phpmyfaq/ajaxservice.php
->setType($type)
->setUsername($username)
->setEmail($mailer)
**->setComment(nl2br(strip_tags($comment)))**
->setDate($_SERVER['REQUEST_TIME']);
- Strings::htmlentities 는 적용가능한 모든 html을 entity로 변환한다.
$output .= sprintf(
'<strong><a href="mailto:%s">%s</a></strong>',
$mail->safeEmail($item->getEmail()),
Strings::htmlentities($item->getUsername())
);
$output .= sprintf(' <span class="text-muted">(%s)</span>', $date->format($item->getDate()));
$output .= ' </div>';
→
<?php
$str = "A 'quote' is <b>bold</b>";
// 출력: A 'quote' is <b>bold</b>
echo htmlentities($str);
// 출력: A 'quote' is <b>bold</b>
echo htmlentities($str, ENT_QUOTES);
?>
- sprintf를 사용하여 데이터를 저장 후 변수로 전달한다면 그 전에 화면에 표현이 되는 데이터에 대해 어떤 데이터를 허용할지 검토를 해야한다.
테스트
- 테스트 환경 phpMyFAQ 3.1.11 설치하고 초기 설정을 완료 한다.
- FaQ입력 창에 html 태그를 입력한다.
- html이 적용되어 화면에 보인다.
패치 방법
- 패치 제공 phpMyFAQ ≥ 3.1.12 이상을 설치한다.
반응형