Level2 : cobolt
GET 방식으로 id와 pw를 입력받고, db에서 id와 pw가 각각 일치하는 레코드의 id를 select 한다.
이때, select 된 id가 admin이면 문제가 풀린다.
id 부분은 admin을 입력해주면 되면 쉽게 True를 만들 수 있지만, admin에 해당하는 pw는 알 수 없다.
mysql에서 한줄 주석은 '#' 이기 때문에 id를 입력 후 싱글쿼터로 닫고, 그 뒤 구문을 다 주석처리 하는 것이다.
그러면 pw를 몰라도 pw의 조건식을 무효화 시킬 수 있고, id값만 인증하면서 문제를 풀 수 있다.
'?id=admin'#'
'#'를 입력했지만 쿼리문에서는 '#'문자가 사라지는 것을 보면 필터링을 거치는 것 같다.
'#'가 인코딩 되면 ASCII로 %23이기 때문에 이 값으로 대신 넣어보자.
'?id=admin'%23'
COBOLT Clear.
또다른 방법
id에서 뒤에 주석을 넣어서 풀 수도 있지만, pw에서도 풀 수 있다.
?id=''&pw=') or id='admin'%23
+ 추가적으로
두번째 방법은 AND와 OR의 우선순위를 이용해서 문제를 해결했다.
WHERE문에서 연산의 우선순위는 AND가 더 높기 때문에
where id='''' and pw=md5('') or id='admin'#')
파란색 부분이 먼저 연산된다. 이 값은 중요하지 않다. 아무 값이나 넣으면 FALSE가 나올 것이다.
이 후 OR 연산을 수행한다.
where False or id='admin'#')
OR 연산이기 때문에 앞에 and연산이 무슨 값이 나오던 상관없이 id가 'admin'이라면 db에서 해당 레코드의 값을 select 할 것이다.