보안/LOS

[LOS] nightmare

dDong2 2022. 12. 24. 16:30
LOS : https://los.rubiya.kr/

 

✔️ 문제

 

 

문제는 다음과 같다.

문자열 길이에 제한이 걸려 있는 것으로 보인다.

 

 

✔️ 풀이

 

풀이를 위한 코드는 다음과 같다.

 

if($result['id']) solve("nightmare");

 

strlen 함수로 pw 길이가 6글자를 넘어가지 못하게

막혀있는 것을 확인할 수 있다.

그리고 특이한 것은 id != admin 이면서 pw를 검사하고 있고,

풀이를 위해서는 id 값이 들어가야하는 것이다.

 

 

당연히 아무런 반응이 없는 것을 확인할 수 있다.

또한, preg_match 함수로 #과 - 각 주석처리에 대해서

필터링 처리 되어 있는 것을 확인할 수 있다.

 

생각해볼 수 있는 것이

1) 6글자를 넘지 않는 페이로드이면서

2) #과 - 이외의 주석처리를 진행한다.

 

이전 참고한 블로그에 나와있는 설명에서 볼 수 있듯이,

/**/ 또는 ;%00 을 통해서 #과 -를 대체하여 주석처리를 할 수 있는데

/**/는 너무 길어서 문자열 제한에 걸리므로 ;%00을 사용해보자.

 

그러면 이미 벌써 2글자를 사용하고 있고,

앞의 구문을 참으로 만들기 위해서는 ')을 사용해야 한다.

 

 

어떻게든 문자열로 구문을 참으로 만들기 위해서

')or1;%00 다음과 같이 작성해보았는데,

문자 하나 차이로 길이 제한에 걸리게 되었다.

 

그러다가 간략하게 줄일 수 있는 방법을 구글링을 통해서

검색하던 와중에 숫자 없이 문자로만 구성된 문자열은

0으로 형변환이 되면서 ('')=0 구문이 참이 된다는 설명을 보게 되었다.

 

바로 한번 시도해보았다.

 

 

다음과 같이 ')=0 이라는 구문이 1번 조건에 맞게 참이 되고,

;%00 이라는 구문은 #과 - 같이 주석처리 되기 때문에

문제가 풀리는 것을 확인할 수 있다.

 

화이팅💪