Web/Lord of Sql injection

goblin 문제 풀이

Namchun 2023. 9. 6. 00:13

코드 분석

' (single quote), " (double quote), ` (back tick) 을 필터링하는 모습을 볼 수 있다.

또한 id가 guest로 정해져있는데 이 쿼리를 실행하였을 때 id가 admin이어야 한다.

 

공격 기법

우선 $_GET[no]를 통해 전달받은 값을 문자열로 감싸지 않기 때문에 escape에 대한 걱정은 하지 않아도 된다.

그렇다면 남은 것은 id를 admin으로 조회하도록 하는 것인데, 쿼터가 모두 필터링 되기 때문에 직접적인 문자열 비교는 되지 않을 것이다.

 

이를 우회하기 위해서는 여러 함수들이 있겠지만 필자는 SUBSTR() 함수와 CHAR() 함수를 사용하여 문제를 풀었다.

우선 mysql의 SUBSTR() 함수는 문자열의 임의의 위치를 추출해주는 함수인데,

 

  • SUBSTR(string, start, length)
  • SUBSTR(string FROM start FOR length)

이런 두 가지의 구문을 통해 사용할 수 있다.

 

예시를 들어보자면

SELECT SUBSTR("namchun.tistory.com", 1, 7) AS example;

이러한 쿼리를 실행하면 "namchun"이라는 값이 추출된다.

 

이 함수를 사용한다면

SELECT SUBSTR("ADMIN_PASSWORD", 1, 1) AS example;

이러한 password를 start 값을 증가해가며 하나씩 알아낼 수 있을 것이다.

 

그 다음 CHAR() 함수를 설명하자면

정수값을 받아 ascii 테이블의 문자로 반환해주는 역할을 한다.

 

  • CHAR(97) : 'a'
  • CHAR(97, 100, 109, 105, 110) : 'admin'

 

따라서 SUBSTR() 함수와 CHAR() 함수를 조합하여 악성 쿼리를 만들어보자면

?no=0 or substr(id,1,1) = CHAR(97)

id의 첫 글자가 CHAR(97) -> 'a'인 admin이 조회될 것이다

(사실 cobolt 문제처럼 0 or 1=1 limit 1,1만 해도 되긴함..  ^^)

'Web > Lord of Sql injection' 카테고리의 다른 글

darkelf 문제 풀이  (0) 2023.09.09
wolfman 문제 풀이  (0) 2023.09.07
orc 문제 풀이  (0) 2023.09.06
cobolt 문제 풀이  (0) 2023.09.05
gremlin 문제 풀이  (0) 2023.09.05