취약점 유형
Self XSS
상세내용
개요
[취약점 제보에 대한 개요를 작성해 주세요]
재현 과정
[취약점 재현을 하기 위한 과정을 서술해 주세요]
- http://webhacking.kr:10006/ 해당 사이트에서 파일 업로드 기능을 지원합니다.
- 해당 사이트에서 기능적으로(?) command injection이 가능함으로 ls를 통해 config.php, index.php 파일이 존재하는 것을 확인할 수 있으며 cat을 통해서 해당 파일을 읽어 올 수 있습니다.
- 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']}')");
}
- 하지만 사용자에게 최종적으로 보여주는 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>";
}
- 위 코드를 분석하면 최종적으로 파일 이름이
"> <img src='#'>
이라면 img Tag Injection을 성공하게 됩니다.
- 버그를 트리거 하기 위해 하나 더 알아야 할 부분은 사용자가 입력한 파일 이름에
/
가 들어가게 된다면 경로가 잘리게 됩니다. 이를 우회하기 위해서 script tag 대신 img 태그를 이용하여"> <img src='#' onerror='alert(`XSS`)'>
를 입력하면 XSS가 트리거됩니다.
예상되는 취약점 발생 원인
[해당 취약점이 발생하는 예상 원인을 서술해 주세요]
file_name에 대한 escape 미흡
패치 방법
[해당 취약점을 패치하기 위한 대응 방법을 서술해 주세요]
file을 출력하는 부분에도 htmlentities 함수를 적용합니다.
예상 결과 및 파급력
[해당 취약점으로 인해 예상되는 결과 및 파급력을 서술해 주세요. 시나리오가 포함되어도 좋습니다.]
자신에게만 적용되는 xss라 큰 파급력은 존재하지 않지만 만약 코드 수정을 통해서 모두에게 보여지도록 설정할 수 있다면 파급력이 커지게 됩니다.
기타사항 및 레퍼런스
[그 외에 추가할 내용이 있다면 이곳에 작성해주세요.(스크린샷, 로그 등)]
- [첨부파일 / 레퍼런스]
사용자 개입을 과도하게 요구하여 악용 가능성이 낮은 취약점으로 판단하여 Close하겠습니다.