webhacking 45번
포스팅에 앞서 내용이 틀릴 수도 있으며, 해당 부분 지적은 감사히 받겠습니다.
45번 문제이다.
떡하니 sql injection이라고 쓰여있다.
한번 코드부터 보자.
get파라미터로 id와 pw를 받으며 id는 euc-kr을 utf-8 형태로 바꾼다고 되어있다.
또한 id와 pw 둘 다 admin, select, limit, pw, <, >, = dmf 대소문자를 구분하지 않고 필터링하고 있다.
그리고 id가 admin과 일치하면 문제는 해결된다.
간단한 addslashes우회 문제이다.
addslashes는 ', ", \, %00 이 오면 앞에 \를 붙여 문자 취급시켜 해당 문자열이 가진 기능을 하지 못하게 만드는 함수이다.
멀티 바이트를 통해 우회 가능하다.
한번 우회해보자.
원래는 input type이지만 한눈에 보여주기 위하여 textarea로 변경 후 포스팅한다.
id : guest%fa'||id like 0x61646d696e--+-
입력해보자.
이론상 풀렸어야 하지만 풀리지 않았다.
여기서 굉장히 헤매다가 한 가지 이상한 점을 발견했다.
id칸에서 입력한 값과 결과 링크에서 표시된 값에서 원인을 찾았다.
위 소스코드 부분에서 무시하고 넘어갔던
mb_convert_encoding($_GET['id'],'utf-8','euc-kr'mb_convert_encoding($_GET ['id'], 'utf-8', 'euc-kr') 부분이었다.
분명 % 와 %25는 같은 뜻이다.
하지만 %25fa로 넘어갔을 때는 같은 결과를 도출하지 않았다.
마찬가지로 % 2B도 +를 의미하지만 --%2B-에서는 다른 결과를 보여준다.
해결방법은 id 입력 칸이 아닌 링크에서 injection을 수행하면 된다.
mb함수로 인해 변경된 값을 다시 의도하고자 하는 값으로 변경해보자.
문제 해결
시행착오
1. 인코딩을 새로 하는 과정에서 기존에 썼던 문자들이 인코딩 된 언어에서는 다른 의미로 작동할 수 있다.
ex) %fa -> %25fa로 변경되어 %fa로 인식되지 않음.
ㄴ원래는 %fa라는 하나의 문자이지만 파라미터로 넘어가는 과정 중 %25가 인코딩 되어 %와 fa가 따로 인식된다고 추측