안녕하세요. 회사원 해커 shiro입니다. 웹 해킹에 관한 글을 작성하려고 하는데 SQL 인젝션을 사용하는 것은 싫지만 뭔가가 없으면 아쉬워서 정리해보도록 하겠습니다. SQL 인젝션(SQL Injection)이란? 안녕하세요. 회사원 해커 shiro입니다. 웹 해킹에 관한 글을 작성하려고 하는데 SQL 인젝션을 사용하는 것은 싫지만 뭔가가 없으면 아쉬워서 정리해보도록 하겠습니다. SQL 인젝션(SQL Injection)이란?
SQL 인젝션은 웹 어플리케이션에서 사용자의 입력을 적절히 처리하지 않을 경우 발생하는 보안 취약점으로 공격자가 SQL 쿼리를 악의적으로 조작하여 데이터베이스의 데이터를 무단으로 접근, 수정 또는 삭제할 수 있도록 합니다. 이를 통해 공격자는 애플리케이션의 데이터를 훔치거나 변경할 수 있으며, 심지어 시스템을 장악할 수도 있습니다. 웹 해킹을 배우면 제일 먼저 배우는 공격인데 정말 엄청난 공격법이에요. 치명적인 만큼 SQL 인젝션의 방어는 거의 이루어지고 있습니다. (되어 있지 않은 웹사이트.. 있죠?)? 빨리 조치해주세요.) SQL 인젝션은 웹 어플리케이션에서 사용자의 입력을 적절히 처리하지 않을 경우 발생하는 보안 취약점으로 공격자가 SQL 쿼리를 악의적으로 조작하여 데이터베이스의 데이터를 무단으로 접근, 수정 또는 삭제할 수 있도록 합니다. 이를 통해 공격자는 애플리케이션의 데이터를 훔치거나 변경할 수 있으며, 심지어 시스템을 장악할 수도 있습니다. 웹 해킹을 배우면 제일 먼저 배우는 공격인데 정말 엄청난 공격법이에요. 치명적인 만큼 SQL 인젝션의 방어는 거의 이루어지고 있습니다. (되어 있지 않은 웹사이트.. 있죠?)? 빨리 조치해주세요.)
SQL 인젝션의 동작 원리 SQL 인젝션은 사용자의 입력이 SQL 쿼리에 직접 포함될 때 발생합니다. 예를 들어 로그인 시스템에서 입력된 사용자 이름과 암호를 데이터베이스에서 조회하기 위해 다음과 같은 쿼리가 실행된다고 가정합니다. SQL 인젝션의 동작 원리 SQL 인젝션은 사용자의 입력이 SQL 쿼리에 직접 포함될 때 발생합니다. 예를 들어 로그인 시스템에서 입력된 사용자 이름과 암호를 데이터베이스에서 조회하기 위해 다음과 같은 쿼리가 실행된다고 가정합니다.
사용자명 =’shiro’와 패스워드 = ‘password123’을 선택합니다; 사용자명 =’shiro’와 패스워드 = ‘password123’을 선택합니다;
이 경우 공격자가 비밀번호 입력란에 “OR’1” = “1”과 같은 입력을 넣으면 쿼리는 다음과 같이 변형됩니다. 이 경우 공격자가 비밀번호 입력란에 “OR’1” = “1”과 같은 입력을 넣으면 쿼리는 다음과 같이 변형됩니다.
사용자명 =’admin’과 패스워드 = ”’ 또는 ”’1”’을 선택합니다; 사용자명 =’admin’과 패스워드 = ”’ 또는 ”’1”’을 선택합니다;
이 변경된 쿼리는 항상 인내심을 돌려주기 때문에 비밀번호 없이 로그인할 수 있습니다. SQL 인젝션은 이렇게 서버가 사용자의 입력을 쿼리의 일부로 처리하는 방식에서 발생하는 문제입니다. 이 변경된 쿼리는 항상 인내심을 돌려주기 때문에 비밀번호 없이 로그인할 수 있습니다. SQL 인젝션은 이렇게 서버가 사용자의 입력을 쿼리의 일부로 처리하는 방식에서 발생하는 문제입니다.
SQL 인젝션 취약점 찾기 SQL 인젝션 취약점을 찾기 위해서는 서버가 입력을 어떻게 처리하는지 알아보는 것이 중요합니다. 이를 위해 몇 가지 기본적인 방법을 사용할 수 있습니다. 1. 특수문자 주입을 통한 쿼리 구조 확인 SQL 쿼리 구조가 깨질 수 있는 특수문자를 입력하여 어플리케이션이 어떻게 반응하는지 확인하는 방법입니다. 주로 다음과 같은 특수문자를 시도할 수 있습니다. SQL 인젝션 취약점 찾기 SQL 인젝션 취약점을 찾기 위해서는 서버가 입력을 어떻게 처리하는지 알아보는 것이 중요합니다. 이를 위해 몇 가지 기본적인 방법을 사용할 수 있습니다. 1. 특수문자 주입을 통한 쿼리 구조 확인 SQL 쿼리 구조가 깨질 수 있는 특수문자를 입력하여 어플리케이션이 어떻게 반응하는지 확인하는 방법입니다. 주로 다음과 같은 특수문자를 시도할 수 있습니다.
No language detected.
Please check the input language, no language detected.
Please check the input language.
For example, if a database error occurs when you enter ‘ ‘ , the application is likely to be vulnerable to SQL injection. This special character changes the string and logical structure of the query, which helps you see how the query is handled. “Why does it work like this? US>’ plays the role of closing strings in SQL. Therefore, a value entered without a small quotation mark to close breaks the query grammar and causes an error — is an SQL annotation, and subsequent content is ignored. This allows you to execute only the desired syntax. 2. A method of determining vulnerabilities using logical operations is to inject specific logical operators into the query to determine if expected results are obtained. For example?id=1? If you change to id=1 OR1=1, the query changes as follows. For example, if a database error occurs when you enter ‘ ‘ , the application is likely to be vulnerable to SQL injection. This special character changes the string and logical structure of the query, which helps you see how the query is handled. “Why does it work like this? US>’ plays the role of closing strings in SQL. Therefore, a value entered without a small quotation mark to close breaks the query grammar and causes an error — is an SQL annotation, and subsequent content is ignored. This allows you to execute only the desired syntax. 2. A method of determining vulnerabilities using logical operations is to inject specific logical operators into the query to determine if expected results are obtained. For example?id=1? If you change to id=1 OR1=1, the query changes as follows.
ID = 1 or From users with 1 = 1 * Select ; ID = 1 or From users with 1 = 1 * Select ;
Because 1=1 is always true, this query can return all lines. If the server allows this, it is likely to be vulnerable to SQL injection. Why does it work like this? Since OR1=1 is always true, ignore the conditions in the WHERE clause and allow all data to be read. This method is useful for determining how a query works through logical operations. 3. If blind SQL injection results using time delay are invisible, time-based attacks can be used to identify SQL injection vulnerabilities. If the page load time is delayed by deliberately delaying the query execution time, this signal indicates a SQL injection vulnerability, for example, using the following query You can delay the response for 10 seconds. Because 1=1 is always true, this query can return all lines. If the server allows this, it is likely to be vulnerable to SQL injection. Why does it work like this? Since OR1=1 is always true, ignore the conditions in the WHERE clause and allow all data to be read. This method is useful for determining how a query works through logical operations. 3. If blind SQL injection results using time delay are invisible, time-based attacks can be used to identify SQL injection vulnerabilities. If the page load time is delayed by deliberately delaying the query execution time, this signal indicates a SQL injection vulnerability, for example, using the following query You can delay the response for 10 seconds.
1′ and sleep (10) — 1′ and sleep (10) —
This query instructs the database to wait for 10 seconds, and if the page load time is delayed by more than 10 seconds, the page is vulnerable to SQL injection. Why does it work like this? The SLEEP() function is a function that delays the execution of a query for a specified amount of time. This allows you to determine if the attack was successful even in situations where the results are not visible. This query instructs the database to wait for 10 seconds, and if the page load time is delayed by more than 10 seconds, the page is vulnerable to SQL injection. Why does it work like this? The SLEEP() function is a function that delays the execution of a query for a specified amount of time. This allows you to determine if the attack was successful even in situations where the results are not visible.
SQL Injection Attack Techniques There are many ways to extract data or perform attacks using SQL Injection. 1. Union-based SQL injection Union-based SQL injection is a method of combining multiple query results to allow an attacker to return the desired data. For example, you can use the following queries to extract sensitive data. SQL Injection Attack Techniques There are many ways to extract data or perform attacks using SQL Injection. 1. Union-based SQL injection Union-based SQL injection is a method of combining multiple query results to allow an attacker to return the desired data. For example, you can use the following queries to extract sensitive data.
1′ UNION SELECT null, username, password from users — 1′ UNION SELECT null, username, password from users —
This query is responsible for extracting user names and passwords from the users table. Why does it work like this? UNION combines two SELECT queries and returns them as a result. This allows users to add the data they need to their existing query results. 2. Blind SQL injection is available in situations where blind SQL injection results are not immediately displayed. This method is to extract data based on whether it is true or false by adding conditions one at a time. This query is responsible for extracting user names and passwords from the users table. Why does it work like this? UNION combines two SELECT queries and returns them as a result. This allows users to add the data they need to their existing query results. 2. Blind SQL injection is available in situations where blind SQL injection results are not immediately displayed. This method is to extract data based on whether it is true or false by adding conditions one at a time.
?id=1 AND 서브스트링(((((선택 테이블_이름 FROM information_schema.tables LIMIT 1), 1, 1) = ‘A’ ?id=1 AND 서브스트링((((선택 테이블_이름 FROM information_schema.tables LIMIT 1), 1, 1) = ‘A’
이 쿼리는 테이블 이름의 첫 글자가 ‘A’인지 확인합니다. 참인 경우 특정 응답을 나타내고 그렇지 않은 경우 다른 응답을 나타낼 수 있습니다. 왜 이렇게 동작하지? SUBSTRING() 함수를 사용하여 테이블명을 한 글자씩 추출할 수 있으며, 조건문을 사용하여 데이터를 순서대로 비교하면서 데이터를 수집합니다. 3. 오류 기반 SQL 인젝션 응용 프로그램이 SQL 오류 메시지를 반환하는 경우 이 오류 메시지에서 데이터베이스 정보를 추출할 수 있습니다. 예를 들어, 다음 쿼리는 데이터베이스 버전을 추출하는 데 사용할 수 있습니다. 이 쿼리는 테이블 이름의 첫 글자가 ‘A’인지 확인합니다. 참인 경우 특정 응답을 나타내고 그렇지 않은 경우 다른 응답을 나타낼 수 있습니다. 왜 이렇게 동작하지? SUBSTRING() 함수를 사용하여 테이블명을 한 글자씩 추출할 수 있으며, 조건문을 사용하여 데이터를 순서대로 비교하면서 데이터를 수집합니다. 3. 오류 기반 SQL 인젝션 응용 프로그램이 SQL 오류 메시지를 반환하는 경우 이 오류 메시지에서 데이터베이스 정보를 추출할 수 있습니다. 예를 들어, 다음 쿼리는 데이터베이스 버전을 추출하는 데 사용할 수 있습니다.
information_schema.table에서 1AND(선택 카운트(*), CONCAT((((선택 @version)), Flour(RAND(*))를 선택하고; information_schema.table에서 1AND(선택 카운트(*), CONCAT(((선택 @version)), Flour(RAND(*))를 선택합니다;
이 쿼리는 오류 메시지에 데이터베이스 버전을 포함하여 반환할 수 있습니다. 왜 이렇게 동작을 하는 거지? 쿼리 오류 메시지를 통해 서버의 내부 정보를 노출시킬 수 있습니다. 이를 통해 데이터베이스 구조나 버전을 특정할 수 있습니다. 이 쿼리는 오류 메시지에 데이터베이스 버전을 포함하여 반환할 수 있습니다. 왜 이렇게 동작을 하는 거지? 쿼리 오류 메시지를 통해 서버의 내부 정보를 노출시킬 수 있습니다. 이를 통해 데이터베이스 구조나 버전을 특정할 수 있습니다.
대응책 대응책
SQL 인젝션을 방어하기 위해서는 애플리케이션에서 사용자 입력을 안전하게 처리하는 것이 중요합니다. 1. 입력값 검증 모든 사용자 입력은 철저히 검증하고 특수문자는 이스케이프 처리해야 합니다. 이를 통해 쿼리의 잘못된 변경을 방지할 수 있습니다. 2. Prepared Statements 사용 Prepared Statements는 SQL 쿼리와 사용자 입력 데이터를 분리하여 SQL 인젝션을 원천적으로 차단하는 방법입니다. 예를 들어 다음과 같이 작성할 수 있습니다. SQL 인젝션을 방어하기 위해서는 애플리케이션에서 사용자 입력을 안전하게 처리하는 것이 중요합니다. 1. 입력값 검증 모든 사용자 입력은 철저히 검증하고 특수문자는 이스케이프 처리해야 합니다. 이를 통해 쿼리의 잘못된 변경을 방지할 수 있습니다. 2. Prepared Statements 사용 Prepared Statements는 SQL 쿼리와 사용자 입력 데이터를 분리하여 SQL 인젝션을 원천적으로 차단하는 방법입니다. 예를 들어 다음과 같이 작성할 수 있습니다.
カーソル。execute(“사용자 이름 = %s 및 비밀번호 = %s”, (username、パスワード) カーソル。execute(“사용자 이름 = %s 및 비밀번호 = %s”, (username、パスワード)
이 방식은 동적 쿼리를 사용하는 대신 쿼리 구조를 고정하고 데이터만 안전하게 입력하도록 하여 SQL 인젝션을 방지합니다. 3. 에러 메시지를 숨기는 SQL 에러 메시지가 외부로 노출되지 않도록 하여 공격자가 데이터베이스 구조를 추론할 수 없도록 해야 합니다. 오류 메시지를 숨기거나 일반적인 오류 메시지를 사용자에게 표시하는 것이 좋습니다. 이 방식은 동적 쿼리를 사용하는 대신 쿼리 구조를 고정하고 데이터만 안전하게 입력하도록 하여 SQL 인젝션을 방지합니다. 3. 에러 메시지를 숨기는 SQL 에러 메시지가 외부로 노출되지 않도록 하여 공격자가 데이터베이스 구조를 추론할 수 없도록 해야 합니다. 오류 메시지를 숨기거나 일반적인 오류 메시지를 사용자에게 표시하는 것이 좋습니다.
SQL 인젝션은 웹 어플리케이션에서 가장 흔하게 발생하는 보안 취약점 중 하나이며 그 영향도 매우 큽니다. SQL 인젝션의 동작 원리와 이를 찾는 방법을 이해하면 버그 바운티와 같은 보안 검증 과정에서 중요한 취약점을 발견할 수 있습니다. 또한 SQLMap과 같은 툴을 활용하여 자동으로 SQL 인젝션을 탐지하고 공격할 수 있으며, 치트시트를 제공하는 다양한 사이트가 존재하기 때문에 활용하여 더 많은 SQL 인젝션 기법을 배울 수 있습니다. 참고: https://portswigger.net/web-security/sql-injection/cheat-sheet SQL 인젝션은 웹 어플리케이션에서 가장 흔하게 발생하는 보안 취약점 중 하나이며 그 영향도 매우 큽니다. SQL 인젝션의 동작 원리와 이를 찾는 방법을 이해하면 버그 바운티와 같은 보안 검증 과정에서 중요한 취약점을 발견할 수 있습니다. 또한 SQLMap과 같은 툴을 활용하여 자동으로 SQL 인젝션을 탐지하고 공격할 수 있으며, 치트시트를 제공하는 다양한 사이트가 존재하기 때문에 활용하여 더 많은 SQL 인젝션 기법을 배울 수 있습니다. 참고: https://portswigger.net/web-security/sql-injection/cheat-sheet
SQL 인젝션 치트 시트 | Web Security Academy 입니다 이 SQL 인젝션 치트 시트는 SQL을 수행할 때 자주 발생하는 다양한 작업을 수행하는 데 사용할 수 있는 편리한 구문의 예가 포함되어 있습니다… portswigger.net SQL 인젝션 치트 시트 | Web Security Academy 입니다 이 SQL 인젝션 치트 시트는 SQL을 수행할 때 자주 발생하는 다양한 작업을 수행하는 데 사용할 수 있는 편리한 구문의 예가 포함되어 있습니다… portswigger.net
긴 글 읽어주셔서 감사합니다! 긴 글 읽어주셔서 감사합니다!