SQL 인젝션 공격의 원리
1. SQL 인젝션 공격에 취약점이 발생하는 곳은 웹 애플리케이션과 데이터베이스가 연동되는 부분에 공격자가 임의의 SQL 명령어를 삽입하여 공격
2. 보통 사용자 로그인 부분 , 게시물 검색 부분 , 우편번호 검색 부분 , 자료실 등이 대표적 이다 .
SQL injection 공격의 정의
1. SQL injection 공격 : “파라미터를 이용한 쿼리의 재구성”
è 웹 어플리케이션이 뒷 단에 있는 Database에 질의(쿼리)를 하는 과정 사이에 일반적인 값 외에 악의적인 의도를 갖는 구문을 함께 삽입하여 공격자가 원하는 SQL 쿼리문을 실행하는 대표적인 웹해킹기법
SQL injection 공격 예시
구글에서 inurl:.php?id= 를 검색하게 되면
웹주소에 .php?id= 가 포함된 모든 웹사이트를 검색하게 된다.
예를 들어서 website.co.kr/index.php?id=3 웹주소 맨 끝에 ‘를 추가해 본다
만약 웹사이트에 Mysql 오류 ~ 라는 식으로 뜨게 된다면 그 웹사이트는 SQL injection에 취약한
웹사이트 이다 .
SQL _ injection 공격의 종류
1. 인증우회 : AB ( Auth Bypass )
2. 데이터 노출 : DD ( Data Disclosure )
3. 원격명령 실행 : RCE ( Remote Command Excute )
인증우회 ( Auth Bypass )
1. 보통은 아이디와 패스워드를 입력하는 로그인 페이지를 타켓으로 행해지는 공격이며 , SQL 쿼리문의 TRUE / FALSE의 논리적 연산 오류를 이용하여 로그인 인증 쿼리문이 무조건 TRUE 의 결과값이 나오게 하여 인증을 무력화시키는 기법이다.
2. 인증우회를 위한 공격 쿼리 패턴으로는 아래와 같은 것들이 있으며 , 쿼리의 결과를 무조건 참 ( TRUE )로 만들 수 있는 쿼리라면 무엇이든 그 패턴이 될 수 있음
EX )
ㄱ. ‘ or 1 = 1 –
ㄴ. ‘ or 1 = 1 # ( MySQL 인 경우 )
ㄷ. ‘ or ‘dog’ = ‘dog’ –
ㄹ. ‘ or ‘ab’ = ‘a’ +’b’ –
ㅁ. ‘ or 2>1 –
인증우회 ( Auth Bypass ) : 종류 구분
1. SQL injection – 논리적 에러
Ex ) SELECT * FROM user_data WHERE last_name = ‘kim’ or ‘1=1’
2. Blind SQL injection – 쿼리 결과 여부
Ex ) http://www.xxx.com/page.php?id=5 and 1=1
Ex2 ) http://www.xxx.com/page.php?id=5 and 1=2
3. Union SQL injection – 이중 쿼리
Ex ) http://www.site.com/news.php?id =5 union all select top 1 table_name from information_schema.tables
4. Stored Procedure SQL injection – 저장프로시저
Ex ) http://www.site.com/member/checkid.asp?id=’;CREAT...r.dbo.xp_cmdshell%20’netstat%20-an’; 12
인증우회 : 원인
1. System Object 권한 제어 없이 기본 값 사용
2. DB 계정을 관리자 계정 (sa) 으로 일괄적 사용
Ex) bbs/bbs.asp?id=1
데이터 노출 ( Data Disclosure )
타켓시스템의 주요 데이터 절취를 목적으로 하는 방식이며 , Error based , Union based , Blind based , Time based 방식이 있다.
웹 사이트에서 Database의 에러정보를 확인할 수 있는지 , 없는지에 따라 공격방식이 결정된다 .
제일 먼저 , 공격 가능한 포인트를 찾는 것이다 .
1. Error based 방식
è Database 의 에러메세지를 기반으로 한 공격이며 , SQL 구문 중 group by 와 having 구문을 사용하여 일부로 에러를 유발시켜 에러정보를 바탕으로 Database 명이나 Table , Column, 궁극적으로 Data를 절취하는 것이 가능하다 .
단계적으로 보면 다음과 같다 .
Step1 : 공격포인트 찾기
Step2 : 에러 유발시키기
è Group by 와 having 구문
è Having은 group by 가 사용된 SQL 문에서 필터링이나 어떤 조건을 줄 때 사용하는 구문으로 반드시 group by와 함께 사용해야 한다 .
이 점을 이용해서 group by 없이 having을 사용하여 일부로 에러를 유발시킨다.
예를 들어서 www.example.com/idx=1’having 1=1 – 를 실행시키면 ,
당연히 에러가 발생할 것이다 .
우리는 이 에러 정보로 무엇을 파악할 수 있을까 ??
테이블 명과 , 첫번째 칼럼이 무엇인지 파악할 수 있을 것이다 .
Step3 : 다른 컬럼 알아내기
첫 번째 컬럼이 idx인 것을 알아냈다면 , 이를 이용하여 다른 컬럼의 이름들도 뽑아낼 수 있다. 이번에는 group by와 having을 함께 사용한다 .
대신 group by 에는 이미 알아낸 첫번째 칼럼인 idx를 집계하는 컬럼으로 사용해야 한다 .
주소를 보면 다음과 같을 것이다.
www.example.com/?idx=1’ group by idx having 1=1 –
위를 실행하게 되면 , 두번째 칼럼 이름을 알 수 있을 것이다.
세번째 컬럼을 알아내기 위해서는 쿼리를 아래와 같이 조작하여 실행한다.
www.example.com/?idx=1 ‘group by idx,bld having 1=1 –
이런식으로 알아낸 컬럼명들을 group by절에 추가하여 순차적으로 컬럼명을 알아갈 수 있다
더 이상 에러가 발생하지 않고 정상적인 페이지가 보인다면 모든 칼럼명을 알아낸 것으로 판단할 수 있게 된다 .
'학부공부 > 인터넷보안과응용' 카테고리의 다른 글
웹해킹의 이해 (0) | 2018.12.08 |
---|---|
XSS 란 무엇인가 (0) | 2018.12.08 |
웹 해킹 침해사고 및 대응 (0) | 2018.12.03 |
WebGoat_sql_injection_Solution(advanced + original ) Webgoat_풀이 (0) | 2018.11.12 |
pip_error (0) | 2018.11.12 |
#IT #먹방 #전자기기 #일상
#개발 #일상