@6번문제
이 사이트 XSS문제들 중 마지막 문제이다.
조금 많이 찾아보고 공부하던 계기가 되었던 문제이다.




(문제 화면)



먼저 페이지가 어떻게 동작하는지 확인해보는게 우선이다.
url 주소를 보니 # 뒤에 있는 경로가 화면에 보이는 것을 확인할 수 있다.



(문제 페이지)



코드를 살펴보니 url을 입력받는데, 여기서 url을 #뒤에 있는 부분을 따로 받아서
아래와 같은 코드에 붙여주어 출력해주고 있는 것을 확인 할 수 있다.



(문제 페이지 코드)



예를들어 #뒤에 abc 라고 입력하면
페이지 화면에 abc가 나올 것이다.



(동작 확인)



abc에서 가져오고 있다 이런 말로 # 뒤에 있는 경로에서 스크립트를 가져와 실행하고 있는 것을 알 수 있다.
문제 힌트를 확인해 보겠다.



(문제 힌트)



문제 힌트를 보니 스크립트 파일을 직접 서버에 올리고 그 경로를 적어주어 해결할 수 없다면 google.com/jsapi?~~~ 페이지를 이용하라고 나와있다.
이 문제를 해결하기 위해 서버까지 올리는건 부담스러우므로 다른 방법을 이용해보자.

찾아본 방법 중 Data Url Scheme라는 방법이 있었다.
데이터를 url 표현으로 바꾸어 주는 것이다.
사용 방법은 data:[자료타입], [데이터] 이렇게 들어간다.
우리는 javascript를 이용할 것이므로 자료타입은 text/javascript 이다.
예를들어 test 라는 문자로 테스트해보자.



(테스트)



test라는 데이터를 표현한 것이다.

스크립트 alert를 표현하면



(script 표현)



위와 같이 된다.
이 데이터를 # 뒤에 붙여주기만 하면 된다.




(스크립트 데이터 전달)





(문제 해결)



이렇게 되면 페이지에서 스크립트가 실행되고 문제를 해결할 수 있다.

문제에서 준 힌트를 살펴보면 스크립트는 아래와 같다.



(스크립트)


callback에 foo라는 값이 전달되어 foo 라는 함수가 스크립트 아래에서 실행되고 있는 것을 확인해 볼 수 있다.
예를들어 내가 abc라고 입력을 하면



(abc 입력)



abc() 라는 함수가 실행된다.

이를 이용해보면 callback에 alert라고 입력을 하게되면


(alert() 함수 실행)



alert() 함수가 실행된다.

이 소스스크립트를 이용하면 위 경로의 주소를 복사해서 #뒤 경로로 적어주면 된다.
http://는 필터링 하고있으므로 Http:// 이렇게 대소문자를 섞어 써주면 필터링을 못하게 되어있으므로 우회할 수 있다.



(문제 해결)




6번문제 까지 모두 푸니 마지막으로 아래와 같이 축하(?)의 페이지가 뜬다.


(축하의 페이지)

'WarGame > XSS Game' 카테고리의 다른 글

XSS GAME - level 5  (0) 2017.04.03
XSS GAME - level4  (1) 2017.04.01
XSS GAME - level3  (0) 2017.03.31
XSS GAME - level2  (0) 2017.03.31
XSS GAME - level1  (0) 2017.02.15



@5번 문제

DOM에 스크립트를 삽입하지 않고 XSS 공격을 하는 문제이다.



(문제 화면)



여기서 Sign up 을 클릭해보면
아래와 같이 나온다.




(Sign up 화면)



여기서 URL을 잘 보면 next라는 변수에 confirm이라는 값이 들어가 있는 것을 확인 할 수 있다.
이따 코드를 보면서 이 부분이 어떤 역할을 하는지 확인 할 필요가 있다.
우선 이 페이지가 어떻게 동작하는지 확인해보자 이메일을 적고 Next를 눌러준다.



(Next 눌러준 화면)



그 다음 페이지 화면으로 시간이 조금 있으면 다시 원래 페이지로 돌아간다.
코드로 signup 페이지를 확인해본다.



(signup 페이지 코드)



코드를 보면 우리가 클릭하는 Next 버튼이 링크 태그로 걸려있는 것을 확인 할 수 있다.
또 링크 주소가 next 변수의 값으로 전달되고 있는 것을 확인 할 수 있다!
즉, 우리가 next변수 값으로 스크립트를 전달해 줄 수 있으면 된다.

그렇다면 URL로 스크립트를 전달하는 방법은?



(스크립트)



위와같이 주소창에 javascript: 입력 후 스크립트 코드를 입력해주면


(스크립트 동작)



스크립트가 동작한다.

우리는 이것을 이용하여 문제를 해결할 것이다.
next변수에 javascript:alert('attack'); 값을 전달하여 링크 주소를 세팅한다.





(링크 주소 세팅)



그 후 Next 버튼을 클릭해주면 스크립트가 실행되고
문제를 풀 수 있다.




(문제 해결)






'WarGame > XSS Game' 카테고리의 다른 글

XSS GAME - level 6  (1) 2017.04.03
XSS GAME - level4  (1) 2017.04.01
XSS GAME - level3  (0) 2017.03.31
XSS GAME - level2  (0) 2017.03.31
XSS GAME - level1  (0) 2017.02.15




@ 4번 문제

인젝션 처럼 값을 조작해서 스크립트를 실행하게 하는 문제였다.




(문제 화면)



버튼을 클릭하면 타이머가 동작한다.



(타이머 동작)



3초가 지나고 다시 돌아온다.
잘보면 URL에 timer변수로 3이라는 값이 전달되고 있는것이 보인다.

GET방식으로 변수가 넘어가고있는데 코드를 보면 확인 할 수 있다.




(페이지 코드)



코드를 보면 GET방식으로 timer 변수가 넘어간다.
그래서 URL에 timer=3으로 입력하고 전달해도




(타이머 동작)



타이머가 동작한다.

이제 타이머 페이지의 코드를 보겠다.



(타이머 페이지 코드)



여기서 이미지 태그를 보면 바로 눈치챌수 있다.
바로 onload 부분에 우리가 입력한 timer 값이 들어가게 되니 여기를 잘 조작해서 입력하면
스크립트가 실행되게 할 수 있는 것이다.
{{ timer }} 이렇게가 변수로 입력이 되므로
timer=1');alert('attack
이라고 값을 전달하게 되면
onclick="startTimer('1');alert('attack');" 이렇게 완성되어 스크립트 코드가 실행 될 것이다.



(인젝션)



하지만 동작하지 않았다..
실행된 초 앞에 {{timer}} 값을 보면 1') 까지만 들어갔는데..
; (세미콜론)부터가 입력되지 않은것이다.

문제는 ; (세미콜론)을 URL 인코딩 해서 보내줘야한다. 세미콜론 퍼센트 앤퍼센드 등등
가끔 URL인코딩으로 보내줘야할 때가 있다.
; -> %3B로 바꿔서 입력해주니 아래와 같이
;(세미콜론)으로 잘 전달이 되어 우리가 원하는 {{ timer }} 값이 되었다.



(문제 해결)



그리고 스크립트 코드가 실행되었다.
문제 해결!



'WarGame > XSS Game' 카테고리의 다른 글

XSS GAME - level 6  (1) 2017.04.03
XSS GAME - level 5  (0) 2017.04.03
XSS GAME - level3  (0) 2017.03.31
XSS GAME - level2  (0) 2017.03.31
XSS GAME - level1  (0) 2017.02.15


@3번문제

코드를 잘 살펴봐야했던 문제였다.



(문제화면)





(문제 페이지)



문제 페이지를 보면 이미지 1, 2, 3 버튼을 클릭하면 이미지가 바뀌었다.



(그림변경)



여기서 눈치 챌수 있었던 부분은 url을 잘보면
/frame#2 -> 2번클릭
/frame#3 -> 3번클릭
이런식으로 넘어가고 있다는 것이다.
즉, url에 /frame#3으로 입력을하면



(3번그림)



3번그림이 화면에 나온다.

이제 코드를 들여다볼 차례이다.
코드를보면 html태그를 입력하는 부분이 있다..



(html 코드 추가부분)



이 부분에서 바로 눈치챘다.
Injection에서 늘 하던 거서럼 num 변수에 우리가 원하는 값을 입력하면 된다.
나는 여기서 onerror를 이용할 것이다.
<img src='없는파일.jpg' onerror='onerror("attack")'>를 이용한다.
그러기 위해 frame# 뒤에
5.jpg' onerror='onerror("attack")'>
를 입력해주었다.




(Injection)



그 결과 이미지5는 없으므로 에러가 나고
내가 원하던 스크립트가 실행되게 되었다.




(문제 해결)



이 문제에서는 스크립트 실행이 url로 전달되는 인자에 의해
실행될수 있다는 가능성을 알려주고있다.



'WarGame > XSS Game' 카테고리의 다른 글

XSS GAME - level 6  (1) 2017.04.03
XSS GAME - level 5  (0) 2017.04.03
XSS GAME - level4  (1) 2017.04.01
XSS GAME - level2  (0) 2017.03.31
XSS GAME - level1  (0) 2017.02.15


@레벨2

예전에 풀었지만 올리지 않았던 XSS 문제도 마저 올리도록 하겠다 :)
올리느라 다시한번씩 풀어보면서 기억이 새록새록했다.



(문제화면)



이번 문제는 게시판?형식의 페이지에 XSS 공격을 하는 것이었다.

아래는 문제 페이지이다.




(공격 대상 페이지)



일단, 기본적으로 <script> 구문을 이용해 Injection 하였다.




(XSS Injection)



결과는 실행되지 않았다.
<script> 구문을 필터링 하고 있을 가능성이 있다.
힌트를 보니 onerror를 이용하라고 나와있다.



(힌트)



바로 이게 결정적인 힌트였는데,
HTML에서 태그에서 onerror를 설정하여 실패하였을 때 동작하도록 하게 하는 것이 있다.
비슷한 것들로는
onsubmit -> submit 하였을때
onclick -> click하였을 떄
등 등 그렇다면 error를 낼 수 있는 부분은?

바로 img 태그 사용시 src의 경로에 해당 파일이 없을 때 에러를 낼 수 있다.
예를 들어
<img src=./123(없는경로)/> 태그 사용시 src에 파일이 없으니
onerror를 유발시킬 수 있다.
이를 이용해서




(XSS Injection)



인젝션하면




(문제 해결)




문제가 해결될 수 있다.
여기서 배운 점은
꼭 <script> 태그가 아니더라도 충분히 스크립트 코드를 실행시킬 수 있다는 점이다.
:)


'WarGame > XSS Game' 카테고리의 다른 글

XSS GAME - level 6  (1) 2017.04.03
XSS GAME - level 5  (0) 2017.04.03
XSS GAME - level4  (1) 2017.04.01
XSS GAME - level3  (0) 2017.03.31
XSS GAME - level1  (0) 2017.02.15

저번 글 마지막에서
SQL 인젝션을 막아보았다.
바로 magic_quotes_gpc 설정을 통해서인데
한번 어떻게 막아지나 다시한번 확인해 보겠다.

게시글 내용을 sql injection test글로 수정하는 쿼리로 조작해서
url입력을 한다. 



(SQL Injection)



결과는 물론 실행되지 않았고
로그를 통해 어떤 SQL 명령이 전달되었는지 확인해보자



(로그 확인)



전달된 SQL 명령을 확인해보니 문자열 앞 ' 작은따옴표 앞에 \(역슬래쉬) 가 붙은 걸 확인 할 수 있다.

바로 escape 문자인데 문자열을 나타내는 ' 작은 따옴표의 역할을 벗어나 문자 따옴표 역할을 하게 한다. -> 그렇게 되어 뒷부분이 SQL 명령 문법에 오류로 처리가 되어 SQL 명령이 실행되지 않는 것이다.

이러한 필터링을 우회하는 방법이 있을까?
=> 이러한 필터링은 문자열이 입력되지 못하게 하는 것이다.

* 우회 방법
1) 필터링 되고 있는 문자에 대해서 다른 문자로 대체 가능한 문자를 찾는다.

2) 문자열을 표현하는 또 다른 방법을 이용하는 것이다.
-> mysqld의 내장함수를 이용하는 방법이 있다. (char함수 이용)

char() -> 아스키 코드를 바꿔주는 char 내장함수를 사용하면 ' , " 를 사용하지 않고도 문자열을 입력할 수 있다.

MySQL에서 적용이 되는지 확인해 보겠다.
먼저 char() 함수를 이용하여 문자열이 출력 가능할까?



(문자열 출력)



-> 문자열 출력이 가능하다.

'sql injection haha' 이라는 문자열이 출력 될 수 있도록
아스키코드표를 참고해서 적어준다.
SQL Injection에 사용될 url이다. 



(SQL Injection)



실행 후 로그를 확인해보았다.



(로그)



로그를 보니 우리가 원하는 대로 SQL 명령이 전달 된 것을 확인 할 수 있다.

공격이 잘 성공 됬다면 게시판의 모든 글이 sql injection haha로 바뀌었을 것이다.
뒤에 우리가 where 조건 절을 안주었기 때문에 모든 글에 적용 되었을 것이고
concat을 사용하지 않았기 때문에 글 전체가 바뀌었을 것이다.

확인해보면



(결과)




(결과)



모든 글이 우리가 입력한 문자열로 모두 바뀐 것을 확인 할 수 있다.

그렇다면 이 우회방법을 이용하여 스크립트도 추가할 수 있을까?



(추가할 스크립트)



추가할 스크립트를 아스키코드로 바꾸어 놓았다.

아까와 같이 하지만 우리는 이번에 전체 글이 아니라 19번 글만 적용시킬 것이다. 왜냐하면
전체글에서 팝업창이 뜨면 귀찮을거 같기 때문에...



(SQL Injection url)



실행해보니 19번 글을 클릭할 때 XSS 스크립트가 실행되었다.



(XSS 공격)



소스코드를 보니



(소스코드)



XSS 스크립트가 추가된 것을 확인 할 수 있다.

이렇게 SQL Injection은 XSS 공격에도 이용할 수 있을 만큼 강력한 취약점이다.

이번에 다뤄볼 내용은 Blind SQL Injection이다.

* Blind SQL Injection
-> 소스코드 없이 오직 페이지에 있는 코드 혹은 SQL 명령들의 결과로부터만 공격을 하는 것이다.
-> DB에 들어있는 데이터 중에서 블라인드 데이터, 화면에 보여지지 않는 데이터들을 노출시키는 공격이다.
지금 까지는 우리가 서버에 들어가서 소스코드를 분석하면서 취약점을 분석하였다.
하지만 이번에는 오직 웹 브라우저를 통해서 공격하는 것이다.

먼저 이 공격에 대해 이해하기 위해
Blind Injection에 아주아주 취약한 웹페이지를 만들어보고 그 페이지를 대상으로 공격을 해보겠다.

1) 테스트용 DB
 DB : blind
 table 3개가 필요하다.
 - news: no, title, news
 - fnews: no, title, news, bigo
 - anews : no, title



(DB 생성)




(테이블 생성)




(적절한 데이터 입력)



DB 생성, 테이블 생성, 적절한 데이터까지 몇개 입력해보았다.

이제 이 DB를 이용해 간단한 그리고 취약한 PHP 페이지를 만들것이다.



(PHP 페이지 코드)



웹 페이지에서 확인해보면
no변수를 GET 방식을 통해 전달받으면서 해당 no의 글을 화면에 보여주는 페이지이다.



(웹 페이지 모습)



취약점의 존재 확인방법 : 참 or 거짓을 이용한다.
 1) and 1=1 , and 'a'='a',  and 1  , true false 사용 가능, && 기호(url인코딩값) 사용 가능  (참 이용)
 2) and 1=2, and 0, and False,   (거짓 이용)
 3) or 1=1  ,  || 기호 사용 가능(url인코딩사용해야한다.)
 4) or 1=2
참일 경우 화면에 보여지지만, 거짓일 경우에는 화면에 보여지지 않을 것이다.




(참)




(거짓)



이러한 명령들을 로그에서도 확인해 볼 수 있다.



(로그)



혹은 no의 변수에 1 || 1  을 입력하게 되면
뒤에 1이 항상 참이기 때문에 no=1의 글만이 아닌 1을 포함해서 모든 글을 가져오게 된다.



(1=1 입력)



이렇듯
입력값 조작 을 통해 화면이 다르게 나오면 인젝션 취약점을 의심해 볼 수 있다.
=> 입력값에 의해 쿼리가 사용된다는 것을 의심해 볼 수 있다.

그렇다면 조작할 수 있는 것은 알겠는데
이로써 다른 데이터들을 보려고 한다면 no변수에 입력을 통해 추가적으로 다른 테이블을 검색할 수 있어야한다.
즉, 2개 이상의 쿼리문을 실행시킬 수 있어야한다.
어떻게?

1). ; 을 이용한 방법
; (세미콜론)을 이용하면 여러개의 명령을 동시에 실행 시킬 수 있다.



(두개의 명령 실행)



검색 결과가 2개가 나온 것을 확인 할 수 있다.

하지만 안타깝게도 이 방법은 현재 우리 코드에서 적용하지 못한다. 이유는...
우리가 mysql_query() 함수를 사용하는데 이는 단일 쿼리만 가능하도록 되있는 함수이기 때문이다..
다른데서는 가능할 수 도 있지만, 우리에게는 사용할 수 없다ㅜ

2). union 을 이용한 방법 (이거는 select에서만 사용 가능하다.)
union을 이용하면 추가적인 select 명령을 할 수 있다.



(union 사용)



사용 화면에 보다시피 한테이블에 합쳐져서 나온다.

그렇기 때문에 예상할 수 있는 오류가 있다.
만약 두 개의 쿼리에서 찾는 테이블의 컬럼의 수가 일치하지 않으면??



(에러 모습)



에러가 난다~
news는 컬럼이 3개 이기 때문에 fnews 테이블을 컬럼 3개만 맞춰서 select 명령을 실행 할 수 밖에 없다.
무조건 앞에 있는 테이블을 기준으로 컬럼을 맞춰야한다.



(컬럼 일치시키기)



그렇다면 anews 처럼 2개 밖에없으면??
즉, news 보다 더 적은 테이블을 검색한다면 어떨까?



(오류)



물론 오류난다..

이를 해결하기 위해서는 컬럼을 일치시키기위해 아무값이나 추가해서 컬럼을 추가한다.



(컬럼 일치시키기)



바로~ 이러한 특성을 이용하여
보이지 않는? 테이블의 컬럼의 수를 맞출 수 있다.
현재 우리는 우리가 테이블을 만들었기 때문에 컬럼의 수를 알고 있지만
Blind SQL Injection이다.

우리에게 주어진건 웹페이지 뿐이다.!
이 때 이 화면에 보여지는 테이블의 컬럼의 수 정보를 알아내는 것은
매우 중요하다.
왜냐하면 뒤에 union을 사용하여 추가적인 다른 테이블을 검색해볼것인데
union을 사용하려면 앞의 테이블의 컬럼 수와 일치시켜야하기 때문이다.!

그렇다면 현재 페이지의 DB 컬럼 수를 맞추기 부터 해보자!

* 컬럼의 개수를 아는 방법
컬럼 개수를 아는 방법은 여러가지가 있다.
1. 찍기. (다해보기)
-> 무식한 방법일 수 있지만 확실한 방법이다.

union select 1
union select 1, 2
union select 1, 2, 3
...
쭉 다 해본다.
그렇게 되서 화면에 내용이 나오게되면 바로 그 만큼의 개수가 존재 한다는 것이다.
원리는 위에서 union 할 때 앞의 컬럼의 수와 일치하는 컬럼의 수를 입력해야 된다는 것이다.



(컬럼 수 맞추기)



컬럼 수가 3개 이기 때문에 1, 2, 3 이렇게 3개의 값을 컬럼 정보에 넣었을 때 데이터가 보인다.


(그렇지 않은 경우)



그렇지 않은 경우 SQL 명령에서 오류가 나기때문에 화면에 아무 내용도 보이지 않게 된다.

2) order by 를 이용한 방법
-> 2진 탐색을 이용할 수 있는 방법이다.

select 에서 order by를 이용하면 컬럼의 정보로 정렬을 할 수 있다.



(사용 예시)



그런데 이걸 바로 숫자입력?으로도 정렬을 할 수 있다.



(order by 1)



이 방법의 원리는 이렇다.
=> orber by 10 으로 했는데 안나왔다. -> 컬럼이 10개보다 적다.
 => order by 2 로 했는데 나왔다. -> 컬럼이 2개보다 많다는 뜻이다.




(order by 방법)



이렇게 컬럼의 수를 맞추는 방법까지 알아보았다.

이제 다음 포스트 글에서는 Guessing을 이용해 DB 정보에 더 다가가는 방법에 대해
알아보겠다
:)




오늘은 CSRF 공격을 공부했다.
CSRF는 변존 XSS 공격이다.
CSRF ( Cross Site Request Forgery )
변종 요청 공격이다.
스크립트를 사용하지 않고 html 태그를 사용하여 취약점을 공략한다.

이 공격을 해보기에 앞서서
HTML 코드를 분석해보는 단계부터 연습해 볼 것이다.

관리자 페이지에 들어간다.



(관리자 페이지)



회원 관리를 눌러준다.



(회원 관리 버튼)




여기서 게시판에 회원 가입한 회원들의 정보를 볼 수 있다.
또한 이 페이지에서 회원의 정보, 등급을 바꿀 수 있다.
그렇다면 이 페이지에서 어떤 변수들을 어느 페이지로 전달을 하여
회원 level을 수정할까?




(회원 관리 페이지)



소스보기로 들어간다.

먼저 form 태그를 찾아서 어디로 보내는지 그리고 변수를 확인했다.
보내는 곳은 admin_setup.php 파일이다.



(소스 코드)



(소스 코드)





(소스 코드)



여기 까지 레벨 수정에 필요한 변수들이었고
수정하기 버튼을 잘 보면 onclick으로 move_all() 함수가 설정 되있는 것을 볼 수 있다.
그렇다면 move_all() 함수를 살펴보자.



(move_all() 함수)



exec2에 moveall 이라는 값을 넣어주어 넘겨준다.!

여기까지 정리해보면 필요한 변수와 값은
page=1
group_no=1
exec=view_member
page_num=10
exec2=moveall
cart[] = 2 
movelevel=1 

먼저 GET 방식으로 변경해보겠다.
URL을 통해서 변수를 전달해준다.
admin_setup.php?page=1&group_no=1&exec=view_member&page_num=10&exec2=moveall&cart[]=2&movelevel=1



(url 입력)



(실행 결과)



실행 결과 사용자의 Level이 1로 상승된 것을 확인 할 수 있다.

이번에는 POST방식으로 변수를 넘겨보겠다.
그러기 위해 F12 관리자 모드에서
콘솔에 입력해주면 된다.
document.write("") 으로 입력해주면 페이지를 만들어서 보낼 수 있다.

조작한 Form
<form method=POST>
<input type=hidden name=page value=1>
<input type=hidden name=group_no value=1>
<input type=hidden name=exec value=view_member>
<input type=hidden name=page_num value=10>
<input type=hidden name=exec2 value=moveall>
<input type=hidden name=cart[] value=2>
<input type=hidden name=movelevel value=1>
<input type=submit value=전송>
</form>
이 내용을 전부 한줄로 만들어 보내는 것이 중요하다.
이 내용을 전부 한 줄로 만들어 콘솔에 입력해준다.



(POST 전달)




(Form 페이지)



입력을 하면 Form 페이지가 만들어진것을 확인 할 수 있고
여기서 전송버튼을 누르면 우리가 만들어준 변수들이 그대로
admin_setup.php로 전달되는 것이다.



(실행 결과)



실행 결과 역시 level1로 상승했다. ( 다시 9로 만들어준 상태였다.)

이번에는 회원 설정변경에 들어가서 레벨과 관리자 권한을 수정해보겠다.



(수정할 부분)



소스코드를 열어서 확인해보면



(소스 코드)




(소스 코드)



변경에 필요한 변수들을 쉽게 찾을 수 있다.

이 변수들을 이용해 아까와 마찬가지로
GET방식으로 정리하면
admin_setup.php?exec=view_member&exec2=modify_member_ok&group_no=1&member_no=2&page=1&keyword=&name=normal&level=1&is_admin=1



(GET방식)




(실행 결과)




실행 결과 역시 level1로 상승 되었다.

POST 방식도 아까와 같다.
<form method=POST>
<input type=hidden name=exec value=view_member>
<input type=hidden name=exec2 value=modify_member_ok>
<input type=hidden name=group_no value=1>
<input type=hidden name=member_no value=2>
<input type=hidden name=keyword value=>
<input type=hidden name=name value=normal>
<input type=hidden name=level value=1>
<input type=hidden name=is_admin value=1>
<input type=submit value=전송>
</form>
아까와 마찬가지로 한줄로 만들어서 작성해주면 된다.


(POST 전달)




(Form 페이지)



버튼을 누르면



(실행 결과)



실행 결과 레벨상승과 관리자 권한을 획득할 수 있다.

다시 원래 주제로 돌아가서
오늘은 CSRF를 이용하여 레벨1, 관리자 권한을 획득 할 것이다.
변조 요청으로
HTML 태그 중 <img> 태그를 이용할 것이다.

원리는 이렇다.
<img src=""> src에 우리가 원하는 변수와 값들을 GET방식으로 전달하는 url을 넣을 것이다.
만약
관리자가 이 글을 본다면
관리자의 신분으로 이 변수값들이 서버에 전달되게 되고
그렇게 되면 서버 입장에서는 관리자가 요청한 것으로 착각하게 되어
공격자의 레벨이 1로 상승하고 관리자 권한이 생기게 된다.

공격에 앞서 다시 attack 계정을 일반계정으로 바꾸어 두었다.



(일반 계정으로 전환)



attack 계정으로 로그인 한 후
게시판에 글을 작성한다.
CSRF 공격


(악성 HTML 태그 삽입)



그 후 관리자가 그 글을 읽기 까지 기다린다.



(관리자 확인)



관리자가 확인을 했다면
게임 끝이다.

이제 attack 계정은 관리자 계정이 되는 것이다.




(공격 확인)




이것이 변조 요청 공격
CSRF 공격이다. 바로 XSS의 변종 공격기법이라고 할 수 있다.




XSS 취약점을 공부한 후
이 것에 관해 직접 해보고 싶은 마음에
XSS Wargame을 여기저기 찾아본 결과
구글에서 만든 XSS GAME사이트라는 좋은 사이트를 찾게 되었다.

level1 부터 시작해볼것이다 :)

level1의 화면이다.



(문제 1 화면)



아래의 인터넷 창에서 alert()으로 팝업창을 띄우면 된다는 이야기이다.
스크립트코드로 alert() 코드를 띄운다는 것은
마음만 먹으면 악성 코드도 실행 시킬 수 있다는 것으로
분명 위험한 취약점이다.

먼저 아래 화면에서 Search 버튼을 눌러
사용자의 입력값이 어떻게 전달되는지 확인해보았다.



(전달 방식 확인)



확인해보니
url을 통해 전달되는 GET방식으로 전달 되고 있다.
또 화면에 Enter query here...  는 우리가 기본값으로 전달된 값임을 확인 할 수 있는데

더 정확하게 확인하기 위하여 소스코드를 분석해보았다.



(소스코드 분석)



코드를 보니 query라는 변수에 검색 입력값이 들어가고
화면에 뿌려주는 코드에서 query가 들어간것을 확인 할 수 있다.
이렇게 html코드에 들어가는 변수를 직접 사용자가 건들일 수 있다면
위험한 코드이다.
우리는 이부분을 이용하여 공격할 것이다.

query 변수에 들어가는 검색 입력란에
<script> alert("XSS");</script>
코드를 입력 할 것이다.



(XSS 공격)



검색을 하니 XSS 코드가 삽입되었고
팝업창이 떴다.



(공격 성공)



이렇게 level1은 간단히 넘어갈 수 있었다.



'WarGame > XSS Game' 카테고리의 다른 글

XSS GAME - level 6  (1) 2017.04.03
XSS GAME - level 5  (0) 2017.04.03
XSS GAME - level4  (1) 2017.04.01
XSS GAME - level3  (0) 2017.03.31
XSS GAME - level2  (0) 2017.03.31


XSS( Cross Site Scripting )
- javascript를 이용한 대표적인 취약점이다.
  스크립트로 작성된 코드는 클라이언트의 웹브라우저에서 실행이 된다.

인터넷 웹 화면이 뜨는 과정은 웹 서버에서 우리 앞의 웹 브라우저로 코드가 날라오고 웹 브라우저는 그 코드를 실행하여 화면에 보여주는 것이다. 이 때 넘어오는 값에 스크립트 코드를 넣는 것이다.
 -> 주 타겟 : 불특정 다수(클라이언트)

ex) 예를 들어 게시판에 아래와 같은 글을 업로드 하는 것이다.
<script>alert("공격성공")</script>
(Enter가 들어가면 안된다.)
-> 공격을 하려면 자바스크립트로 원하는 코드를 만들 수 있어야한다.

스크립트 코드가 실행 되는지 확인하기 위하여 alert() 을 사용하여
코드가 실행 된다면 악의적인 코드가 실행될 가능성이 있다고 판단하여
취약점이라고 간주한다.

우리가 만든 제로보드 게시판에 XSS 공격을 해보겠다.



(스크립트 작성)




(게시판 화면)



게시판에 공격자의 글이 올라온 것을 확인 할 수 있다.

만약 이 글을 클릭한다면



(악성 코드 실행)



공격자가 작성한 스크립트 코드가 실행된다.



(글 화면)



글 내용에는 아무 글도 보이지 않는다.
왜냐하면 스크립트코드로 간주되었기 때문이다.

이런 방식으로 게시판 혹은 서버에 저장해두어 다른 사람들이 열람하여
코드가 실행되게 하는 방식을 Stored XSS 라고 한다.

다른 방법으로는 reflected XSS가 있다.

이 방법은 다음 XSS 취약점을 보면서 확인하겠다.
다음 XSS가 가능한 부분은 많지만
그 중에 회원가입란의 아이디 중복체크하는 페이지다.


(중복 체크 페이지)



이 페이지의 주소를 살펴보면
url을 통해서 값이 전달되고 있는 것을 확인 할 수 있는데
이 변수에 스크립트 코드를 넣어 실행하면
바로 실행이 된다.



(url을 통한 스크립트 코드)





(실행 화면)



실행하게 되면 IE에서
XSS를 발견하여 조치를 취해주었다.

우리는 공격을 확인 할 것이므로 잠시 이 설정을 해제해 주도록 하겠다.



(인터넷 옵션)



인터넷 옵션에서 보안탭을 들어간다.




(사용자 지정 수준 클릭)



사용자 지정 설정 수준에 들어가면
아래 부분에 XSS 필터 사용 항목이 있는데
사용 안 함으로 클릭해 주면 된다.



(사용 안함 클릭)



그런 상태로
아까와의 같은 url로 접속을 하면



(실행 화면)



스크립트 코드가 실행 된것을 확인 할 수 있다.

이 방식이 아까 Stored XSS와 다른 점은
저장되는게 아니라 바로 돌아온다. 입력된 그자리에서 실행된다는 것이다.


<script>alert(" target="_blank">http://100.100.100.129/zboard/check_user_id.php?user_id=<script>alert("xss")</script>
 링크를 활용해서 공격할 수 있다.
바로 이런 방법이 reflected XSS 이다.

이 공격을 더 유용하게 만드는 것은 shorten url 이다.
url을 짧게 만들어준다.



(shorten url)



그렇다면
XSS에 대한 대책은 어떤 것이 있을 까?

<script> 문을 게시 글 이외에
어떤 곳에서도 올리지 못하게 해두어야한다.

제로보드의 코드를 조금 수정해 보겠다.
게시판 글을 쓰는 곳에서 코드를 확인해보니
write_ok.php 파일로 데이터들을 전송하는 것을 확인 할 수 있다.



(보내는 곳 확인)



그렇다면
우리가 손봐야할 파일은
write_ok.php이다.



(write_ok.php 수정)



먼저 게시판 글쓰기의 소스코드를 확인해보면
게시 글이 변수 memo를 통해 넘어오는 것을 확인 할 수 있다.



(게시글 변수)



그러므로 우리는
write_ok.php 파일 맨 앞에
<script> 단어가 있으면 XSS 공격으로 간주하는 코드를 추가할 것이다.



(코드 추가)



코드 추가 후 공격을 해보겠다.



(XSS 공격)




(차단)



차단 된 것을 확인 할 수 있다.

하지만 방어가 있으면 다시 또 다른 공격을 하는 법..

이 코드를 우회할 수 있다면? (아주간단하게..)



(우회? 공격)



아주 간단하게 첫 script 를 대문자로 작성했다.



(우회 XSS 공격)




(공격 성공)



공격이 성공했다..
아주 간단하게 성공됬다.

이는 아까의 코드에서 문자열 검색에서 i를 추가해주면
대소문자 전부 체크해준다.



(코드 수정)



그렇게 되면



(우회 공격)




(차단)



간단한 우회도 차단할 수 있게 된다.

하지만 우회하는 방법은 수없이 많다.
그러므로 시큐어코딩(안전한코딩)이 쉬운 일은 아니다..!



+ Recent posts