KGPstudio
Published 2023. 5. 15. 12:59
SQL Injection 정리 WEB
반응형

SQL Injection

  • Union, Error Based, Blind SQL Injection
  • 예제와 시나리오 JSP, ORACLE 기준
  • 의도하지 않는 쿼리 삽입 하여 악의적인 SQL 문을 실행시키는 공격
  • Oracle ⇒ user_tab, all_table 테이블 정보 칼럼 정보

SQL (Structured Query Language)

  • 데이터베이스 관리용 언어
  • DDL, DCL, DML로 구분

DDL (데이터 정의어)

  • 스키마,, 테이블, 인덱스등 정의, 변경, 삭제할 때 사용
  • CREATE, ALTER, DROP…

DCL (데이터 제어어)

  • 데이터 대한 접근 권한 부여 등 관리 목적으로 사용
  • COMMIT, ROLLBACK, GRANT, REVOKE

DML 데이터 조작어

  • DB에 저장된 데이터를 실질적으로 처리하는데 사용
  • SELECT, INSERT, UPDATE, DELETE
  • UPDATE,DELETE 쿼르는 데이터 변경, 삭제할 수 있으므로 주의

Oracle DB

  • dual - 공백의 테이블
CREATE user c##test identiied by 1234;
GRANT connect, resource, dba tp c## test;

# 왼쪽 사이드바 test 우클릭 -> 속성
# 사용자 이름 c##test, 비번 1234
# 테스트 -> 성공 -> 접속

CREATE TABLE 테이블 이름
(
	컬럼이름 자료형
);

#ctrl + enter -> 한줄
#f5 -> 전체 스크립트 실행

#SELECT 조회할 칼럼 FROM 테이블;
SELECT name,age from friends;

INSERT 문법
INSERT INTO 테이블명
(
	컬럼1,
	컬럼2,
	컬럼3
) #생략가능
VALUES
(
	값1, ('홍길동')
	값2, (18)
	값3 ('서울')
);

#where 조건 (=if), 1=1 -> 항상 참, 모든 데이터 출력, and = 여러개
#and - 양쪽이 참일 때 참
#or - 한쪽이 참이여도 참
SELECT * from friends where age > 10;

#UPDATE 테이블명 SET 컬럼 = 값, 컬럼2 = 값, WHERE 조건;
UPDATE friends set addr = '서울' WHERE age>22;

#정렬
select * from friends order by age desc; #내림차순
select * from friends order by age; #오름차순
select * from friends order by addr asc desc; #내림차순
select * from friends order by addr, age desc;

시스템 테이블

  • DBMS에서 DB관리 목적 제공
  • 사용자 정보, 테이블 정보, 시스템 정보
  • 공격 시 공격 테이블 확인을 위해 사용
SELECT * from all_tables where owner ='C##TEST';
SELECT * from user_tables;
SELECT * from all_tab_columns where table_name = 'FRIENDS';

집계 함수

  • 특정 칼럼의 데이터 개수, 합, 최대값, 최소값 등 산술적인 연산이 필요한경우 함수를 사용하여 결과 출력
SELECT count(*) from friends where age > 22;
SELECT count(*) from all_tab_columns where table_name = 'FRIENDS';

#length(숫자) <- 숫자의 갯수
SELECT length(name) from friends;
SELECT length(age) from friends;

#()-> 서브 쿼리
select 컬럼 from (Select 컬럼 from 테이블 where 조건1) where 조건2
select name from (Select * from friends where age>20) where addr = '서울';

서브 쿼리

  • 문장 하부 절에 쿼리를 사용 , Inner Query 라고함
  • 연산자 오른쪽 위치, 괄호로 묶음
Create table member (ID varchar2(10), PASSWORD varchar(20));
INSERT INTO MEMBER(id,password) values('홍길동','1234');
INSERT INTO MEMBER(id,password) values('admin','root');

#if 입력한 id,pw 가지고 db 서치 -> 결과가 있으면 로그인
#else: 로그인 실패;

#결과
SELECT COUNT(*) from member where ID = "입력한 ID" AND PASSWORD = '입력한 PW';

#로그인 조건
if #결과 = 참:
	로그인
else:
	실패

SELECT COUNT(*) from member where ID = '홍길동' AND PASSWORD = '1234';

#인증 우회
SELECT * from member where ID = 'aaa' AND PASSWORD = 'aaa' or 1=1;

Stored Procedure

  • 저장 프로시저, 쿼리를 하나의 함수처럼 실행하기 위한 쿼리 집합

UNION SELECT

  1. 컬럼 수 추출 - null 갯수로 컬럼수 파악
  2. 데이터형을 추출 → 해당 컬럼이 문자형인지 숫자형인지
SELECT * from friends union select 1, null, null from dual
  1. 이제 원하는 데이터를 추출하기 위한 시스템 테이블의 정보 추출
    • ex) admin의 password 빼오기
  • 시스템 테이블
    • user_tables → 테이블 이름
    • all_tab_columns → 컬럼명 확인 가능 한 곳
반응형

'WEB' 카테고리의 다른 글

XSS 의 대응방안  (1) 2023.08.03
XSS  (4) 2023.05.15
profile

KGPstudio

@KGP-Admin

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!