2023. 5. 18. 10:36ㆍ해킹/XSS
저번 시간에는 http only 속성으로 자바스크립트로 쿠키에 접근하는것을 막았습니다.
하.지.만 여전히 해커가 입력한 자바스크립트는 실행된다는 것이죠. 해킹 방법이 꼭 쿠키만 있느냐는 아닙니다.. 그러므로 악성 스크립트를 아예 막아야됩니다.
케이스를 두가지로 나눠봅시다.
만약 검색창에
1. 사용자 입력값이 스크립트 태그에 들어가지 않는 경우. ex: <p>사용자 입력값</p>
2.사용자 입력값이 스크립트 태그에 들어가는 경우. ex: <script>alert('사용자 입력값')</script>
1번은 사용자 입력값이 p태그 안에 들어가기 때문에 해커는
해커의 입력값 = <script>악성코드</script>
<script>악성코드</script>
이런식으로 스크립트 태그를 추가하는 작업이 필요합니다.
이때, 사용자 입력값이 태그로 인식되는것을 막아버리는겁니다.
<> 태그를 이스케이프 문자로 바꿔주는 작업입니다.
이스케이프 문자란 특수한 문자입니다.
프로그래밍을 해 보셨다면 알 수 있는데요.
만약 print("안녕 나는 "ㅇㅇㅇ" 이야 "); 이렇게 ""큰따옴표 안에 큰따옴표를 넣으면 오류가 생기기에
\와 같은 특수한 문자를 삽입해서 큰따옴표를 출력하잖아요?
그것과 비슷합니다. < 이 태그를 --> < 이것으로 바꿔서 처리합니다.
즉 문자로 인식하게되고 태그 적용이 되지 않습니다.
그렇다면 아무리 해도 <> 이 태그가 막혀버리니까 스크립트가 실행이 되지 않습니다.
한번 실습을 해 봅시다.
board/list.php의 하단의 else문을 바꿔줍니다.
else{
echo"<script>alert('$search" . " no result ');</script>";
}
else{
echo"<p>no search results for $search </p>";
}

이제 여기에 스크립트 태그를 넣어봅시다.

스크립트가 정상적으로 실행됩니다.
이제 태그를 이스케이프 문자로 바꿔주는 작업이 필요합니다.
php 코드를 봅시다.
<?php
$search = $_GET['search'];
$encoded_text = htmlspecialchars($search);
if($search){$sql = "select * from board where title like '%$search%'";}
else{$sql = "select * from board";}
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "<a href='read.php?bno=" . $row['bno'] . "'>" . $row['title'] . "</a>";
echo "<br>";
}
}
else{
echo"<p>no search results for $encoded_text </p>";
}
?>
이렇게 htmlspecialchars를 통해 태그를 이스케이프 문자로 변경해주는 작업을 해 줍니다.
한번 다시 script를 출력 해 봅시다.

스크립트가 실행이 되지 않고 문자로 출력되네요!
하지만 이것은 스크립트 태그 안에 사용자 입력값이 들어가지 않을뿐..
아까 전 처럼 사용자 입력값이 스크립트 태그 안에 있으면 까다로워지겠죠.
다음에 고쳐봅시다.
'해킹 > XSS' 카테고리의 다른 글
게시판 Reflected XSS 공격과 취약점 고치기 - 3 (0) | 2023.05.20 |
---|---|
게시판 Reflected XSS 취약점 고치기 1 (0) | 2023.05.16 |
게시판에 Reflected XSS 공격 해보기 (0) | 2023.05.15 |