Websec - level 14
input은 25글자로 제한되어 있으며, 내부함수와 설정된 문자, 문자열들이
블랙리스트로 등록되어 Input에 해당 문자가 있으면 Insecure code detected!을 출력하게 된다.
1.
처음에는 $blacklist{0}, $blacklist{1} ... 를 각각 출력해서 내부함수를 사용하려고 하였다.
Input : $blacklist{0}();
다음과 같이 $blacklist{숫자}의 결과값이 내부함수명으로 나와 함수를 실행 가능하게한다.
하지만 이 방법을 포기하게 된 것은. 우리가 원하는 flag값은 문제에서 sha1($flag)형식으로 되어있는 것을 알 수 있는데
input값이 25글자를 초과할 수 밖에 없다고 생각하여 다른 방법을 생각하게 되었다.
2.
root-me eval 문제에서도 사용했었던 not, xor과 같은 연산을 이용하여 시도하였다.
파일명이 길기 때문에 파일명을 GET방식으로 전달하고 Input을 통해 GET으로 전달한 파일명을 얻어서 문제를 해결하면 될 것 같다. []는 블랙리스트 되어있으니 {}로 대체해주고 NOT연산을 사용하여 작성하면
Input : ${~%a0%b8%ba%ab}{0} ~~
%a0 은 글자수 하나로 인식된다.
이런 형태로 input을 진행시킬 수 있을 것 같다.
우선 flag를 찾기위해 ()안의 payload를 실행 시켜줄 수 있는 assert를 이용하여
payload로 assert(var_dump(scandir('/')))를 사용한 후
찾은 파일을 file_get_contents를 통해 읽으면 문제를 풀 수 있다.
처음에 payload를 보낼 때 %a0%b8%ba%ab가 아닌 \xa0\xb8\ba\ab를 보냈었다.
\xa0\xb8\ba\ab로 문자를 보내게 되면
_GET으로 변형되는게 아니라 =_=G=E=T으로 변형되고 not이 되기 전 문자도 %를 사용했을 때와 다르게 진행된다.
php를 통해서 E를 not연산을 이용하면 BA가 나오게 되고 이 문자를 다시 ~\xBA 을 하게되면 º라는 문자가 나오게 된다. 하지만 ~%BA를 사용한다면 �로 출력된다.
정리하면
NOT 연산의 결과
E => BA
\xBA => º => =E
%BA => � => E
분명히 같은 값으로 연산을 하였는데 =이 추가되어 원하는 결과 값을 얻을 수 없었다.
\xBA를 bin2hex로 hex값을 구해보니 C2BA로 not 연산을 하면 3D45가 되고 -> =E가 되게된다.
\xBA를 할 때는 왜 º 로 들어가고 %BA로 할 때는 왜 다르게 들어가는지 알아봐야겠다.
'Web hacking > Websec' 카테고리의 다른 글
websec - level 24 (0) | 2020.02.25 |
---|---|
Websec - level 22 (0) | 2020.02.22 |
Websec - level 17 (0) | 2020.01.05 |
Websec - level 4 (0) | 2020.01.05 |
Websec - level 2 (0) | 2019.12.30 |