cgy12306

XSS 부족한 부분 정리 + SQL 인젝션 본문

해킹맛보기

XSS 부족한 부분 정리 + SQL 인젝션

cgy12306 2019. 7. 6. 18:29

 

 

XSS의 여러가지 형태

1. <script> 태그 삽입

<script> 태그는 자바스크립트로 클라이언트 측 스크립트를 정의하기 위해 사용

 

2. <iframe> 태그 삽입

<iframe> 태그는 웹 브라우저에 다른 사이트를 일정공간에 보이개 해줌

이 태그를 이용해 악성 코드가 포함된 사이트로 세션을 연결해 자동으로 프로그램을 다운로드 시킬 수 있다.

 

 

 

 

Stored XSS

웹 애플리케이션 취약점이 있는 웹 서버에 악성 스크립트를 영구적으로 저장해 놓는 방법이다.

1. 공격자는 게시판이나 사용자 프로필 등 악성 스크립트를 삽입.

2. 사용자가 사이트를 방문하여 저장되어 있는 페이지에 정보 요청

3. 서버는 악성 스크립트를 사용자에게 전달하여 사용자 브라우저에서 스크립트 실행

<Stored XSS 공격 기법>

 

Reflected XSS

웹 애플리케이션의 지정된 변수를 이용할 때 발생하는 취약점을 이용하는 방법이다.

1. 공격자가 관리자의 이메일에 공격용 악성 URL(ex.쿠키 요청)을 보냄

2. 관리자가 URL을 클릭하면 악성 스크립트가 요청하는 정보(ex. 쿠키정보)를 서 버로 보냄

3. 서버는 정보를 악성 스크립트에 작성한 대로 사용자, 공격자에게 보냄.

 

Reflected XSS

 

 

 

 

DOM XSS

* DOM이란 W3C 표준으로 HTML, 및 XML 문서에 접근방법을 표준으로 정의하는 문서객체모델

* W3C : World Wid Consortium으로 웹의 창시자 팀버너스 리가 웹 표준을 제정하기 위해 만든 비영리 재단

 

DOM XSS는 DOM 객체를 포함하는 자바스크립트 등을 이용하여 데이터 접근 시 검증되지 않은 입력 값이 자바 스크립트를 통해 삽입되어 발생하는 취약점

<DOM XSS>

 

 

 

 

https://www.server.com/page.hotml?name=David를 입력하면 정상작동 되지만 DOM 기반 XSS 공격을 위해서 http://www.server.com/page.html?name=<script>alert(document.cookie)</scrip>를 입력하게되면 예기치 못한 값이 입력 되었기 때문에 브라우저에서 <script>의 내용이 실행되게 됨.

 

XSS 공격 예방 우회 URL은http://server.com/page.html?name=David#<script>alert(document.cookie)</script>이다. 브라우저에서 '#'문자 뒤에 있는 값을 서버로 전송하지 않는 것을 이용하여, 브라우저상에서는 '#'뒤에 내용이 실행 된다.

 

 

정리를 해보자면 Stored XSS와 Reflected XSS는 서버의 취약점을 이용한 것이고 DOM XSS는 브라우저의 취약점을 이용한 것이다.

 

 

 

CSRF(Cross-Site Request Forgery)

웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격

XSS를 이용한 공격이 사용자가 특정 웹사이트를 신용하는 점을 노린 것이라면, CSRF는 특정 웹사이트가 사용자의 웹 브라우저를 신용하는 상태를 노린 것이다.

 

CSRF 방어 기법

1. CSRF 토큰

CSRF 토큰이란 임의난수를 발급하여, 해당 난수가 없는 상황에서 해당 동작들이 이루어지려고 하면 요청 거부하는 방법을 통하여 사용자가 정말로 변경을 의도하는 경우에만 변경을 시켜주는 방법이다.

 

2. Double Submit Cookie 검증

CSRF토큰 검증의 한 종류로 세션을 사용할 수 없는 환경에서 사용할 수 있는 방법이다. 스크립트 단에서 요청 시 난수 값을 생성하여 쿠키에 저장하고 동일한 난수 값을 요청 파라미터에도 저장하여 서버로 전송한다. 서버단에서는 쿠키의 토큰 값과 파라미터의 토큰 값이 일치하는지 검사한다.

 

3. 캡챠(CAPTCHA, Completely Automated Public Turing test to tell Computers and Humans Apart : 컴퓨터와 사람을 구분짓기 위한 완전 자동 튜링 테스트)

사용자가 실제 사람인지 컴퓨터 프로그램인지를 구별하기 위해 사용되는 방법. 사람은 구별할 수 있지만 컴퓨터는 구별하기 힘들게 의도적으로 비틀거나 덧칠한 그림을 주고 그 그림에 쓰여 있는 내용을 물어보는 방법.

 

 

Boolen Based SQL 인젝션

웹 어플리케이션에서 DB에 Query시 입력된 데이터의 유효성 검증을 하지 않아 개발자가 의도하지 않는 쿼리를 생성하여 DB정보를 열람하거나 조작할 수 있는 보안 취약점.

 

 

<로그인 폼>

 

 

<로그인 성공>

 

 

 

<로그인 실패 폼>

 

 

<SQL 인젝션>

 

 

 

 

' or1=1 # 을 입력하게 되면 위에 처럼 id에는 아무것도 안들어가고 or 조건에 의해서 or 앞이나 뒤의 두 조건중 단 하나라도 참이면 결과값이 참이 전달이 된다.

SQL에서는 #은 주석문자 이기 때문에 패스워드 부분은 주석처리 된다.

또한 select * from users where id='admin' and pw='root'로 입력을 해야 로그인이 되지만

select * from users where id='' or 1=1 #and pw='1'

id 입력 부분에 or이 들어가 있으면 or 연산자보다 and 연산자가 우선순위가 높기 때문에 결과가 FALSE가 되고 그 후 FALSE or (1=1)이 그 다음 계산이 되어, FALSE or TRUE가 된다. 결과적으로 TRUE이기 때문에 테이블의 값을 가져오게 된다. 그리고 admin 계정은 테이블의 최상위에 위치하기 때문에 admin의 권한을 가져오게 된다.

(여러가지 주석들을 시도해 봐야한다. --, #, /* 등)

 

UNION SQL 인젝션

UNION은 2개 이상의 쿼리를 요청하여 결과를 얻는 SQL 연산자이다. 공격자는 이를 악용하여 원래의 요청에 한 개의 추가 쿼리를 삽입하여 정보를 얻어내는 방식이다.

 

<UNION SQL 인젝션>

 

 

UNION과 함께 null 개수를 통해 필드개수를 확인하는 방법이다. 에러가 발생되지 않는 null 개수만큼이 필드의 개수를 의미한다.

 

 

Blind SQL 인젝션

참과 거짓, 쿼리가 참일때와 거짓일 때의 서버의 반응만으로 데이터를 얻어내는 기술이다.

 

 

1. pw의 첫번째 글자를 잘라서 그 값을 10진수로 변환한다.

2. 10진수로 변환된 값을 2진수로 다시 변환한다.

3. 해당 2진수를 lpad 함수를 이용해 8바이트로 맞춘다.

4. 8바이트로 맞춰진 2진수의 첫 번째 바이트를 추출해 1과 비교한다.

5. 이렇게 다 맞춰진 값을 전부 조합해보면 비밀번호인 'root'가 나오게 된다.

('r'은 아스키 코드로 114번 2진수로 01110010이 나온다)

 

 

order by를 이용해 컬럼 개수를 알 수 있다.(실패, 성공은 로그인이 되는지 안되는지로 확인했다)

 

order by 1,2,3,4 까지는 되지만 5를 넘어가는 순간 실패하게 되므로 컬럼 갯수는 4개가 된다.

 

 

 

 

 

 

SQL 인젝션 방어 방법

1) addslashes() 사용

데이터 베이스 질의 등에서 처리할 필요가 있는 문자 앞에 백슬래시를 붙인채 문자열을 반환한다. 처리할 필요가 있는 문자로는 ', ", \, NUL(NULL)이 있다.

 

2) mysql_real_escape_string() 사용

간단히 말해서 addslashes의 확장 버전이다. addslashes에 처리할 문자가 \x00, \n, \r 등 추가 되었다.

'해킹맛보기' 카테고리의 다른 글

XSS  (2) 2019.07.06
Bitnami WAMP 설치 및 설정  (0) 2019.07.06
Comments