본문 바로가기

화이트 해커가 되기 위한 8가지 웹 해킹 기술

5주차 SQL인젝션

SQL 인젝션: 데이터베이스로 전송되는 SQL 쿼리문을 사용자 입력으로 조작할 수 있는 경우, 데이터베이스 내의 데이터를 변조하거나, 다른 사용자의 개인정보 등 허가되지 않은 정보에 접근하는 공격

            - 웹사이트의 회원 정보 등 개인정보를 꺼낼 때 최근까지도 자주 사용하는 웹공격

            ex) 2011 소니 해킹, 2015년 뽐뿌 해킹, 2015년 어나니머스 WTO 해킹

where - where구문을 공격하는 예

        1. ID1인 사용자 정보를 요청

        2. 웹 어플리케이션은 내부에 있는 데이터베이스로 SQL 쿼리문을 전송

        3. 쿼리문 안에 where라는 조건문이 있고 사용자가 입력한 아이디 값이 조건으로 입력

        4. 쿼리가 실행이 되면 사용자 정보가 웹어플리케이션을 통해 클라이언트에게 전송

        5. 해커는 1번 과정에서 SQL 쿼리문을 조작하기 위해 or을 사용해 조작적으로 입력

        6. where 조건이 변경(WHERE 구문 우회)되면서 다른 모든 데이터의 값을 얻을 수 있음

UNION – 1. 1에서 4까지의 과정이 동일

         2. 이때 해커는 union이라는 키워드를 삽입해 패스워드를 요청하는 select 구문 삽입

         3. SQL문이 union을 사이에 두고 select 구문 2개가 위치하게 됨

         (##뒤에 오는 문장을 주석처리)  

실습(where)- 취약한지 알아보는 방법 입력하기. 취약한 페이지인 경우 SQL에러가 뜬다.

          (where user_id=’’’이 되면서 에러 발생)

          1’ or ‘1’ = ‘1 이라고 입력하면 조건이 항상 참이 되어 모든 사용자의 정보가 출력된다.

          ‘# 이라고 입력하면 뒤의 문장들이 주석이 되어 에러가 발생하지 않는다. (Mysql)

칼럼 개수(union)- union을 이용하면 데이터베이스의 모든 정보를 알아낼 수 있다.

                 union: 합집합. union 앞의 select문과 뒤의 select문의 칼럼 수가 같아야만 한다.

                 1’ union select 1, 2#으로 결과를 통해 칼럼 수를 확인할 수 있다.

칼럼 갯수(order by): 어떤 칼럼을 기준으로 정렬하는 키워드

                   칼럼의 개수보다 큰 값을 입력하면 정렬할 수 없기 때문에 에러 발생

                   쿼리문의 결과를 통해 칼럼의 개수를 확인할 수 있다.

UNION 공격- information_schema.schemata: information_schema DBschemata라는 테이블

             information_schema에서 데이터베이스 정보, 테이블, 칼럼 정보를 관리함

             schema_nameselect하면 데이터베이스 명을 조회할 수 있음.

             1’ union select schema_name, 1 from - information_schema.schemata 입력

             모든 데이터베이스의 정보가 출력됨

 

dvwa 데이터베이스의 테이블 명 조회: 1’ union select table schema, table name from information_schema.tables where table schema = ‘dvwa’ #

users 테이블 칼럼 조회: 1’ union select table name, column name from information_schema.column where table schema= ‘dvwa’ and ‘users’ #

uses 테이블에서 정보 조회: 1’ union select user, passwd from ‘users’ #

 

패스워드가 평문이 아닌 암호화된 해시 값으로 저장해 해킹이 되어도 정보를 파악하기 어려움

 

블라인드 SQL 인젝션- 해당 관련 정보가 존재한다는 것만 알려줌

                             을 입력 시 특별한 에러가 발생하지 않아 SQL문을 조작할 수 있는지 확인하기 어렵고 정보를 빼내기도 어려움.

                             1’ AND 1=2#을 하면 정보가 없다고 뜸 (AND Boolean-based blind)

                             -> select user from users where id=’1’ AND 1=2#로 입력이 되면 SQL 쿼리 문이 뒤에 있다는 것을 알 수 있음

                             “admin이라는 사용자가 존재하는가와 같은 명제 확인 가능

                            - 표시되는 메시지가 같은 경우 응답시간을 다르게 하여 확인 가능

                              브라우저에서 f12를 누르면 developer창에 네트워크 창 확인 가능

                             1’ AND sleep(5)# 요청 시간을 확인 가능

                             프로그램을 사용하는 것이 좋음

 

SQLMAP: 대중적인 SQL 인젝션 프로그램. 파이썬으로 제작. 터미널에서 사용

             application->Web Application-> sqlmap 아이콘 클릭

              “-u url”: 해당 url에 자동으로 공격을 수행. 로그인이 되어야할 시 쿠키 값 입력

                        -u 뒤에 정상적인 url이 들어가야 함. # 지우기 가능

              쿠키 값은 f12 developer console->Console에서 document.cookie 입력으로 확인

              명령어를 입력하면 가능할 것 같은 공격 이름과, 페이지의 종류를 알아낼 수 있음.

             -추가적인 입력으로 각종 정보를 알아낼 수 있음

              위의 입력어에 –current-db를 입력하면 현재 DB의 이름을 알 수 있음

              위의 입력어에 -D DB이름 –table을 입력하면 테이블을 알 수 있음

              위의 입력어에 -D DB이름 -T users –dump을 입력하면 테이블의 모든 정보를 알 수 있음

 

실습(medi)- 값을 입력하는 것이 아닌 선택하는 것으로 변경됨

                인터셉트 기능을 이용해서 값을 변경할 수 있음

                 버프스위트에 Proxy->intercept on을 변경

                 인터셉트한 요청을 1’ or ‘1’=1#로 변경하면 구문에러 가 뜸

                 코드를 통해 $id값이 숫자형태의 타입이어야 함을 확인 가능

                 1 or 1=1으로 입력하면 공격이 성공

                  1 union select user,passwd from users#으로 입력하면 공격 성공

 

대응- 입력 값이 숫자인지 확인 (필요한 데이터의 값의 형식 검사)

        쿼리문이 구성이 된 후 바로 호출되는 동적 쿼리가 아닌 파라미터 쿼리 사용

        prepare에서 쿼리문을 저장하고 id부분을 bindparam을 이용해 지정