@ 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


오랜 만에 간단한 웹 문제를 풀어볼것이다.

오늘 푼 문제는 xcz.kr 의 18번문제 웹 문제이다.
아주 아주 아주 기본적인 문제라고 Title에 적혀있다..!

문제 화면이다.



(문제 화면)



설명에 소스보기를 클릭한다!
소스가 나와있다.
보니 php 코드로 이루어져있고
난독화가 되어있다.
변수 이름을 요상하게 지어놓은 것이다.



(소스 코드)



보기 힘드니
Notepad++ 를 받아서 여기서 코드를 확인하였다. (눈이 아프니까)

난독화 또한 풀어주었다.
아래는 난독화 풀은 코드이다.
난독화를 풀었다는 이야기는 내가 보기 쉽게 어려운 변수들을 쉬운 변수이름으로 바꾸어 놓았다는 뜻이다.



(문제 코드)



먼저 눈에 띄는 것은 아래 빨간 박스



(폼 체크?)



여기서 보면 쿠키값 c와 GET방식으로 전달받은 변수 g, 그리고 POST방식으로 전달받은 변수 p가 선언되어있고
이 값들이 비어있으면 Wrong T.T 가 나오게 되어있다.

우선 내가 이 3개의 값을 채워서 넘겨줘야한다는 것을 파악하였다.

쭉 소스코드를 이어서 보면
test function이 있다. 만약 아래에서 이 함수를 쓰지 않으면 무시했겠지만
아래 이 함수를 사용하니까 분석해보았다.



(test function)



이 함수는 변수를 받아서 특정 형태로 변형하는 것이다.
ord 함수는 문자를 아스키 코드로 변환하는 것이다.

ord 함수가 없다면 원래
test 변수가 들어가면
- t - e - s - t 이렇게 출력되는 함수이다.
즉 여기서 t의 아스키 값, e의 아스키값 ... 등으로 변환하여
 - t - e - s - t 값을 출력하는 함수이다.

아래 코드는 확대해서 봐야한다.
conn 이라고 내가 이름지어준 변수인데
위에서 보면
conn 변수는 $g . $cookieval; 으로
GET방식 변수와 쿠키값이 연결된 값이다.
또 twinp 변수는 $twinp = $p;  값으로 p와 같은 값이다.



(소스 코드)



이 코드를 분석하면
conn의 값이 test 함수에 들어가서 출력한 값이 위에 표시된 값인지 또는
twinp의 값이 위에 적혀있는 값인지 체크하여 맞으면 key를 보여준다.

GET 혹은 POST 둘 중 하나의 변수만 맞게 써줘도 되지만
뭐하러!
그냥 두개 다 정답을 보내겠다!

정리하면
conn에는 givemepassword  
twinp에는 keyplz!
의 값이 들어가면 된다.
conn은 g와 cookieval의 값을 연결한 것이므로 작전을 짜면

나는
cookie 값 c = passowrd 를
GET 변수 g = giveme 를
POST변수 p = keyplz! 를
넣어서 보내겠다.

먼저 쿠키 값을 설정할 것이다.
F12에서
아래와 같이 쿠키를 입력한다.



(쿠키 입력)





(입력된 모습)




그리고 POST 방식으로 보내려면
form 태그를 사용해야하므로
form 태그를 만들어준다.



(Form 태그 작성)



그리고 action 변수 url에 g의 값을 GET방식으로 동시에 전달하기 위하여
?g=giveme 를 적었다.
여기서 go 버튼을 누르면 이 값들이 전송되게 Form태그를 만들었다.

이제 이 태그를 한줄로 이어서 아래와 같이 입력해준다. (F12 콘솔에서)



(만들어진 코드)




(코드 입력)



입력하면 아래와 같이 go 버튼이 하나 나온다.



(go 버튼 클릭)



클릭을 하면 우리가 설정해주었던 값들이 전부 전달되고
아래와 같이 Key가 나오게 된다.


(정답 화면)


'WarGame > xcz.kr' 카테고리의 다른 글

xcz.kr - prob21(Web)  (0) 2017.02.24
xcz.kr - porb13 (network)  (0) 2017.02.03
xcz.kr - porb17 (network)  (0) 2017.02.03



설치한 아파치 서버의 기본 웹 홈 디렉터리는
/var/www/html 이다.

여기에 페이지를 만들고 확인 해 볼 것이다.



(기본 웹 홈 디렉터리)



이 위치에 exam.php 파일을 vi 편집기를 통해 만들어준다.



(exam.php 파일 생성)



* php 코드 문법
- php는 <?php  ?> 태그 안에 써준다.

<?php
 echo (출력 명령문)
 .  (문자열과 문자를 연결해주는 연산자 )
?>
변수는 앞에 $를 붙여준다.
string 변수에 문자열을 넣어서 출력해주는 코드를 적었다.



(간단한 PHP 코드)



이 파일을 실행 시키는 방법은 두 가지다.
1. php 실행기를 이용해서 실행한다.
2. 웹 브라우저를 통해 실행한다.

먼저 PHP실행기를 이용해 실행해 보겠다.
#> php exam.php



(PHP 실행한 모습)



두 줄을 적어보겠다.


(PHP 코드)



이 번에는 이 파일을 웹 브라우저에서 실행해보겠다.



(실행 모습)



위 코드는 두 줄로 나오지 않았는데
이건
웹브라우저에서랑 PHP 실행기에서의 명령문이 조금씩 다르다.
웹브라우저에서 줄바꾸는 명령어는 <br> 태그를 사용해야한다.




(<br> 태그 사용)



코드를 수정하고
웹페이지에서 실행하면



(실행결과)



두 줄로 나온다.

웹 페이지에서 변수를 전달하는 방법이 두 가지가 있다. (GET과 POST 방식)
1. GET
2. POST

GET 방식은 URL을 통해 변수를 전달한다.
확인을 위해 PHP 파일에서 GET 변수를 받아오겠다.
GET변수는 $_GET[변수이름] 으로 받아온다.



(php 코드)



URL에서 name변수에 kim을 입력해 전달해보니 kim이 출력되었다.



(실행 결과)



사실
GET이든 POST이든 배열의 형태로 담겨 넘어온다.
GET은 GET[] 배열에, POST는 POST[] 배열에
그리고 인덱스는 변수 이름이 된다.
그래서 GET[name] 에서 name이 인덱스 역할로 값 kim이 나온 것이다.
_GET 배열을 확인하려면
print_r( $_GET ) 으로 확인 하면 된다.




(배열 확인 코드)





(실행 결과)



실행 결과를 보면 변수에 담겨 넘어 오는 값들이
배열의 형태로 전달 되는 것을 확인 할 수 있다.

두 번째 전달 방식인 POST 형태를 확인해 보겠다.
POST는 URL 헤더가 아닌 패킷의 Body에 변수를 담아서 넘겨준다.

그렇기 때문에 url에 표시 되지 않는다.
POST로 전달하는 방법은 HTML의 Form 태그를 이용해서 보낼 수 있는 방법 하나이다.

간단한 Form 태그를 작성했다.



(간단한 Form 태그)




(실행 결과)



여기서 전달 방식을 지정해 줄 수 있는데 먼저
아까 했던 GET방식을 확인해 보겠다.



(method = "GET")



그리고 받아오는 php 파일에서 위에 두줄은 GET으로 아래 두줄은 POST변수에서 받아오도록
작성했다.



(받아오는 페이지)



값을 입력해서 submit 하면
아래와 같이 나온다.



(실행 결과)



위에서 GET으로 보냈으므로 url을 확인해보면
어떤 변수에 어떤 값이 들어가서 전달 되는지 확인 할 수 있다.
또, 아래 두개 POST변수에는 아무 값도 뜨지 않은 것을 확인 할 수 있다.

이번에는 POST로 전달해 보겠다.


(method = "POST")





(실행 결과)



실행 결과를 보면
아래 두 줄만 값이 전달되어 나온 것을 확인 할 수 있다.





* HTTP 패킷의 구조에서
Body가 존재하면 헤더에는
content-type
content size 이 반드시 있어야한다.

HTTP 패킷을 전송해볼 것이다.

HTTP는 TCP 위에서 동작하는 것이다.
이 때 좋은 툴이 있다. NetCat이라는 프로그램이다.
이 프로그램은 TCP 통신을 하는 프로그램이다.

* NetCat
 - telnet과 유사한 프로그램
 - TCP 통신을 할 수 있는 프로그램

1. 리눅스용
 - nmap 패키지에 포함
 - ncat
 - 서버로 실행 가능
 - 클라이언트로 실행 가능

2. 윈도우즈용
 - netcat
 - nc.exe
- 내용은 리눅스용과 같다.

NetCat을 설치할 것이다.
리눅스에서 ncat은 nmap 패키지에 포함되어있으므로 nmap을 설치해준다.




(nmap 설치)



ncat의 옵션을 확인해본다.




(ncat 옵션)



ncat으로 10000번 포트를 listen 상태로 열어둔다.




(10000번 포트 개방)



호스트에서 접속을 해볼 것이다.
윈도우에서는 nc.exe로 실행한다. 뒤에 IP주소와 포트번호를 적어주면 연결이된다.



(연결된 모습)



(리눅스 모습)


텍스트를 주고받을 수 있는 모습을 볼 수 있다.

netcat으로 http 통신을 확인해볼 것이다.
* 네이버에 페이지 요청을 하는 request패킷을 전송해볼것이다!

netcat을 이용해서 아래의 패킷을 보낼것이다. \r\n   캐리지리턴이 꼭 들어가야한다.
한줄 띤것까지 복사해서 보내본다.
-----------------------
GET / HTTP/1.1
Host: www.naver.com

-----------------------



(naver.com 연결)




(http 응답)



http의 웹 코드를 받은 것을 확인할 수 있다.

이제부터 실습을 naver.com에 직접하기는 조금 그러니
http 웹 서버를 리눅스에서 설치해서 그 페이지를 대상으로 패킷을 주고받아 볼 것이다.

리눅스에서 httpd를 설치한다.



(httpd 설치된 모습)



설치된 httpd에서 기본 설정된 페이지는 /var/www/html  에 들어있다.
여기에 기본 페이지 index.html을 만들어줄것이다.



(기본페이지 경로)




(간단한 페이지 작성)



페이지까지 작성을 했으면
웹서버를 실행시켜준다.




(웹서버 실행)



이제 호스트에서 인터넷 브라우저로 접속해본다.




(실험 타겟 페이지)



페이지가 잘 나온 것을 확인할 수 있다.

ncat을 이용해서 아까와 똑같이 get요청을 하여
응답을 받아봤다. 



(응답 모습)





(와이어샤크 분석)



와이어 샤크로 본 모습도 추가했다. 위와같은 메세지를 주고받은 것을 확인 할 수 있다.


여기서 헤더에 구성을 살펴보면 헤더를 이용한 취약점을 발견할 수 있다.

* DDos
 - GET Flooding : 대량의 GET패킷을 보낸다. 서버의 부하를 높인다.
 - CC Attack
   ( CC : Cache Control )
 - GET Flooding은 CC Attack과 함께 같이 사용한다.
 헤더의 Cache-Control에 no cache 등으로 설정해서
 캐시를 쓰지 않겠다해서 서버에 부하를 더 높이기 위한 방법이다.
 

 - Slow attack
1) slowloris attack
 
 - 헤더의 끝을 포함하지 않은 상태로 요청
 - 서버에서는 헤더가 완전히 도착하지 않았다고
    간주하여 세션을 계속 열어둔 상태로 둔다.

2) slow read attack
 -> body가 있어야하기 때문에 GET으로는 못한다.
 - 메세지 Body를 이용한다.

slowloris 공격과 slow read 공격을 직접 해보겠다.

1) slowloris 공격
이 공격은 마지막 캐리지 리턴을 빼서 보내는 것이다. 그렇게 되면
서버는 아직 패킷이 다 오지 않은줄 알고 다음 패킷을 계속 기다린다.
원래 웹서버는 통신이 끝난후 바로 연결을 끊는다.(사용자가 많기 때문에)
하지만 이렇게 계속 열어두게 되면
이런 패킷들이 많다면? -> 서버는 다운될 수 밖에 없다.

파이썬으로 프로그램을 작성했다.



(slowloris 공격 코드)



코드를 보면 50초마다 fake 헤더를 보내주는데
이유는 웹서버가 기다리다가 끊으려고 할 때쯤
헤더인것처럼 하나 더 보내주면 서버는 ' 아! 아직 더 있었구나!' 하고 기다린다.
그러다 또 끊으려고 하다가 또! 아! 더있구나! 하고 이런식으로 계속 기다리게 하는것이다.

와이어샤크로 분석해보았다.




(디도스 공격 패킷)




(웹 서버 포트 창)



웹서버의 포트 상태를 확인하면 ESTABLISHED로 되어있다.
웹서버에서는 이 상태는 비정상적인 것이다. 왜냐하면 웹서버에서는 통신을 하고 바로 끊기 때문이다.
이런 상태로 계속, 여러개 수가 많아지면 웹서버는 부하가 엄청날 것이다.

2) slow read 공격
content-length 헤더를 엄청 크게 잡아준다.
그리고 body의 내용을 찔끔찔끔 보내주는 것이다.
그러면 웹서버의 입장에서는 계속 기다려줘야하는 상황이 발생한다.
이런 패킷들이 많다면
웹 서버는 다운되게 된다.
body를 포함해야하므로 post 메소드를 이용해 패킷을 전송한다.




(slow read 공격 코드)




(패킷 상태)





(공격받은 모습)



이 공격도 마찬가지로 established가 되어있음을 확인 할 수 있다.



+ Recent posts