출처: https://dreamhack.io/lecture/curriculums/1
webhacking강의
SQL Injection 공격 기법
- Logic
- Union
- Subquery
- Error Based
- Blind
SQL DML 구문에 대한 이해
- SELECT
- UPDATE
- INSERT
- DELETE
Exploit Technique
- DBMS Fingerprinting
- System Tables
- WAF Bypass
- Out Of DBMS
- DBMS 주의사항
Logic
논리 연산을 이용한 공격 방법입니다. 대표적인 논리 연산자로는 and 연산과 or 연산이 있습니다.
A B A && B (and 연산) A || B (or 연산)
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
0 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
위 연산표와 같이 and 연산은 모든 조건이 참인 경우에만 결과가 참이 되지만, or 연산은 하나의 조건이라도 참이 되는 경우 결과는 참이 됩니다.
0: 거짓
1: 참
SELECT uid FROM UserTable WHERE username="admin" or 1;
username이 admin이거나 1(참)인 경우: 항상 참 -> 모든 데이터 반환
Union
SELECT 구문의 Union 절을 이용한 공격 방법입니다. Union 절은 다수의 SELECT 구문의 결과를 결합시키는 행위를 수행합니다.
union: 데이터 합치기
SELECT * FROM UserTable
UNION SELECT "DreamHack", "DreamHack PW";
/*+-----------+--------------+
| username | password |
+-----------+--------------+
| admin | admin |
|guest | guest |
|DreamHack | DreamHack PW |
+-----------+--------------+
3 rows in set (0.01 sec)*/
유저 테이블에 Dreamhack과 DreamHack PW를 추가했다.
원하는 다른 테이블에 접근하거나 원하는 쿼리 결과 데이터를 생성하여 어플리케이션에서 처리되는 데이터를 조작할 수 있습니다.
union 조건:
- 이전 SELECT 구문 과 UNION SELECT 구문의 결과 컬럼의 수가 같아야 합니다.
SELECT * FROM UserTable
UNION SELECT "DreamHack", "DreamHack PW", "Third Column";
유저테이블은 컬럼이 두개인데 컬럼 3개를 유저테이블에 붙여넣을 수 없다(당연)
- 특정 DBMS에서 사용 시 이전 컬럼과 UNION SELECT 구문의 컬럼의 타입이 같아야 합니다.
# MSSQL (SQL Server)
SELECT 'ABC'UNION SELECT 123;
문자열 타입인데 정수형 타입을 붙여넣을 수 없다.
퀴즈
1. 사용자 목록 획득하기
1번 방법
uid=guest' or '1
upw=guest' or '1
Select uid from user_table where uid='guest' or '1' and upw='guest' or '1'
where이 참이므로 모든 데이터 출력
or은 문자열로 묶지 않아도 된다. 1은 문자열로 묶어주어야한다.
2번 방법
uid=1' or '1
upw=1' or '1
Select uid from user_table where uid='1' or '1' and upw='1' or '1'
2. admin의 비밀번호 획득하기
uid=' union select upw from user_table where uid='admin' or '
upw=
Select uid from user_table where uid='' union select upw from user_table where uid='admin' or '' and upw=''
결과값
Uid
Tomato |
uid가 ''인 테이블은 없다. 여기에 union으로 user_table의 admin 비밀번호를 추가했다.
명령어? 이므로 '로 묶이면 안된다. 마지막에 or '을 쓴 이유는 '을 묶어주기 위해서일까 ????!!!!?!!??!? 짬처리?
명령어 단위를 모르겠다. 내 생각에는 Select uid from user_table where uid='' union select upw from user_table where uid='admin' or '' and upw=''
이렇게 묶이는 것 같다.
uid=' union select upw from user_table where uid='admin
upw=
where uid='' union select upw from user_table where uid='admin' and upw=''
이건 실행이 안되는데..
db공부를 안해서 ㅠㅠㅠㅠ 3학년때 배우는데 2학기때 배워야하나 ..ㅠ.ㅠ.
Subquery
서브 쿼리는 하나의 쿼리 내에 또 다른 쿼리를 사용하는 것을 의미합니다.
https://cloud.google.com/bigquery/docs/reference/standard-sql/subqueries?hl=ko
( ) 형식이고 select 문이다.
# Main QeurySELECT 1,2,3,(SELECT 456);
서브 쿼리를 이용하여 메인 쿼리가 접근하는 테이블이 아닌 다른 테이블에 접근하거나,
SELECT 구문이 아닌 구문에서 SQL Injection이 발생하여도 서브 쿼리의 SELECT 구문을 사용하여
테이블의 데이터에 접근할 수 있습니다.
- COLUMNS Clause
여러개의 행을 붙이거나 여러개의 컬럼을 붙일 수 없다.
- FROM Clause (Inline View)
FROM 절에서 사용되는 서브 쿼리를 Inline View라고 칭합니다.
Inline View에서는 다중 행(Multiple Row), 다중 컬럼(Multiple Column)의 결과를 사용할 수 있습니다.
결과값을 가져오는 것이므로 여러 행이나 여러 컬럼 가져오기 가능
- WHERE Clause
WHERE 절에서 사용 시 조건 검색을 위해 다중 행(Multiple Row)의 결과를 사용할 수 있습니다.
admin과 guest 테이블 합쳐서 username 검색하기
Error Based
에러 베이스는 사용자가 임의적으로 에러를 발생시켜 정보를 획득하는 공격 기법입니다.
from flask import Flask, request
import pymysql
app = Flask(__name__)
def getConnection():
return pymysql.connect(host='localhost', user='dream', password='hack', db='dreamhack', charset='utf8')
@app.route('/' , methods=['GET'])
def index():
username = request.args.get('username')
sql = "select username from users where username='%s'" %username //사용자 입력 바로 받음. sql injection 가능
conn = getConnection()
curs = conn.cursor(pymysql.cursors.DictCursor)
curs.execute(sql)
rows = curs.fetchall()
conn.close()
if (rows): //결과 직접 출력X
return "True"
else: return "False"
app.run(host='0.0.0.0', port=8000, debug=True) //디버그 모드 설정 -> 에러 메세지 출력
위와 같이 쿼리 결과가 직접적으로 출력되지 않으며 에러 메시지가 노출되는경우
에러 메시지를 통해 주요 정보를 노출시키는 방법들이 존재합니다.
해당 방법들을 사용하여 Error Based SQL Injection을 성공적으로 활용하기 위해서는
Syntax Error와 같이 DBMS에서 해당 쿼리가 실행되기 전에 검증 가능한 에러가 아닌, Runtime 중에 발생하는 에러가 필요합니다.
아래 SQL 쿼리는 MySQL 에서 Error Based SQL Injection을 위해 많이 사용되는 공격 형태 중 하나입니다.
extractvalue 함수란:
extractvalue 함수는 첫번째 인자에 존재하는 xml 데이터에서 두번째 인자의 XPATH 식을 통해 데이터를 추출하는 함수입니다. 하지만 두번째 인자에 올바르지 않은 XPATH 식을 입력하게 되면 올바르지 않은 XPATH 식이라는 에러와 함께 해당 인자가 함께 출력되기 때문에 이를 이용한 공격 기법입니다.
:abcd는 XPATH식이 아니므로 에러 메세지에 나타난다.
서브 쿼리를 통해 원하는 테이블의 데이터를 추출할 수도 있습니다.
concat함수 : 문자열 합치기https://extbrain.tistory.com/52
0x3A는 아스키코드 문자로 : 를 나타낸다. (올바르지않은 XPATH를 만들기 위해)
MySQL
0x0a는 줄바꿈 아스키문자
https://dojang.io/mod/page/view.php?id=740
Blind
Blind SQL Injection은 데이터베이스 조회 후 결과를 직접적으로 확인할 수 없는 경우 사용될 수 있는 공격 기법입니다.
Blind SQL Injection 기법의 원리는 DBMS의 함수 또는 연산 과정 등을 이용해 데이터베이스 내에 존재하는 데이터와 사용자 입력을 비교하며, 특정한 조건 발생 시 특별한 응답을 발생시켜 해당 비교에 대한 검증을 수행합니다.
Blind SQL Injection을 수행하기 위해서는 다음 조건이 만족되어야 합니다.
- 데이터를 비교해 참/거짓을 구분
- 참/거짓의 결과에 따른 특별한 응답 생성
데이터를 비교하여 참/거짓을 구분하는 구문으로 If Statements를 많이 사용합니다. 사용 예시는 아래와 같습니다.
mysql: select문 if(조건,참일때 출력값, 거짓일때 출력값)
http://www.webmadang.net/database/database.do?action=read&boardid=4003&page=1&seq=27
Application Logic
데이터베이스의 결과를 받은 어플리케이션에서 결과 값에 따라 다른 행위를 수행하게 되는 점을 이용해 참과 거짓을 구분하는 방법입니다.
from flask import Flask, request
import pymysql
app = Flask(__name__)
def getConnection():
return pymysql.connect(host='localhost', user='dream', password='hack', db='dreamhack', charset='utf8')
@app.route('/' , methods=['GET'])
def index():
username = request.args.get('username')
sql = "select username from users where username='%s'" %username //입력값 그대로 출력, sql injection 가능
conn = getConnection()
curs = conn.cursor(pymysql.cursors.DictCursor)
curs.execute(sql)
rows = curs.fetchall()
conn.close()
if(rows[0]['username'] == "admin"): //username이 admin이면 True 아니면 False
return "True" else: return "False"
app.run(host='0.0.0.0', port=8000)
위 코드는 username에 의해 SQL Injection이 발생하며, 데이터베이스의 결과인 username이 admin인 경우에는 사용자에게 "True"가 반환되고, 아닌 경우에는 "False"가 반환됩니다.
- UNION 구문을 이용해 "admin" 반환
- IF Statements 및 비교 구문 추가(비밀번호 알아내기)
/?username=' union select if(substr(password,1,1)='A', 'admin', 'not admin') from users where username='admin' -- -==> False //password 첫 문자가 A이면 admin, 아니면 not admin --> True 또는 False 출력
/?username=' union select if(substr(password,1,1)='B', 'admin', 'not admin') from users where username='admin' -- -==> False
...
/?username=' union select if(substr(password,1,1)='P', 'admin', 'not admin') from users where username='admin' -- -==> True //admin의 password의 첫문자는 P
...
/?username=' union select if(substr(password,2,1)='a', 'admin', 'not admin') from users where username='admin' -- -==> True//admin의 password의 두번째 문자는 a
substr은 첫번째 인자의 문자열을 두번째 인자의 index부터 세번째 인자의 길이만큼 반환하는 함수입니다.
즉, substr(password,1,1) 실행 시 "admin"의 패스워드 첫번째 문자열인 "P"가 반환되며, 사용자는 각 문자열을 입력하며 비교합니다.
사용자 입력 문자 중 "P"문자 입력 시 조건이 참이되며, 사용자에게 "True"가 출력되어집니다. 이를 통해 사용자는 password의 첫번째 문자열이 "P"임을 알 수 있습니다.
위와 같은 방법으로 index를 변경하며 password 전체를 획득할 수 있습니다.
퀴즈
비번 알아내기
union select from where 이용
하나씩 다 대입해보기
blind sql injection
근데 blind이므로 값을 알 수 없다. 하나씩 대입해보아야한다.
uid과 (upw는 바로 전부 알 수 없기 때문에) substr을 이용하여 한 단어씩 대입해본다. --> 한 쌍을 만든다.
처음은 p
Time Based
Time Based Blind SQL Injection은 시간 지연을 이용해 참/거짓 여부를 판단합니다.
시간지연을 발생시키는 방법으로는 DBMS에서 제공하는 함수를 이용하거나, 무거운 연산과정을 발생시켜 쿼리 처리 시간을 지연시키는 heavy query 등이 존재합니다.
benchmark 함수, heavy query 등과 같이 DBMS에서 기본적으로 제공하는 시간 지연함수가 아닌 경우에는 대상 시스템의 성능, 환경 등에 따라 지연 시간이 다르게 동작할 수도 있습니다.
sleep(1) : 1초동안 중단 --> 시간 지연 발생
시간 지연
MySQL
- sleep 함수
- benchmark 함수 --benchmark(count, expr) -> expr을 count만큼 실행
expr 식을 count 수만큼 실행하며 시간지연이 발생합니다.
SHA1(1)
- heavy query
information_schema.tables테이블은 MySQL에서 기본적으로 제공하는 시스템 테이블입니다.
(자세한 내용은 시스템 테이블 페이지에서 자세히 다룹니다.) 기본적으로 많은 수의 데이터가 포함되어 있는 테이블입니다. information_schema.tables과 같이 많은 수의 데이터가 포함된 테이블을 연산 과정에 포함시켜 시간을 지연시킵니다.
충분한 시간 지연이 발생하기에 데이터가 적은 경우에는 테이블을 여러번 추가하면 됩니다.
MSSql란? : MS에서 개발한 데이터베이스 서버관리 언어
https://server-talk.tistory.com/86
- waitfor
- heavy query
SQLite
https://ko.wikipedia.org/wiki/SQLite
- heavy query
RANDOMBLOB에 의해 많은 수의 데이터가 생성되며, 변환 과정과 함수를 거치며 시간 지연이 발생한다는 점 등을 이용하여 공격에 활용할 수 있습니다.
Error Based Blind
Error Based Blind SQL Injection은 임의적으로 에러 발생을 일으켜 참/거짓을 판단하는 공격 기법입니다.
앞서 배운 Error Based은 에러 메시지를 통해 데이터가 출력되는 에러를 이용해야 하지만, Error Based Blind 공격 시에는 에러가 발생했다는 여부만을 확인하면 되기 때문에 다른 Runtime Error도 사용가능합니다.
Short-circuit evaluation
로직 연산의 원리를 이용한 방법입니다.
A 식과 B 식이 있을 때 AND 연산은 모두 참이 되어야 결과가 참이 됩니다. 이때 A가 거짓이라면 B는 연산을 하지 않더라도 결과가 거짓이라는 것을 알 수 있습니다. 그렇기 때문에 실제로 B 식을 수행하지 않는 것을 의미합니다.
A AND B
거짓 ? --> B가 참이든 거짓이든 연산값은 거짓
위와 같은 원리로 OR 연산에서도 A가 참이라면 B 식의 결과없이도 결과는 참이되기 때문에 B 식이 수행되지 않습니다.
A OR B
참 ? ---> B가 참이든 거짓이든 연산값은 참 (B 수행X)
Blind SQL Injection Tip - 1
ASCII에서 출력 가능한 문자의 범위는 32~126 이며, 총 94개의 문자가 존재합니다. Blind SQL Injection을 통해 문자열을 추출할 때 하나의 문자를 구하기 위해 최악의 경우 94번의 요청을 전송해야하며 비효율적입니다.
Blind SQL Injection을 좀 더 효율적으로 수행하는 방법들이 존재합니다. 대표적인 예시들에 대해 설명하도록 하겠습니다.
Binary Search (이진 검색 알고리즘)
이진 검색 알고리즘은 정렬된 리스트에서 특정한 값을 찾는 알고리즘입니다. 검색 과정을 간단히 설명하면 아래와 같습니다.
- 범위 내의 중간 값을 지정하고 값을 비교합니다.
- 0~100 사이의 범위라면 50을 지정하고 찾고자 하는 값과 비교합니다.
- 지정한 값이 찾고자 하는 값과 비교하고 범위를 조절합니다.50보다 작으면 범위를 0~49으로 조절.
- 50보다 크다면 범위를 51~100으로 조절.
- 위 과정을 반복하여 특정한 값을 찾습니다.
해당 과정을 Blind SQL Injection에 적용하면 아래와 같습니다. 데이터베이스에 아래와 같이 데이터가 있는 경우를 가정하고 설명하도록 하겠습니다
ord함수 등을 사용해 해당 문자를 int형으로 변경합니다.
위 쿼리의 결과를 통해 75보다 큰 수라는 것을 알 수 있습니다.
위 결과가 0이 나온 것을 통해 101보다는 작은 수라는 것을 알 수 있습니다.
--> 이진 탐색을 통해 범위를 줄여나가는 방법
bit 연산
ASCII는 7개의 비트를 통해 하나의 문자를 나타냅니다.
위 원리를 적용하여 바이트를 비트로 변환하면 7번의 요청을 통해 한 바이트를 획득할 수 있습니다.
비트는 1과 0으로 이루어져있기 때문에 1에 대해 요청해서 거짓이 나오면 0이라는 것을 알 수 있습니다.
위와 같이 7번의 요청을 통해 binary값 1000001, 즉 "A"라는 것을 알 수 있습니다.
Blind SQL Injection Tip - 2
Blind SQL Injection은 다수의 요청을 통해 결과를 획득하는 공격 기법입니다. 이를 사용자가 직접 입력하는 방식은 물리적으로 한계가 발생할 수 있습니다. 그래서 Blind SQL Injection 공격 수행 시 스크립트를 작성하여 공격을 수행합니다.
오른쪽 탭의 소스 코드는 Python의 requests 모듈을 사용해 작성된 공격 스크립트 예시입니다. 공격 코드에 index와 비교할 데이터를 추가해 전송하는 간단한 코드입니다.
사용자마다 선호하는 언어와 라이브러리 등이 다르기 때문에 대중적으로 많이 사용되는 Python을 예시로 사용하였습니다. Python 이외에도 웹 브라우저에 기본적으로 내장되어 있는 Javascript를 이용하는 등 다양한 언어와 라이브러리 등을 활용하여 해당 예시 코드보다 좀 더 효율적인 공격 코드를 작성해보시길 바랍니다.
위 소스코드를 통해 한 바이트씩 패스워드를 획득할 수 있습니다.
3. SQL DML 구문에 대한 이해
SQL DML
SQL DML (Data manipulation language)은 데이터베이스에서 데이터를 조회하거나, 추가/삭제/수정을 수행하는 구문입니다. 즉, 일반적인 사용자가 입력하는 데이터는 대부분 DML을 통해 처리하게 됩니다.
각 쿼리가 사용되어지는 목적과 형태를 이해하게 되면 SQL Injection 공격을 이해하는데 더 효과적입니다. 또한 각 구문에서 사용자의 입력 데이터가 주로 사용되는 포인트와 구문마다 공격하는 방식에 대해 알아보도록 하겠습니다.
SELECT
데이터를 조회하는 구문입니다.
SELECT 문자열을 시작으로 조회의 결과로 사용될 표현식 또는 컬럼들에 대해 정의합니다.
FROM 절에서는 데이터를 조회하기 위한 테이블의 이름을 입력합니다.
WHERE 절에서는 해당 테이블내에 조회하는 데이터의 조건을 설정합니다.
ORDER BY 절은 쿼리의 결과 값들을 원하는 컬럼을 기준으로 정렬합니다. --순서 정렬
http://www.gurubee.net/lecture/2374
LIMIT 절은 쿼리의 결과로 출력될 row의 개수를 또는 Offset을 지정합니다.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=50after&logNo=220939872934
uid를 (DESC:) 내림차순으로 정렬
LIMIT 5 : 상위 5개만 보여줌
INSERT
데이터를 추가하기 위한 구문입니다.
INSERT 문자열을 시작으로 INSERT 구문이 시작하며, 데이터가 추가될 테이블을 정의합니다.
VALUE[S] 절에서는 추가될 데이터의 값을 입력합니다.
INSERT 구문에서는 추가될 데이터의 값들이 입력되는 VALUE[S] 절에서 주로 SQL Injection이 발생하게 됩니다.
,를 통해 여러 데이터를 한번에 추가할 수도 있습니다.
서브 쿼리를 통해 다른 테이블에 존재하는 데이터를 가진 row를 추가하여 데이터를 획득할 수도 있습니다.
UPDATE
데이터를 수정하는 구문입니다.
UPDATE 문자열을 시작으로 수정을 요청할 테이블을 정의합니다.
SET절에서는 수정할 컬럼과 수정될 데이터를 정의합니다. --바꿀 데이터
WHERE절을 통해 수정할 row를 지정합니다. --조건
UPDATE 구문에서 사용자의 입력 데이터로 주로 사용되는 절은 수정될 데이터가 입력되는 SET절과 수정 될 row를 지정하는 WHERE절이 있습니다.
title이 title 1인 데이터에게 boardcontent를 update content2로 설정(업데이트)하기.
DELETE
데이터를 삭제하는 구문입니다.
DELETE FROM 문자열을 시작으로 삭제할 데이터가 존재하는 테이블을 정의합니다.
WHERE 절을 통해 삭제할 데이터의 row를 지정합니다.
DELETE 구문에서는 삭제될 row를 지정하는 WHERE절이 사용자의 데이터로 주로 사용됩니다.
title이 title 1인 데이터 삭제하기
https://www.ibm.com/docs/ko/i/7.1?topic=language-removing-rows-from-table-using-delete-statement
퀴즈
admin 비밀번호 가져오기
서브 쿼리 이용
또는 하나 더 만들기
4. Exploit Technique
SQL Injection - Exploit Technique
SQL Injection 공격은 대표적으로 두가지 목적이 있습니다.
- 정보 탈취 (기밀성 침해)
- 정보 수정/삭제 (무결성 침해)
일반적으로 위 두가지 사항 모두 SQL Injection을 통해 기존에 권한이 없는 정보에 접근하는 것이 공통점 입니다.
SQL Injection 취약점은 일반적으로 임의의 SQL 구문을 실행할 수 있도록 하지만, 입력 형식과 필터링 및 데이터베이스 엔진의 종류에 따라 가능한 구문과 공격의 영향이 제한될 수 있습니다. 이를 위해 웹 서비스에 적용되어 있는 방어 기법을 이해하고 우회할 수 있는 방법을 알아보는 것이 좋습니다.
오른쪽 탭에서는 Blackbox 점검 중 SQL Injection 취약점을 발견하고 공격의 목적을 달성하기까지의 과정에 대해 작성한 내용입니다.
1. SQL Injection 취약점 발견
SQL Injection이 발생 여부를 판단하는 방법은 여러가지 방법이 있습니다. 대표적으로 확인하는 방법들은 아래와 같습니다.
- HTTP Response Status Code를 통해 오류가 발생하는지 확인
- DBMS의 오류 메시지를 통해 취약점 가능성 확인
- 웹 어플리케이션에서 변조된 SQL구문이 실행된 데이터가 반환되는지 확인
2. 구문 예측 / DBMS 정보 획득
- 사용자의 입력 데이터를 처리하는 구문을 예측합니다.
- --예를 들어 일반적으로 로그인 로직이 처리되는 곳에서는 데이터베이스에서 회원의 정보를 가져오기 위해 SELECT구문의 WHERE절에서 사용자의 입력데이터를 처리합니다. 또한 회원 가입 로직이라면 새로운 데이터를 추가하기 위해 INSERT구문의 VALUES절에서 사용자의 입력데이터를 처리할 것입니다.
- DBMS의 정보를 획득하여 Exploit 작성을 위한 정보를 획득합니다.
3. Exploit 작성
- 사용할 공격 기법을 선정합니다. 데이터베이스의 결과가 그대로 노출된다면 union 또는 subquery구문을 통해 직접적으로 정보를 노출할 수 있는 구문을 사용하거나, 정보가 노출되지 않는다면 Blind SQL Injection을 사용합니다.
- WAF과 같이 SQL Injection을 방어하는 로직 등이 존재할 경우 우회 가능성을 판단합니다.
4. 정보 탈취 및 수정/삭제
- 시스템 테이블 등을 이용하여 데이터베이스의 정보 등을 획득하며, 저장된 데이터를 탈취하거나 수정/삭제 하여 공격의 목적을 달성할 수 있습니다.
SQL Injection - DBMS Fingerprinting
BlackBox 점검에서 SQL Injection이 의심되는 Endpoint를 찾았을 때 DBMS의 종류를 파악 후 공격하는 것이 효율적입니다. 공격 대상 DBMS에서만 사용 가능한 함수 등을 통해 SQL Injection 공격을 좀 더 수월하게 수행할 수 있습니다.
BlackBox 환경에서 SQL Injection 취약점 발견 시 상황은 아래와 같습니다.
각 상황별 DBMS를 파악하는 방법
- 결과 값이 출력될 때
- DMBS 별로 다른 환경 변수 값 출력
- 결과 값이 출력되지 않지만 에러가 출력될 때
- 에러 메세지를 통해 DBMS 파악
-
- True / False를 확인 가능한 경우
- Blind로 함수, 조건문을 사용해 테스트
- Time Based결과 값이 출력되지 않을 때
- Blind로 함수, 조건문을 사용해 테스트
- True / False를 확인 가능한 경우
- MySQL, PostgreSQL, MSSQL, SQLite별로 version, error, Blind, Time Based함수와 그 결과값 다를 수 있다.
System Tables
DBMS마다 데이터베이스의 정보를 담고 있는 시스템 테이블이 있습니다.
DB설정, 계정 정보 외에도 데이터베이스/테이블/컬럼 정보, 현재 실행되고 있는 쿼리 정보 등 다양한 정보들을 담고 있습니다.
이러한 시스템 테이블에 담긴 정보를 통해 SQL Injection 취약점을 좀 더 효율적으로 공격할 수 있습니다.
다양한 상황에서 활용 가능하지만 대표적인 활용 상황으로 아래와 같습니다.
- 조건
- 게시판 서비스에서 boards 테이블에서 SELECT구문을 통해 조회 시 SQL Injection이 발생
- 사용자 정보가 포함되어 있는 유저 테이블, 컬럼 정보 등을 모름
- 공격 방법
- 시스템 테이블의 정보를 이용하여 유저 테이블의 이름 및 컬럼 정보를 획득
- 획득한 테이블, 컬럼 정보로 유저 테이블에 접근 및 사용자 정보를 획득할 수 있습니다.
오른쪽 탭에서는 각 DBMS별로 사용되는 시스템 테이블에 대한 내용입니다.
- column 정보 MySQL, PostgreSQL, MSSQL, Oracle, SQLite 테이블 https://dreamhack.io/learn/1/27#22
'보안공부 > 배운내용정리' 카테고리의 다른 글
[dreamhack -Reverse Engineering] 1.리버스 엔지니어링이란 (0) | 2021.09.03 |
---|---|
dreamhack06.NoSql (0) | 2021.07.16 |
칼리리눅스 설치 (0) | 2021.05.23 |
dreamhack 04.Client-side Advanced (0) | 2021.05.21 |
Flask (0) | 2021.05.18 |