본문 바로가기
정보보안/모의해킹

모의해킹 강의 2

by 뭔가해보겠습니다 2024. 10. 14.

모의해킹 실무자가 알려주는, SQL Injection 공격 기법과 시큐어 코딩 : PART 1

강의주소 :  https://www.inflearn.com/course/sql-injection-secure-coding-1/dashboard

 

 

SQL Injection
웹사이트 등 사용자 입력값을 통해 SQL 구문을 주입하는 공격
주요 경로가 웹일 뿐 database ide나 c, c++, python 등을 경로로 쓸 수도 있다

사용자 입력값 : 파라미터, 쿠키
ex) http://test.com?idx=1234

동적자원 : 계속 달라지는 사용자 입력값
(ex 검색, 로그인, 게시판 작성 등의 기능)

사고사례
1) 여기어ㄸ : 약 99만건
sql 인젝션을 통해 관리자 세션 탈취, 관리 서비스 접속
2) 뽐ㅃ : 약 195만건
MD5 단방향 해시 알고리즘
솔트값이 적용되지 않아 레인보우 테이블로 역추정 가능

+ 세션 저장 : 메모리 > 파일시스템 > 데이터베이스

메타데이터 : 데이터를 획득 하기 위한 지도. dbms마다 데이터 사전이 다르고 어떻게 데이터를 뽑아야 하는지, 문법체계 등도 다름.

툴 없이 수동으로 sql injection 하는 것은 어려움

사용자입력이 가능한 모든 곳이 공격의 대상이 된다

CRUD
Create 생성 INSERT
Read 조회 SELECT
Update 수정 UPDATE
Delete 삭제 DELETE

가장 많은 공격포인트 : select

+ 진단중에 update의 where절을 잘못 건드려서 다른 레코드까지 전부 변조된 사례가 있다

공격원리

select * from member where id = '' or 1=1 --'and pw = '값'
싱글쿼터 ' 를 이용한 sql injection

 

취약점 발생 원인
: 입력값 검증 없이 구문을 조합하여 db에 변조된 질의 요청을 하게 됨

공격 종류
- 인증 우회
- 데이터 조회 (가장 빈도수가 높음)
- 시스템 명령어 실행

취약점 점검 방법
1. 취약점 분석
1) 에러 유/무 확인 : dbms에 대한 에러
=> 에러페이지에서 백엔드 데이터베이스 dbms 버전 등 정보를 얻고, 에러 기반 공격을 실행할 수 있으므로 사이트 자체의 에러 페이지를 노출하여야 한다
ex) idx값에 숫자가 아닌 a같은 문자 넣기, 싱글쿼터' 넣어보기

2) 특정 기능에 대한 취약점 유/무 확인. 논리, 관계, 산술, 연결 연산자 등을 활용.
- 문자형
id='data'||test' 연결연산자 활용하여 정상조회 후 id='data'a'test' 에러 발생시 취약판단.
연결연산자 삽입이 제대로 적용되고, 연결연산자가 아닌 임의의 문자(')를 통해 에러가 발생되므로 입력값 검증이 제대로 이루어지지 않고 있다.
(+ || 오라클, + MSSQL, 공백과 || MYSQL 연결연산자로 DB 종류 판단 가능)
- 숫자형
idx=192-1 산술연산자 활용하여 정상조회될 때
- 테이블
select * from board_notice
=>select * from board_notice where 1=1
테이블명을 사용자 입력값으로 처리할 경우 where절을 추가해본다
- 컬럼 (where 절)
where [ 사용자 입력 값 ] like ...
=> where 1 like ... 또는 where a like ... 등으로 성공 실패 확인
- 컬럼 (order by 절)
order by idx desc
=> order by 1 desc 또는 order by a desc 성공실패 확인
*숫자의 경우 1씩 증가시키면서 컬럼 개수를 확인할 수 있다
- 키워드 (order by 절)
order by idx desc
=> order by idx desc, 1 또는 order by idx a 성공실패 확인

3) 조건 구문 완성 : 공격 페이로드 완성

sql 인젝션 구문 종류
1) in-line query
예시 : ... idx=192 and 1=1 and ... (뒤쪽에 기존 쿼리가 계속 이어짐)

2) Terminating query
예시 : ... idx=192 and 1=1 -- ... (주석문자로 절단)

3) Stack query
예시 : ... idx=192; delete from ask-- ... (세미콜론;을 사용하여 추가 쿼리 동작)

CASE WHEN 구문 활용
CASE WHEN [CONDITION] THEN [TRUE] ELSE [FALSE] END
                               조건                     참일때            거짓일때

ex)
select * from ask where idx =(case when 1=1 then 2 else 3 end)
=> 조회 성공시 취약확인 (+ order by 절에도 사용 가능 )

 

판단 : abcd 검색 결과와 ab'||'cd 검색 결과가 같을 때 취약의심
환경에 따라 '||' 구문이 자동제거가 될 수 있으므로, 테스트 필요

테스트 검색 구문 : ab'||(case when 1=1 then 'c' else 'a' end)||'d
=> 게시글이 abcd 검색결과와 같으면 취약점으로 판단, 일치하지 않으면 취약점이 아닐 수 있다

Terminating query와 in-line query 구문 사용시 논리 연산자 사용이 안될 경우,
(ex select 절 전에 update 절에 사용된다든지, 프로시저 변수값에 들어간다든지.

논리연산자는 안 먹히는데 연결연산자는 먹힐때)
연결 연산자와 case when 구문을 활용해 구문자체의 에러가 발생되지 않게 할 수 있다

select * from member
where name=''||(case when 1=1 then 'test' else 'query' end)||''

 

 

'정보보안 > 모의해킹' 카테고리의 다른 글

모의해킹 강의 5  (0) 2024.10.18
모의해킹 강의 4  (0) 2024.10.16
모의해킹 강의 3  (0) 2024.10.15
모의해킹 강의 1  (0) 2024.10.10