'll Hacker
3주차 강의. 모의해킹 대비 OWASP top 10으로 뽀개기 심화스터디 본문
A03 : Injection
💚사용자가 제공한 데이터가 검증(필터링)하지 않은 경우,
💚SQL 쿼리 등을 작성할 때 사용자 입력값을 직접 문자열로 붙이는 방식으로 쿼리를 만드는 경우,
💚 파라미터화가 아닌 동적 쿼리 방식을 사용하는 경우,
용어정리⏬
1. 동적쿼리
- 애플리케이션에서 실행 중에 쿼리 문자열을 생성하는 방식
2. 쿼리 문자열
- 사용자 입력 등에 따라 실시간으로 쿼리의 내용이 변경될 수 있음.
- SQL 쿼리를 작성할 때 사용자의 입력값을 직접 쿼리에 삽입하는 경우가 이에 해당한다.
3. 이스케이프
- 입력값이 쿼리의 일부분으로 해석되지 않고 문자 그대로 처리되도록 하기 위한 방법이다.
- 쿼리나 코드에서 특수문자나 입력값이 의도하지 않은 방식으로 해석되지 않도록 처리
예를 들어, 사용자가 입력하는 값에 쿼리와 관련된 특수문자가 포함된 경우,
SELECT * FROM users WHERE username='사용자입력값';
이 쿼리에서 username 자리에 사용자의 입력값이 들어가는데, 만약 사용자가 여기에 특수문자를 삽입했을 때
예를들어서 ' OR 1=1 -- 이걸 삽입한다 하면 최종쿼리는 SELECT * FROM users WHERE username=' ' OR 1=1 --';
💚 OM 라이브러리(ex: Hibernate, SQLAlchemy)에서도 사용자 입력이 적절히 필터링되지 않으면 ORM 쿼리를 조작할 수 있음.
특정검색 조건을 조작하여 원래 보여주지 않아야 할 민감한 정보까지 조회가 가능하다.
💚 사용자 입력이 애플리케이션 코드에서 SQL이나 시스템 명령어에 그대로 합쳐져 사용되는 경우
예를 들면 os.system("rm -rf" + user_input) 이 있다.
입력값을 통해 시스템 명령어 조작이 가능하면 OS Command Injection 발생한다.
다양한 종류의 인젝션 공격이 존재한다.
SQL injection : 데이터베이스 쿼리 조작
NoSQL injection : MongoDB 등에서 쿼리 조작
OS Command Injection : 시스템 명령어 조작
ORM Injection : ORM 라이브러리 조작
LDAP Injection : 디렉터리 검색 쿼리 조작
EL/OGNL Injection : 표현 언어(주로 Java에서 사용되는 EL, OGNL 등 ) 조작
이를 통해 SQL이든 OS든 어떤 인터프리터를 사용하든, 사용자 입력이 코드에 섞여 실행되면 Injection은 발생할 수 있다.
인젝션 취약점을 가장 잘 찾는 방법은 소스코드를 직접 분석하는 것임. 자동화된 도구를 이용해 다양한 입력 지점(URL, 쿠키, API 입력 등)을 테스트하는 것이 중요하다.
조직은 아래와 같은 자동화된 보안 도구를 CI/CD에 포함시켜야 한다:
- SAST(정적 분석) : 코드를 실행하지 않고 분석
- DAST(동적 분석) : 실행 중인 애플리케이션을 테스트
- IAST(인터랙티브 분석) : 실행 중인 코드에 센셔를 삽입해 내부 흐름 분석
Injection 공격 시나리오
#1.
String query = "SELECT * FROM accounts WEHRE custID='"+request.getParameter("id")+"'";
이 코드는 웹 애플리케이션에서 id라는 파라미터를 받아서, 직접 SQL 쿼리에 붙이는 방식이다.
하지만 문제점은 id에 악의적인 값을 넣으면 쿼리 전체가 조작될 수 있다. 따라서 사용자 입력을 검증하지 않고 직접 쿼리에 삽입하는 것이 문제이다.
#2.
Query HQLQuery = session.createQuery("FROM accounts WHERE custId='"+request.getParameter("id")+"'");
이 코드는 Java에서 사용하는 ORM 프레임워크 Hibernate의 쿼리이다.
하지만 여전히 사용자 입력값을 직접 쿼리에 붙여서 사용하는 구조이기 때문에 취약하다.
' UNION SELECT SLEEP(10);--
공격자가 위와 같은 쿼리를 넣었을 때
최종적으로 다음과 같이 실행된다.
SELECT * FROM accounts WHERE custID='' UNION SELECT SLEEP(10);--
-- 는 SQL에서 주석처리를 의미한다. 따라서 그 뒤의 문장은 무시가 된다. SLEEP(10) 은 데이터베이스 서버에게 10초동안 대기하라는 명령이다.
이 쿼리는 시스템 반응이 10초 이상 지연되면, 인젝션이 성공했다는 것을 간접적으로 알 수 있다. 이것을 Time-based Blind SQL Injection이라고 한다.
더 위험한 공격은 다음과 같다.
안알려줌 ㅋ
주목할만한 공통적 CWE는 CWE-79, CWE-89, CWE-73 이다.
CWE-79 : Cross-site Scripting (XSS)
웹페이지 이용자를 대상으로 공격할 수 있는 취약점이다.
공격자가 웹 리소스에 악성 스크립트를 삽입해 이용자의 웹 브라우저에서 해당 스크립트를 실행가능하다. 예를들어 어떤 홈페이지에서 XSS 취약점이 존재하면 https://example.com 내에서 오리진 권한으로 악성 스크립트를 삽입한다. 이후에 이용자가 악성 스크립트가 포함된 페이지를 방문하면 공격자가 임의로 삽입한 스크립트가 실행되어 쿠키 및 세션이 탈취될 수 있다.
하지만 SOP 보안 정책이 등장하면서 서로 다른 오리진에서는 정보를 읽는 행위가 점점 힘들어졌다고 한다..!!
우회하는 다양한 기법이 나오면서 XSS공격은 지속적으로 이루어지고 있다.
XSS 공격은 이용자가 삽입한 내용을 출력하는 기능에서 발생한다. 예로는 로그인 시 출력되는 "안녕하세요, 회원님!" 과 같은 문구 또는 게시물과 댓글이 있다.
클라이언트는 HTTP 형식으로 웹 서버에 리소스를 요청하고 서버로부터 받은 응답, 즉 HTML, CSS, JS 등의 웹리소스를 시각화하여 이용자에게 보여준다. 이때, HTML, CSS, JS와 같은 코드가 포함된 게시물을 조회할 경우 이용자는 변조된 페이지를 보거나 스크립트가 실행될 수 있다.
XSS 종류
- Stored XSS : XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS
서버의 데이터베이스 또는 파일 등의 형태로 저장된 악성 스크립트를 조회할 때 발생한다.
게시물과 댓글에 악성 스크립트를 포함해서 업로드하는 방식을 주로 사용한다. - Reflected XSS : XSS에서 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS
게시판 서비스에서 작성된 게시물을 조회하기 위한 검색창에서 스크립트를 포함해 검색하는 방식이 있다.
이용자가 게시물을 검색하면 서버에서는 검색 결과를 이용자에게 반환한다.
URL과 같은 이용자의 요청에 의해 발생한다. 공격을 위해서는 다른 이용자를 악성 스크립트가 포함된 링크에 접속하도록 유도해야한다. 주로 Click Jacking 또는 Open Redirect 등 공격기법을 사용할 수도 있다. - DOM-based XSS : XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS
* Fragment는 서버 요청/응답에 포함되지 않는다. - Universal XSS : 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS
XSS 스크립트의 예시
자바스크립트는 웹 문서의 동작을 정의한다. 이는 이용자가 버튼 클릭 시에 어떤 이벤트를 발생시킬지와 데이터 입력 시 해당 데이터를 전송하는 이벤트를 구현할 수 있다. 이러한 기능 외에도 이용자와의 상호 작용없이 이용자의 권한으로 정보를 조회하거나 변경하는 등의 행위가 가능하다. 왜냐하면 이용자를 식별하기 위한 세션 및 쿠키가 웹 브라우저에 저장되어 있기 때문이다. 따라서, 공격자는 자바스크립트를 통해 이용자에게 보여지는 웹페이지를 조작하거나, 웹브라우저의 위치를 임의의 주소로 변경할 수 있다.
그래서 자바스크립트는 XSS공격에 주로 사용된다. 자바스크립트를 실행하기 위한 태그로는 <script>가 있다.
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
Cross-Site Scripting (XSS) Cheat Sheet - 2025 Edition | Web Security Academy
Interactive cross-site scripting (XSS) cheat sheet for 2025, brought to you by PortSwigger. Actively maintained, and regularly updated with new vectors.
portswigger.net
위 링크에서 우회기법 등 포함된다.
내용 출처: 드림핵
CWE-89 : SQL Injection
컴퓨터도 정보를 기록하기 위해 데이터베이스를 사용한다. 그리고 데이터베이스를 관리하는 애플리케이션은 DataBase Management System (DBMS) 이라고 한다.
Database Management System
웹 서비스는 데이터베이스에 정보를 저장하고, 이를 관리하기 위해 DBMS를 사용한다. DBMS는 데이터베이스에 새로운 정보를 기록하거나, 기록된 내용을 수정, 삭제하는 역할을 한다. DBMS는 다수의 사람이 동시에 데이터베이스에 접근할 수 있고, 웹 서비스의 검색 기능과 같이 복잡한 요구사항을 만족하는 데이터를 조회할 수 있다.
DBMS는 관계형과 비관계형을 기준으로 분류하며, 다양하게 존재한다.
- 관계형(RDBMS) - MySQL, MariaDB, PostgreSQL, SQLite
- 비관계형 - MongoDB, CounchDB, Redis
관계형은 행과 열의 집합인 테이블 형식으로 데이터를 저장하고, 비관계형은 테이블 형식이 아닌 키-값(Key-value) 형태로 값을 저장한다.
RDBMS는 SQL이라는 쿼리 언어를 사용한다. 쿼리를 통해 테이블 형식의 데이터를 조작한다.
SQL은 RDBMS의 데이터를 정의하고, 질의, 수정 등을 하기 위해서 고안되었다. SQL은 DDL, DML, DCL로 구분된다. DDL은 데이터를 정의하기 위한 언어로, 데이터를 저장하기 위한 스키마, 데이터베이스의 생성/수정/삭제 등의 행위를 수행한다. DML은 데이터를 조회/저장/수정/삭제 등의 행위를 수행한다. DCL은 DB의 접근 권한 등의 설정을 하기 위한 언어로, 데이터베이스 내에 이용자의 권한을 부여하기 위한 GRANT와 권한을 박탈하는 REVOKE가 있다.
웹서비스는 이용자의 입력을 SQL 구문에 포함해 요청하는 경우가 있다. 예를 들면, 로그인이나 게시물과 댓글이 해당된다.
데이터베이스의 데이터를 알아내고자 하는 악의적인 행위는 Blind SQL injection이 있다. 질의 결과를 이용자가 화면에서 직접 확인하지 못할 때 참/거짓 반환 결과로 데이터를 획득하는 공격기법이다.
'Hacking > EVI$ION(교내 해킹동아리)' 카테고리의 다른 글
4주차 강의. 모의해킹 대비 OWASP top 10으로 뽀개기 심화스터디 (2) | 2025.05.24 |
---|---|
2주차 강의. 모의해킹 대비 OWASP top 10으로 뽀개기 심화스터디 (3) | 2025.05.19 |
1주차 강의. 모의해킹 대비 OWASP top 10으로 뽀개기 심화스터디 (1) | 2025.05.17 |
0주차 강의. OT 모의해킹 대비 OWASP top 10으로 뽀개기 심화스터디 (1) | 2025.05.12 |