본문 바로가기

해킹/Web Hacking

[3주차] 스터디 정리 - SQL Injection

response 패킷도 데이터를 변경할 수 있다

result : fail -> ok로 바꿀 수 있음

script 태그로 감싸진 javascript 코드도 response에서 변경할 수 있음

 

intercept is on 잡아서

Do intercept -> do response ~~ 클릭하기

 

브루트 포스 문제

취약점:

로그인 인증 횟수를 제한하고 있지 않음

 

 

**유명한 프록시 툴

burp suite - GUI 방식

fiddler (window에서만 돌아감)

     -> 쓰기 어려움

mitmproxy - CLI 방식

 

** SQL

 

** DB : 엑셀 그 자체임

   database

     ex : 이름 컬럼 / 전화번호 컬럼 / email 컬럼

 SELECT id FROM member

column : 열

row : 행

 

2행 3열에 해당

 

 

SELECT 문

select [컬럼 이름] from [테이블 이름]

select 이름 , 전화번호 from member

하면 두개의 컬럼을 가져와줌

 

(_) 조건 관리      <- 중요

select [컬럼 이름] from [테이블 이름]

where (조건)

 

(컬럼이름 = 데이터)

where id='normaltic'

 

조건을 여러개 둘 수 있음

연산자 두개

and 연산자 => 두 가지 모두 참이어야 함

or 연산자 => 둘 중에 하나만 참이면 가능

 

-------------------------------------------------------------------------------

 

** 로그인 인증 과정!

> 식별

: 많은 데이터 중에서 특정한 데이터를 가려내는 것

식별 정보 : ID

     -> 중복되면 X

 

 

> 인증

: 그 사람이 맞는 지 확인

인증 정보 : 비밀번호, OTP 등등등

 

1) 식별 & 인증 동시 CASE

normaltic / qqqq

 

select * from member

where id='normaltic' and pas='qqqq'

 

if (그 결과가 존재하면) {

      로그인 성공

} else {

      로그인 실패

}

 

2) 식별, 인증 분리 CASE

select pass from member

where id='';

 

if (db_pass == user_pass) {

       로그인 성공

} else {

       로그인 실패

}

 

어떤 경우가 더 안전할까?

정답은 똑같이 안전함

 

** SQL Injection

> SQL 질의문을 삽입하는 공격

 

-> 그래서 뭘 할 수 있는데?

데이터 추출

인증 우회

데이터 변조

 

내가 로그인 창에 id가 normaltic 치고 비밀번호에 1234를 치면

서버에서 select * from member where id='normaltic' and pass '1234' 가 실행됨

 

ID : mario' #        그럼 id에 작은 따옴표를 넣으면 어떻게 될까?

select * from membere where id='' and pass=''

 

#은 mysql에서 주석임

ID : mario'# 은

select * from member where id='mario'  #' and pass='' 여기는 주석 처리됨

가 실행되면서 따옴표의 짝 과 # 주석처리 때문에

mario 데이터 값을 뽑아낼 수 있음

 

-------------------------------------------------------------------------------------------------------------

 

SQL Injection : 로그인 인증 우회.

 

1) 식별 & 인증 동시

select * from member

where id='' and pass=''

 

주석 : mario'#

or 구문 이용1 : mario' or '1'='1

                -> mario 정보만 나옴

or 구문 이용2 : mario' or '1'='1'#

                -> 모든 정보가 다 나옴

으로 or 구문 사용가능

 

or 구문1 마지막에 작은 따옴표는 일부러 없는거임

 

select * from member

where id='mario' or '1'='1' and pass='sfe'

이거 실행하면 mario 정보만 나옴

왜?

or 와 and 에는 연산 우선 순위가 있음

 

그래서 사실상 

select * from member

where id='mario' or ('1'='1' and pass='sfe')

and가 먼저 실행되는 것

괄호부분은 pass가 틀림으로써 거짓으로 판명나고

앞에 있는 조건만 가지고 id값을 추출함

 

따옴표를 안 쓰고 '1'='1'이 아니라 1=1로 써도 되지만

작음 따옴표 짝을 맞추기 위해서 써주는 게 좋음

 

그리고 위 사진의 경우는 fake의 id로 로그인 하게됨

 

2 ) 식별 & 인증 분리!

union 이라는 구문을 알아야함

 

union

-> 데이터를 연결해서 출력.

-> select 2개 쓸 수 있게 한다!

 

(select  ~~~~~~) union (select ~~~~~~)

union 구문 활용

x' union select 'normaltic','qqqq','1111','2222' # 입력

그럼 처음에는 normaltic이라는 id가 새로 추가된 것처럼

로그인이 되고

그 다음은 원래 DB에 있던 normaltic의 세션ID를 가지게 되므로

개인정보나 여러 관련 정보를 다 볼 수 있다

 

update도 사용할 수 있지만 실제 데이터가 바뀌어버리므로

피해자가 알게될 수 있음

 

 

대신 위 방법을 쓰려면 컬럼이 몇 개 호출되는지를 알아야함

 

로그인 우회를 할 때 id 쿼리문과 pass 쿼리문사이가 개행처리가

되어있을 수도 있음 그럴 때는 or 구문을 못쓸 수도 있고

필터링처리가 되어있어서 or 구문을 못 쓸 수도 있음

 

그리고 Login Bypass를 할 때는 제일 처음Burp Suite를 이용해서 오고가는 패킷을 분석한 다음Repeater를 통해서 mario'# 같은 구문을 날려보는 것이편리함

 

그리고 로그인 과정을 분석할 때mario' and '1'='1' 로 보내보면302 Found가 떴을 때 select * from memberwhere id= '' and pass='' 로 이루어져있는 거라고 생각할 수 있음mario' and '1'='1' 에서and '1'='1' 이라는 항상 참이 되는 구문은항등원 역할을 함 이것으로 서버 쿼리문의 and를 파악했음

 

 

그리고 같이 수업들으시는 분이x' union select 'normaltic2', 'qqqq', '1111', '2222', '3333', '4444' #라고 입력했는데1111로 로그인 되었다고 한다질문을 남겼는데 강사님이 대답을 흐리신걸 보니 중요한 개념이 있나보다왜 그럴까?