[LOS] GREMLIN

minnie·2023년 10월 5일

문제 링크

문제풀이

일단 주어진 소스 코드를 살펴보자

주어진 쿼리문을 보면 sql injection기법을 사용하는 문제인 것을 유추할 수 있다.

if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

위 코드를 보면 id나 pw에 입력된 값에 prob, _, .\, ( ) 등 과 같은 기호들이 사용되면 No Hack라는 메시지를 리턴한다.
또한 아래와 같은 코드를 통해

			if($result['id']) solve("gremlin");
  				highlight_file(__FILE__); 

id가 일치하면 이 문제를 풀 수 있는 것을 알 수 있다.

Id를 알 수 있는 방법이 없으므로 ‘id = id값 or 1=1’과 같은 sql문을 이용해서 우회해보려고 하겠다. 일단 url뒤에 ?id=1&pw=1 값을 추가해 보면

위와 같은 페이지가 나타나는 것을 알 수 있다.
그럼 where id = ‘1’ or ‘1’ = ‘1’ and pw= ‘1’ or ‘1’ = ‘1’ 또는
where id = ‘1’ or ‘1’ = ‘1’ 이라고 하고 pw부분은 주석처리를 해버리는 방법이 있다.

사이트 주소 뒤에 id=1&pw=1을 붙였을 때 쿼리문에는 id=’1’ and pw=’1’이라고 인식되었으므로 처음 시작 ‘와 마지막 ‘는 자동으로 주어지는 것을 알 수 있다 따라서
id = ‘1’ or ‘1’ = ‘1’ 를 url에 id = 1’ || ‘1’ = ‘1이라 입력하고 pw에도 동일하게 입력하면
https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=1%27||%271%27=%271&pw=1%27||%271%27=%271

와 같이 나타나는 것을 알 수 있다.

느낀점

입력은 id = 1’ || ‘1’ = ‘1 & pw = 1’ || ‘1’ = ‘1라고 했는데 실제로 url상에서는
id=1%27||%271%27=%271&pw=1%27||%271%27=%271 와 같이 나타난 것을 보고
%27로 나타난 것을 확인 할 수 있었다.
따라서 주석처리 하는 경우에도 #를 사용하지 않고 url 파라미터에서 #를 의미하는 %23을 사용해서 id=1%27or%271=1%27%23 까지만 입력하고 문제를 풀 수도 있다.
또한 #말고 --를 사용해서 주석을 달 수도 있다. 나는 처음에 --만 알고 있었는데 이를 코드 중간에 넣을 경우 자꾸 와 얽혀서 문자처리 되어서 다른 방법으로 풀어야 했다.

?id=1&pw=1%27%20or%201=1--%20- 처럼 사용하면 가 오히려 를 주석처리 시켜 버려서 문제를 풀 수 있다.

0개의 댓글