Search

[webhacking.kr] 23번

Tags
time
2022/01/07 12:50

1. 문제

1) 문제 확인
<script>alert(1);</script> 요거를 삽입시켜서 alert 창을 띄우는게 목표이다.

2. 접근방법

우선 저 스크립트를 그대로 입력해봤다.
no hack이라는 문구가 뜬다. 그리고 해당 요청은 GET 방식으로 넘어가기 때문에, url에 파라미터 형태로 전달된다. 어떠한 필터링이 있는지 이것저것 입력해보자
보면, 영문자 단어 하나와, 저런 특수기호들은 입력한값이 그대로 보여진다. 하지만 두개이상 입력하면
아까와 같이 no hack이라는 문구가 뜬다. 그렇다면, 아마 내부적으로 넘어온 파라미터가 영문자+특수기호 문자열의 길이가 2이상이라면 no hack이라는 문구가 뜨도록 구현되어있을 것이다. 그리고 이건 예측하건데 정규표현식으로 되어있을 것이다.
이때 바로 공부하고 있는 책에서 NULL 바이트를 이용하는 부분이 떠올랐다. 정규표현식으로 넘어온 값을 체크하는 로직에서 만약 %00이 널바이트를 만나면 거기서 입력값의 프로세스가 입력의 끝이라고 판단하여 종료하기 때문에, %00 뒤에 나오는 문자열은 처리하지 않는다.
요 기법이 통한다면 각 문자 사이사이에 %00를 넣어주면 된다.

3. 풀이

payload
⇒ <%00s%00c%00r%00i%00p%00t%00>%00a%00l%00e%00r%00t%00(%001%00)%00;%00<%00/%00s%00c%00r%00i%00p%00t%00>
주의해야할 점은 해당 페이로드를 입력 폼에다가 넘으면, %이 인코딩되서 %25로 넘어가기 때문에, url에 직접저 페이로드를 입력해야한다.

4. 몰랐던 개념

PHP 5.3+ 에서 POSIX Regex 함수들을 사용할 때, NULL 문자를 만나게 되면 더이상 뒤의 문자열을 체크하지 않는다. 따라서 7.0이상 php 버전에서는 아예 Posix 정규표현 함수는 사용되지 않는다고 한다.
근데 다른 롸업 보면, %00<script>... 요렇게 해도 필터링 우회된다고 하는데 왜 안되지?