저번 시간까지 SQL Injection에 대해 알아보고 공부해보았습니다.
이번 시간 공부시작전에 SQL Injection 모의해킹 실무에서 주의할 점 몇가지만 알아보고 시작하겠습니다.
1. insert, delete, update 구문은 웬만하면 사용하지 않습니다.
- 위의 SQL 문법들은 데이터에 대하여 삽입, 삭제, 수정하는 구문으로 사용하면 실제 서비스하는 웹의 데이터를 건드릴 수 있기 때문에 사용하지 않는 것을 좋습니다.
만약, 위의 구문들로 SQL Injection이 가능할 것 같더라도 잘 안 쓴다고 하며, 만약 사용해야한다면 조심 또, 조심하며 and 구문과 함께 사용해주면 좋습니다.
2. 위의 구문들 사용 시 or, 주석은 웬만하면 사용하지 않습니다.
- or 구문을 사용하면 모든 데이터에 대해 데이터가 변조될 수 있고, 주석을 사용하면 어떻게 작동할 지 예측이 어렵기때문에 or, 주석은 사용하지 않는 것이 좋습니다.
3. Time based Blind SQL Injection
이 기법은 시간지연을 발생시켜 참일 경우와 거짓일 경우의 결과의 응답시간차이로 참과 거짓을 구별하여 Blind SQL Injection을 실시합니다.
이때, 강제로 서버에 시간지연을 발생시키므로 실제 서비스하는 웹에 무리를 줄 수 있어 이 기법도 웬만하면 사용하지 않는 것이 좋다고 합니다.
이제 이번 시간에 할 XSS공격에 대해 알아보겠습니다.
XSS(Cross-Site Scripting) 는 크로스 사이트 스크립팅의 줄임말로 보통 편하게 부르기 위해 '크사' 라고 부릅니다.
SQL Injection 공격은 우리가 만든 질의문을 서버측에서 이미 만들어져있는 질의문에 삽입하는 공격으로 즉, 서버측에 SQL 을 삽입하는 공격입니다.
하지만 XSS는 클라이언트 측에 스크립트를 삽입하는 공격입니다.
클라이언트 측에 스크립트를 삽입하는 공격??
대상이 클라이언트이기 때문에 피해자는 해당 웹을 이용하는 모든 이용자가 됩니다.
그럼 어떻게 이용자들에게 스크립트를 삽입할까요??
이용자는 웹 서버로부터 요청한 파일을 전달 받습니다. 이때 전달 받는 파일에 스크립트를 삽입시켜놓는 것 입니다.
이때 삽입한 스크립트가 이용자의 브라우저에서 스크립트가 실행되어 이용자를 공격자가 원하는 동작을 하게 만듭니다.
그렇기 때문에 프론트엔드 코드인 HTML, CSS, JavaScript를 브라우저에서 실행하다가 발생하게 됩니다. 또한, 삽입한 스크립트가 어떤 코드냐에 따라 실행할 수 있는 동작이 엄청나게 많아지며 위험 정도도 달라질 것입니다.
보통 삽입하는 스크립트 코드는 자바스크립트로 작성하기 때문에 자바스크립트 공부도 하면 좋을 것 같습니다.
즉, XSS의 공격은 스크립트를 삽입해서 이용자의 브라우저에서 실행되게 한다!! 라고 이해하면 좋을 것 같습니다.
그럼 이제 스크립트를 삽입했을 때 이용자의 브라우저에서 실행되어 위험하다는 것은 알았고,
어떻게 스크립트를 삽입해야하는 지 알아보겠습니다.
1. 스크립트를 서버에 저장해두고 이 스크립트를 불러오면서 이용자의 브라우저에서 실행되게 합니다.
스크립트를 서버에 저장한다?? 예를 들어 게시글을 작성하고 이용자들이 작성한 게시글을 확인할 수 있는 페이지가 있습니다.
우리가 게시글에 스크립트를 작성하면, 서버의 데이터베이스 어딘가 작성한 게시글을 저장해놓기 때문에 이용자들이 작성한 게시글을 확인할 수 있을 것입니다.
그래서 우리가 스크립트를 적은 게시글에 다른 이용자들이 들어오면 서버에서 우리 스크립트를 이용자(피해자)측 브라우저에게 전달해주고 브라우저는 게시글에 스크립트가 있어 해당 코드를 실행하게 되는 것입니다.
이렇게 서버에 스크립트를 저장하여 스크립트를 실행시키는 것을 Stored XSS 라고 합니다.
XSS에서도 절차가 있어 절차를 따라가면서 하면 좀 더 수월하게 공격이 가능한지 확인할 수 있습니다.
1) 작성한 데이터가 화면에 응답되는 것 확인
위의 사진처럼 게시글을 작성하고 게시글을 확인하는 페이지가 있습니다.
게시글을 작성하면 제목과 내용을 입력받아 post요청으로 데이터를 보내고 게시글 작성을 할 수 있습니다.
우리가 입력한 데이터가 이 웹 서비스 어딘가 출력되는 지 확인하면 됩니다.
이때도 우리는 버프를 사용해서 확인해주는 것이 좋습니다.
게시글 내용 확인하는 페이지에서 우리가 입력한 test가 출력되고 있습니다.
이러면, 첫번째 조건이 만족하는 것입니다.
이부분을 사용해서 XSS 공격을 할 수 있습니다.
2) 특수문자 사용가능한지 확인
<, ', ", > 이 4가지 특수문자가 사용가능한지만 확인해주면 됩니다.
요청에 <'"> 를 넣어 요청을 보내 결과가 어떻게 나오는지 확인해주면 됩니다.
응답을 확인해보니 제목 부분에는 그대로 <'"> 가 나오고 내용 부분에는 <'"> 이렇게 나오는 것을 확인할 수 있습니다.
그러면 제목부분에는 4가지 특수문자 모두 사용이 가능하며, 내용부분에는 <,> 는 사용을 하지 못한다고 생각하시면 됩니다.
특수문자 사용가능 여부도 확인했습니다.
3) 스크립트 삽입
스크립트를 삽입하는 방법은 <script>(실행할 스크립트 코드)</script> 이렇게 작성해주면 됩니다.
html 에서 스크립트를 실행하는 방법입니다. 응답받은 웹 페이지 사이에 우리가 작성한 문자열이 들어가 해당부분을 브라우저가 스크립트구나!하면서 스크립트를 실행하게 되는 것입니다.
내용부분에 <,>를 사용 못하니 제목 부분에 넣어보겠습니다.
우리가 작성한 스크립트가 응답부분에 들어간 것을 확인할 수 있습니다. <script></script>사이에 우리가 실행하고 싶은 코드를 넣어 브라우저가 응답을 해석하다 스크립트로 해석해야하는 부분이네? 이러면서 스크립트가 실행되게 되는 것입니다.
실제로 페이지를 들어가니 우리가 입력한 alert(1)이 실행되어 경고창이 뜬 것을 확인할 수 있습니다.
실무에서 스크립트에 실제로 위험한 코드를 넣어서 취약점을 찾는다면 해당 악성스크립트가 실제 이용자들에게 실행되기 때문에
우리는 이렇게 경고창만 띄우고 해당 코드가 실제로 작동하며 XSS 취약점이 있다는 것만 알 수 있는 alert()를 사용해 줍니다.
그리고 실제로 경고창이 뜨는 것이다보니 나중에 보고서 작성할 때도 보여주기 좋아 많이 사용한다고 합니다.
2. 요청에서 보낸 데이터가 해당 요청 응답에 포함되어 돌아올때 스크립트를 실행시키는 방법
두번째는 서버에 저장하여 응답에 포함되는 방법이 아닌 우리가 보낸 데이터가 해당 요청의 응답에 그대로 포함돼서 돌아올 때 데이터에 스크립트를 삽입하여 응답이 오면서 스크립트가 실행되게 되는 것입니다.
예를 들어, 아이디 중복체크 같은 경우 우리가 입력한 아이디가 사용가능한지 확인하고 결과로 입력한 아이디는 이미 존재하는 아이디 입니다. 즉, 아이디에 test라고 입력하고 결과로 test는 사용 가능한 아이디입니다. 또는 test는 이미 존재하는 아이디입니다.
그리고 우리가 이제 이 입력란에 스크립트를 넣어주면 응답에서 스크립트가 포함되어 오기때문에 실행할 수 있습니다.
이런식으로 우리가 요청에 포함한 데이터가 응답에 그대로 포함돼서 나오는 경우에서 사용하는 방법을 Reflected XSS라고 합니다.
Reflected XSS 도 절차대로 수행해주시면 됩니다.
1) 내가 입력한 데이터가 응답에 포함되는 지 확인
게시판 검색기능에서 만약 입력한 문자에 해당하는 게시글이 없으면 입력한 데이터와 함께 검색 결과가 존재하지 않습니다. 라고 응답을 해줍니다.
여기서 우리가 요청한 응답에 데이터가 함께 포함되어서 옵니다.
Reflected XSS를 할 때는 반드시 내가 요청한 것에 대한 응답에 데이터가 포함되어야 합니다.
버프에서 확인해보면 내가 요청한 test데이터를 해당 요청의 응답에 포함되어 있습니다.
Stored XSS는 데이터를 입력한 곳과 출력한 곳이 다를 수 있지만, 우리가 게시글 작성한 곳과 확인하는 곳이 다른 것처럼
Reflected XSS는 반드시 데이터를 삽입한 곳과 출력한 곳이 같아야한다는 차이점이 있습니다.
2) 특수문자 사용가능한지 확인
응답을 확인해보니 <, ', ", > 중 '," 두가지 밖에 사용 못하는 것을 확인할 수 있습니다.
', "를 사용해서 스크립트를 만들어 주면 됩니다.
3) 스크립트 삽입
스크립트를 삽입하려는데 <, > 를 사용하지 못해 <script>를 작성할 수 없습니다.
하지만 응답을 자세히보면 우리가 요청에 보낸 데이터가 응답의 script부분에 포함되어 있습니다. 그럼 입력한 데이터가 스크립트로 작동한다는 것입니다.
기본적으로 저장되어 있는 스크립트
<script>alert('__입력한 데이터__에 대한 검색 결과가 존재하지 않습니다.');</script>
여기서 SQL Injection 했던 것처럼 문법을 해치지 않고 데이터를 넣어 다른 스크립트도 실행되게 해보겠습니다.
# 1'); alert(' 입력
<script>alert('1'); alert('에 대한 검색 결과가 존재하지 않습니다.');</script>
이렇게 1'); alert(' 을 입력하여 두 가지 alert()로 나눠주면 나중에 응답 때 해당 스크립트가 포함되어 두가지 다 실행하게 될 것입니다.
# 1'); (악성스크립트 삽입) alert(' 입력
<script>
alert('1');
(악성스크립트 실행)
alert('에 대한 검색 결과가 존재하지 않습니다.');
</script>
이제 이 사이에 악성 스크립트를 삽입하게 된다면 alert를 실행하며 악성스크립트 또한 실행시킬 수 있습니다.
Reflected XSS로 스크립트를 삽입할 수 있다는 것은 이해하셨을 것입니다.
근데 왜??? 내가 실행하고 내가 응답받는데 왜 위험한 거지?
다른 이용자에게 스크립트가 실행되어야 하는데 공격자에게서 실행되고 있는 것을 보고있었습니다.
어떻게 이것을 다른 이용자의 브라우저에서 실행시킬 수 있을까요?
바로!! 해당 요청을 이용자가 하게 하는 것입니다.
우리가 스크립트를 포함시킨 요청을 다른 이용자가 하게 하는 것입니다. 즉, 링크를 이용자에게 뿌려 해당 링크를 접속한 이용자에 대하여 스크립트가 실행되게 됩니다.
여기서 링크를 통해서 공격이 이루어지기 때문에 반드시 GET 요청에서 Reflected XSS가 발생하여야 합니다.
요청에서 오른쪽 클릭을 하면 Change request method가 있습니다. 이것을 클릭하면 요청 메소드가 get -> post, post -> get으로 변경됩니다.
실제로 요청을 보내면 응답에서 script 태그 부분에 우리가 생각한대로 들어가는 것을 확인할 수 있습니다.
그리고 오른쪽 클릭 copy url을 사용해서 해당 Reflected XSS 공격을 하는 링크를 복사하여 다른 이용자가 해당 링크로 접속하게만 하면 됩니다.
URL - http://ctf.segfaulthub.com:4343/xss_2/notice_list.php?option_val=username&board_result=1');+alert('>&board_search=%F0%9F%94%8D&date_from=&date_to=
이렇게 링크를 통해 접속하게 되면 우리가 작성한 스크립트가 실행되며 이용자에게 피해를 줄 수 있습니다. (만약, 악성 스크립트이면!)
Reflected XSS의 공격방법은 스크립트를 삽입한 페이지를 피해자 웹 브라우저에서 실행하게 하는 것입니다.
이번 주차에 XSS가 발생하는 이유? 공격 방법? 등을 알아보았고 상황에 대하여 XSS 공격 기법 두가지 Stored XSS, Reflected XSS를 알아보았습니다.
XSS는 발생할 수 있는 곳이 많기 때문에 실무에서도 많이 발생하는 취약점이라고 합니다.
다음 시간에는 이제 실제로 어떤 악성스크립트를 삽입하면 어떤 피해가 발생하는지 알아보겠습니다.
'웹 해킹' 카테고리의 다른 글
웹 해킹 공부 일기장 (XSS 정리) (0) | 2024.01.12 |
---|---|
웹 해킹 공부 일기장 6- 1 (XSS) (0) | 2023.12.29 |
웹 해킹 공부하기 4 - 과제 (0) | 2023.12.16 |
웹 해킹 공부일기장 4 - 과제 (2) | 2023.12.16 |
웹 해킹 공부일기장 4 - 1 (SQL Injection 포인트 찾기) (0) | 2023.12.15 |