LJ

Lord of SQLinjection ( 25번 ) green dragon 본문

IT 보안/보안첼린지

Lord of SQLinjection ( 25번 ) green dragon

짱준재 2024. 7. 17. 13:53

 

 

 

 

 

 

 

 

 

 

25번 그린 드래곤이다.

 

 

 

 

 

 

코드를 보면 

 

 

preg_match를 사용하여 prob, _, ., ', " 문자를 필터링하고있다.

 

그러므로 \를 이용해 작은 따옴표를 이스케이핑 처리를 해야한다.

 

 

첫번째 부분

SELECT id, pw FROM prob_green_dragon WHERE id='\' AND pw='';

 

이 부분은 필터링을 우회하기 위해 이스케이핑 문자를 사용한다. 결과적으로 id='\'와 pw=''인 행을 찾는다.

 

 

두번째 부분

 

union select 1,2;

 

이 부분은 UNION을 사용하여 쿼리의 결과에 추가적인 행을 삽입합니다. 이 경우 1과 2라는 값을 반환합니다.

 

쿼리는 두 부분으로 나누어진다. 첫 번째 부분은 데이터베이스에서 id='\'와 pw=''인 행을 찾고, 두 번째 부분은 UNION을 통해 결과에 추가적인 행을 삽입한다.

 

 

  • 데이터베이스에 id='\'와 pw=''인 행이 없으면, 첫 번째 부분은 빈 결과를 반환
  • UNION을 통해 1과 2라는 값이 추가로 반환

※만약 UNION 뒤의 값이 컬럼이 정해지지 않은 채로 넣는다면, 첫 번째 SELECT 문의 컬럼 수와 데이터 타입에 맞춰지게 된다. 따라서 UNION 뒤의 값은 첫 번째 SELECT 문의 컬럼을 따르게 된다.

 

위의 쓴 개념들로

 

쿼리를 삽입하면

 

 

 

이런식으로 박히게 된다.

 

 

하지만 이 방법으로 그냥 넣으면 마지막까지 해결이 되지 않는다.

 

이유는 query1에서 코드 부분으로 들어갔기 때문에 union이나 select나 char나 의미 있는 문자열이 해석이 되었기 때문이다.

 

이는 우리의 코드를 헥스값으로 변환함으로 해결할 수 있다.

 

 

 

 

뒤의 부분의 값들을 핵스값으로 변환하여 삽입하면 뒤의 쿼리까지 전달되어 

 

문제가 해결된다.

 

 

※ keypoint

union 뒤의 값에 데이터를 넣을 때 의미있는 컬럼값이 아니면 앞의 컬럼을 자동으로 따르게 된다.

Comments