LOS(Lord of SQLInjection) - 17번 zombie_assasin

Analysis

이번에도 id와 pw에 prob()를 필터링하고, strrev라는 함수와 addslashes 함수가 적용되어 있다.

각 함수에 대해서 간단하게 알아보면

  • strrev는 문자열을 뒤집는 함수
  • addslashes는 문자열 내의 “,/와 같은 특수 문자들을 포함하고 있는 문자열에 역슬래쉬를 넣어준다.

?id=’ 이렇게 입력값을 주면, 아래와 같이 들어간다. \’가 되고 strrev가 적용되는듯.

이를 역이용해서 id값이 참이 되도록 해보면 될거 같다.

Solution

먼저 \를 id 값에 주게되면, \가 \를 문자열로 만들어버리기 때문에 더블쿼터를 입력값으로 주고 pw에 이전 문제처럼 or 1 # 값을 줘봤는데 바로 문제가 풀렸다.

근데 나는 바로 풀릴줄 몰랐기 때문에… “\’ and pw=가 id 값으로 들어갔다는 건데,, 싱글쿼터내에 더블쿼터가 단순히 문자열로 처리가 되는건가? 싶어서 좀 알아보니 알아본 내용은 아래와 같다.

큰따옴표가 작은따옴표 안에 들어가는 상황

  • *id='"\'에서 큰따옴표(")가 작은따옴표(') 안에 포함된 형태로 보이지만, SQL에서는 큰따옴표와 작은따옴표를 구분해서 처리할 수 있다.

일반적인 SQL 구문 규칙:

  1. 작은따옴표('): 문자열 리터럴을 감쌀 때 사용한다. 예를 들어 'hello'.
  2. 큰따옴표("): 일부 SQL 엔진에서 식별자(컬럼명, 테이블명 등)를 감싸는 용도로 사용한다.

하지만, 문자열 리터럴 안에서는 큰따옴표가 특수한 의미를 가지지 않으므로 그대로 문자열의 일부로 처리된니다. 즉, 큰따옴표(")는 작은따옴표(')로 감싸진 문자열 안에서 일반 문자로 해석되는 것!!

결론

큰따옴표(")가 작은따옴표(') 안에 들어가도 문제없이 SQL 쿼리가 실행될 수 있는 이유는, 큰따옴표가 문자열 리터럴 안에서 단순 문자로 처리되기 때문. MySQL은 큰따옴표를 특수하게 해석하지 않으며, 작은따옴표로 감싼 문자열 내부의 내용으로 취급한다.!