악성 파일 업로드를 통한 Self XSS

Writer 장종민 Program webhacking.kr

WEB Out of scope None No Reward Created: Aug 20, 2021 (3 years ago) Last Updated: Jul 17, 2022 (2 years ago)

Weakness

Self XSS

Description

개요

[취약점 제보에 대한 개요를 작성해 주세요]

재현 과정

[취약점 재현을 하기 위한 과정을 서술해 주세요]

  1. http://webhacking.kr:10006/ 해당 사이트에서 파일 업로드 기능을 지원합니다.
  2. 해당 사이트에서 기능적으로(?) command injection이 가능함으로 ls를 통해 config.php, index.php 파일이 존재하는 것을 확인할 수 있으며 cat을 통해서 해당 파일을 읽어 올 수 있습니다.
    image.png
  3. index.php 파일에서 취약점이 존재하는데 해당 부분의 코드를 확인하면 사용자가 입력 가능한 인자인 memo와 file_name들 모두 addslashes 함수를 통해서 sql injection을 방어하고 있습니다.
if($_POST['memo']){
    $_POST['memo'] = addslashes($_POST['memo']);
    $file = $_FILES['upfile']['name'];
    $file = addslashes($file);
    if(preg_match("/\.\.|\//",$file)) exit("hacking detected");
    if($file){
      copy($_FILES['upfile']['tmp_name'],"./upload/".$file);
    }
    mysqli_query($db,"insert into chall48 values('{$_SESSION['id']}',".time().",'{$file}','{$_POST['memo']}')");
  }
  1. 하지만 사용자에게 최종적으로 보여주는 PHP 코드 부분에서 사용자의 상위 20개의 뽑아낸 데이터를 출력을 하며 memo의 경우 htmlentities 함수를 통해서 escape를 해주지만 file_name의 경우 session_id와 동일하다면 escape를 하지 않은 데이터를 출력하게 됩니다.
  $result = mysqli_query($db,"select * from chall48 order by time desc limit 0,20");
  while($row = mysqli_fetch_array($result)){
    $icon = crc32($_SESSION['id'])%8+1;
    $timestamp = $row['time'];
    $date = date('H:i:s',$timestamp);
    echo "<table border=0><tr onmouseout=this.style.background='white' onmouseover=this.style.background='silver'><td>{$date}</td><td align=center><img src={$icon}.jpg><br>{$row['id']}</td><td width=500>".htmlentities($row['memo'])."</td>";
    if($row['id'] == $_SESSION['id'] && $row['up']) echo("<td>[<a href=./upload/{$row['up']}>upload file</a>]</td>");
    if($row['id'] == $_SESSION['id']) echo("<td>[<a href=?mode=del&time={$timestamp}>Delete</a>]</td>");
    echo "</tr></table>";
  }
  1. 위 코드를 분석하면 최종적으로 파일 이름이 "> <img src='#'>이라면 img Tag Injection을 성공하게 됩니다.
    image.png
  2. 버그를 트리거 하기 위해 하나 더 알아야 할 부분은 사용자가 입력한 파일 이름에 /가 들어가게 된다면 경로가 잘리게 됩니다. 이를 우회하기 위해서 script tag 대신 img 태그를 이용하여 "> <img src='#' onerror='alert(`XSS`)'>를 입력하면 XSS가 트리거됩니다.
    image.pngimage.png

예상되는 취약점 발생 원인

[해당 취약점이 발생하는 예상 원인을 서술해 주세요]
file_name에 대한 escape 미흡

패치 방법

[해당 취약점을 패치하기 위한 대응 방법을 서술해 주세요]
file을 출력하는 부분에도 htmlentities 함수를 적용합니다.

예상 결과 및 파급력

[해당 취약점으로 인해 예상되는 결과 및 파급력을 서술해 주세요. 시나리오가 포함되어도 좋습니다.]
자신에게만 적용되는 xss라 큰 파급력은 존재하지 않지만 만약 코드 수정을 통해서 모두에게 보여지도록 설정할 수 있다면 파급력이 커지게 됩니다.

기타사항 및 레퍼런스

[그 외에 추가할 내용이 있다면 이곳에 작성해주세요.(스크린샷, 로그 등)]

  • [첨부파일 / 레퍼런스]

Timeline

장종민 submitted ticket. August 20, 2021 (3 years ago)
rubiya MANAGER changed the status from 'Submitted' to 'In Progress'. August 21, 2021 (3 years ago)
rubiya MANAGER changed the severity from 'Low' to 'None'. August 21, 2021 (3 years ago)
rubiya MANAGER changed the status from 'In Progress' to 'Out of scope'. August 21, 2021 (3 years ago)
rubiya MANAGER changed the disclosure from 'Closed' to 'Disclosed (Full)'. August 21, 2021 (3 years ago)
rubiya MANAGER posted a comment. August 21, 2021 (3 years ago)

사용자 개입을 과도하게 요구하여 악용 가능성이 낮은 취약점으로 판단하여 Close하겠습니다.

장종민 posted a comment. August 21, 2021 (3 years ago)

넵 감사합니다.