처음부터 차근차근

blind numeric sql injection, xss, concurrency 본문

정보보안

blind numeric sql injection, xss, concurrency

_soyoung 2022. 4. 27. 15:28
반응형

Blind numeric sql injection

쿼리가 참일때와 거짓일 때의 서버의 반응 만으로 암호 데이터(숫자)를 얻어내는 기술이다.

마치 장님(The blind)이 지팡이를 이용하여 장애물이 있는지 없는지를 판단하는 것처럼 공격코드를 찾아내는 것이다.

하나하나 짚어가면서 찾는 것이라고 생각하면 쉽다.`

 

공격 시나리오 예시

<pin 번호 찾기>

첫번째 범위 찾기 : 101 and  'pin번호 > 10000'         -> false

두번째 범위 찾기 : 101 and 'pin번호 > 8000'      -> true

마지막 범위 찾기 : 101 and 'pin번호 = 8001'    -> false

마지막 범위 찾기 : 101 and 'pin번호 = 9000'     -> true

 

--> pin 번호가 9000인 걸 알 수 있음

 

 

일반 SQLInjection과 Blind SQLInjection의 차이점과 공통점

일반 SQLInjection

쿼리를 삽입하여 원하는 데이터를 한번에 얻어낼 수 있는 방법

오류메세지에서 정보를 찾을 수 있음

 

Blind SQLInjection

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

오류메세지에서 정보를 찾을 수 있음

 

 

Blind SQLInjection 실습

조원의 webgoat 서버에 들어간다.

http://조원IP:조원포트번호/WebGoat

 

[Injection Flaws] -> [Blind Numeric SQLInjection] 클릭

101 입력

Account number is valid(계좌번호가 유효합니다)가 나옴

이로써 101번 계정이 있다는 것을 확인할 수 있음

 

101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444’) <  2300 ); 입력

Invalid account number(잘못된 계좌 번호)가 나옴

TRUE AND NULL 해서 결과가 FALSE가 됨

pin 번호가 2300보다 작지 않다는 것을 알 수 있음

....

이런 식으로 '< 2300' 부분에다가 다른 식을 넣어봐서 값을 추정함

 

101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444’) = 2364 ); 입력

Account number is valid(계좌번호가 유효합니다)가 나옴

이로써 pin 번호가 2364인것을 찾음

 

Blind SQLInjection의 방어

Blind SQL Injection 공격으로부터 안전해지기 위해서는 쿼리를 변조할 수 있는 문구가 삽입되는 것부터 방지해야 한다.
union, select, from, where, limit, or, and, ||, &&, (, ), <, >, insert, update, delete, create, drop 등 SQL 구문을 감지하는 패턴을 만들어 SQL INJECTION을 감지한다.

<주의 사항>
특히 쿼리에러가 났을 때 에러에 대한 정보를 보여주어서는 안된다. 
에러 정보를 바탕으로 SQL Injection을 시도하기 때문이다.

 

 

XSS(Cross Site Scripting)

크로스 사이트 스크립팅이란 게시판, 웹 메일 등에 악의적인 스크립트를 사용해서 공격하는 것이다.

예를 들어서 글 삽입하는 부분에다가 자바스크립트 구문 (<script></script>)넣어서 원래의 기능과 다르게 만든다.

서버 측에서 입력을 받아들이는 부분의 스크립트 코드를 필터링하지 않아서 공격자가 스크립트 코드를 실행할 수 있다.

그래서 다른 사용자의 개인 정보를 추출하거나 페이지를 갑자기 이동시켜 원활한 서비스 이용에 방해를 준다.

 

XSS의 종류

1. Stored XSS

가장 일반적인 XSS 공격 유형으로, 

공격자가 웹 애플리케이션을 속여 웹 애플리케이션 데이터베이스에 악성코드를 저장하도록 하는 수법이다.

사용자가 글을 저장하는 부분에 정상적인 평문이 아닌 스트립트 코드를 입력한다.

서버에 저장된 악성 코드는 시스템 자체를 공격할 수 있고 웹 앱 사용자 상당수, 또는 전체에 악성 코드를 전송하고,

지속적으로 피해를 준다는 특징을 가진다.

 

2. Reflected XSS

공격자가 HTTP 요청에 악성 콘텐츠를 주입하면 그 결과가 사용자에게 반사되는 형태의 수법이다.

스크립트 코드를 입력하는 동시에 결과가 바로 전해지는 공격 기법이다.

주로 피싱에 사용되고, 피해가 일시적이며 비지속적이라는 특징을 가진다.

 

 

Stored XSS 공격 실습

WegGoat를 실행 후 [Cross-Site Scripting(XSS)] -> [Stored XSS Attacks] 클릭

Title에다가 I am hacker을 적고 Message 부분에다가

<script>alert("Now, you are hacked by kim so young")</script>

를 입력한다.

그 다음 submit를 누르면

 

 

이렇게 I am hacker가 메세지 리스트에 뜨게 되고 저걸 클릭하면 

 

 

이렇게 alert문에 의해 경고창이 뜨게 된다.

글 제목을 누르면 아래에 글이 뜨게 되는데, 글 부분에 스크립트가 있어서 그 스크립트가 실행되어 위와 같은 결과가 나오는 것이다.

 

Reflected XSS 공격 실습

WebGoat를 실행 후 왼쪽 메뉴에서 [Cross-Site Scripting(XSS)] -> [Reflected XSS Attacks] 클릭

크롬의 개발자 모드를 켜서 111이 입력되어 있는 부분을 보면  

이렇게 되어 있는 것을 볼 수 있다.

저 111" /> 뒤에 스크립트를 추가하여 공격을 할 예정이다.

<input name=“field1” type=“TEXT” value=“111”/><script>window.open("http://www.naver.com")</script>

이렇게 하면 사용자를 네이버 사이트로 강제 이동시킬 수 있다.

 

 

111뒤에 "/><script>window.open("http://www.naver.com")</script>를 입력하고 purchase를 클릭한다.

 

 

다음과 같이 네이버로 강제이동한 것을 볼 수 있다.

 

 

Concurrency(동시 실행)

웹에서 자원 접근을 스레드 구분없이 동시에 하게되면 기능이 엇갈려서 서비스에 문제가 생길 수 있다.

그래서 동시 실행(concurrency)을 스레드 구분 없이 하게 되면 보안에 취약하다.

Shopping Cart Concurrency Flaw(쇼핑 카트 동시 입력 취약점)와 스레드 안전문제(Thread Safety Problems)실습을 해보았다.

 

 

Shopping Cart Concurrency Flaw (쇼핑 카트 동시 입력 취약점) 실습

<기능>

장바구니 : Update Cart를 클릭하면 장바구니 업데이트

결제 : Purchase 버튼 클릭 -> Confirm 버튼 클릭하면 결제됨

 

<문제>

조원2Hewlett-Packard-Printer($299)를 사려고 했는데 Sony-Vaio with intel Centrino($1799)가 배송되어 왔습니다.

그런데 가격이 $1799가 아니고 $299의 가격으로 배송 받았습니다. 이와 같이 배송을 받기 위한 방법은?

 

조원2가 Hewlett-Packard-Printer($299) 옆에 1을 입력하고, Purchase 버튼을 클릭한다. 

조원1이 Sony-Vaio with intel Centrino($1799)옆에 1을 입력하고, Update Cart를 클릭한다.그 다음 조원2가 Confirm 버튼을 누르면 ony-Vaio with intel Centrino를 $299로 살 수 있다.

 

조원 2 결제된 화면 : 299 달러로 결제한 것을 볼 수 있음
조원1 장바구니 화면

 

 

스레드 안전문제(Thread Safety Problems) 실습(2명)

[Concurrency] -> [Thread Safety Problems] 클릭

조원 2가 name에 dave를 입력하고, 그 다음 조원1이 jeff를 입력한다.

그 다음 조원2가 submit를 클릭하고, 다음에 조원1이 submit를 클릭한다.

이렇게 하면 조원2는 jeff를 제출했지만 name에 dave가 뜨게된다.

 

조원2 화면 : dave를 입력했지만 jeff가 출력됨
조원1 화면 : jeff를 입력해서 jeff가 나옴

 

 

 

출처 : 정보보안(22-1학기)고수정교수 강의 내용 변형 및 요약

반응형
Comments