[3-2]웹 어플리케이션 취약점 이해 및 대응

00SNU3K·2021년 9월 15일
0

02. 웹 취약점 이해

  • OWASP(Open Web Application Security Project) Top 10

    • 웹 애플리케이션에서 발생할 수 있는 위험들에 대해 연구하는 오픈소스 프로젝트
    • 10대 주요 취약점을 3년마다 공개
  • WebGoat

  • Injection 취약점

    • SQL 인젝션
      • DB와 연동된 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공겨자가 입력데이터에 SQL 쿼리문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안 취약점

      • PW=''or''='' → PW가 NULL 이거나 NULL = NULL

        • 항상 참이 되게 만들면 됨
        • 뒤에 --의 경우 MSSQL에서의 주석 처리, MySQL에서는 ##으로 주석처리
        • 이렇게 우회해서 인증할 수 있음
      • SQL Lite 설치

      • F12 - 마우스모양 - 해당 위치 클릭 - 코드 수정하여 SQL Injection 공격 실행

      • burp suite에서 intercept on 한 뒤 SQL Injeciton 공격 실행

      • String 일떄

        select * from memeber where user_id='?' ##여기서는 1' or '1'='1 을 넣으면 됨```
      • Number 일때

        select * from bbs where num = ? ##여기서는 그냥 1 or 1=1 하면 됨
      • 하나만 보여진다면 뒤에껄 보고 싶을때는

        select * from member where employee_id = 101 or 1=1 order by employee_id desc
    • Blind SQL Injection

      • 그냥 SQL Injection은 or 연산을 사용했다면 Blind SQL Injection은 and연산을 통해 공격함

      • 테이블 이름이나 속성 등을 찾아낼 수 있음

      • Blind Numeric SQL Injection
        101 and (select pin from pins where cc_number = '1111222233334444') > 10
        101 and (select pin from pins where cc_number = '1111222233334444') > 100
        101 and (select pin from pins where cc_number = '1111222233334444') > 1000
        101 and (select pin from pins where cc_number = '1111222233334444') > 10000

        이렇게 대소 비교를 해서 valid가 invalid가 되는 순간을 통해 그 값을 알 수 있음

      • Blind String SQL Injection
        • SUBSTRING('hojin', 1[start], 1[length]) => 첫번째글자에서 하나를 추출해라, 'h'

          • SQL에 내장되어 있는 함수
        • 아스키코드 값으로 blind sql injection을 할 수 있음

          • 'A' = 65, 'Z'= 90 'a'=97 'z'=122
          • 대문자가 더 작으니까 대문자부터 시작함
        • select name from pins where cc_number = '4321432143214321'
          name = 'keunsoo'
          
          101 and SUBSTRING((select name from pins where cc_number = '4321432143214321'), 1, 1) > 'H'
          #이 결과값이 valid이고
          
          101 and SUBSTRING((select name from pins where cc_number = '4321432143214321'), 1, 1) > 'J'
          #이 결과값이 Invalid이면, 첫번째 글자는 J 이다
          
        • 이렇게 하나하나 하면서 해당 컬럼값의 이름을 알 수 있음.. 하지만 일일히 다할수 없으니까 sql map 이라는 툴을 사용할 수 있음

    • Command Injection

      • 사용자 입력 값이 운영체제 명령어의 일부 또는 전부로 구성되어 실행되는 경우, 의도하지 않은 시스템 명령어가 실행되어 부적절하게 권한이 변경되거나 시스템 동작 및 운영에 악영향을 미칠 수 있음

      • 웹서버에서 운영체제 명령어를 사용할때 위 공격을 할 수 있음

      • Window

        • &를 이용해서 명령어 2개를 한줄에 실행 가능함

          dir&ipconfig

      • Linux

        • ;를 이용해서 명령어 2개를 한줄에 실행 가능함

          ls;ifconfig

      • Webgoat를 활용한 실습

        • &를 이용해서 명령어를 넣어보는데 여기서 Burp Suit로 확인하면 &가 인자로 안넘어가고 url로 넘어가는 것을 확인할 수 있음
        • 그래서 &를 인코딩해서 %26으로 변경하고 ""로 파일이 구분되니까 띄어서 새로 "하면 실행할 수 있음
      • 이러한 취약점을 보안하기 위해서는,

        1. 운영체제 명령어를 사용하지 않는다.
        2. White List로 구성하여 실행한다.
  • Log Spoofing

    • webgoat에서 logspoofing으로 들어가서 실습 진행

    • %0D(Carrigage Return, CR) %0A(Line Feed, LF)

      • 두개의 특수문자는 줄 바꿈 문자(개행 문자)
      • 키보드의 Enter를 쳤을 때 생기는 문자
        • Window 0D0A 텍스트 파일 표준 줄바꿈 문자
        • Linux/Unix 0A 1개만 사용
    • Login failed for username: Smith%0d%0ALogin Succeeded for username: Admin

    • 이렇게 하면 뒤에 개행해서 가짜 로그가 찍힘

    • http통신할때도 개행을 통해서 header와 body를 나누는데 이것도 같은 맥락으로 공격 가능

profile
네트워크 전문가를 꿈꾸며

0개의 댓글