[1] 문제 탐색
문제 화면이다.
내 미션은 문제에서 제공하는 웹페이지에서 제공하는 입력 칸에, <script>alert(1);</script> 를 삽입하는 것이다.
그러나 쉽게 되지 않으니까 문제일 것이고, 아마 입력받은 스크립트 태그를 필터링하는 등의 방법을 사용하지 않을까 싶다.
다른 취약점을 찾아내는 것이 문제의 핵심일 것 같다.
# 문제 페이지 소스코드 분석
분석 (1)
<form> 요소의 method 속성은 사용자가 입력한 데이터를 서버에 전송하는 방법을 지정하는데, 옵션 중 하나로 GET 방식이 있다.
GET 방식은 입력한 데이터를 URL의 일부로 붙여서 서버에 보낸다. 즉, 사용자가 입력한 데이터가 URL에 노출이 되는 것이다.
분석 (2)
action 속성은 <form> 요소에서 데이터를 제출할 때 어떤 경로로 데이터를 보낼지를 지정한다.
이 경로는 서버 측에서 데이터를 처리하는 스크립트의 경로를 나타낸다.
이 문제에서는 action이 index.php로 설정되어 있고, 사용자가 폼을 제출하면 데이터가 index.php 파일로 전송된다.
분석 (3)
<input> 요소에는 name 속성이 있다.
이 속성은 서버로 데이터를 전송할 때 해당 입력 필드의 이름을 지정하는 역할을 한다.
이 이름은 서버에서 전송된 데이터를 식별하는 데 사용된다.
<input name="code">
예를 들어 이와 같은 코드에서,
name 속성이 "code"로 설정되어 있다.
이 경우 사용자가 입력한 데이터는 서버로 전송될 때 "code"라는 이름으로 식별된다.
서버 측에서는 이 이름을 사용하여 데이터를 처리하거나 검색할 수 있다.
예를 들어, 사용자가 "1234"라는 값을 입력하고 폼을 제출하면, 서버에서는 "code"라는 이름으로 전송된 데이터를 읽을 수 있다.
PHP에서는 $_GET['code']나 $_POST['code']와 같은 방법으로 이 값을 읽어올 수 있다.
# 공격 실행 후 분석
우선 <script>alert(1);</script> 를 그대로 입력하고 제출한 결과,
해킹하지 말라는 문구와 함께 위에서 분석한대로 URL에서 웹페이지가 작동하는 방식을 알 수 있었다.
'(', ')', ';', '/' 가 URL 인코딩되어 반영되는 것을 확인할 수 있었다.
여기서 나는 index.php가 특정 문자를 URL인코딩하는 것이 아닐까 하는 생각이 들었다.
이럴 때는 어떻게 해야할까?
우선 첫 바이트에 NULL을 넣어 문자열 검사를 하지 못하는 방식을 사용했더니,
필터링 우회는 가능했지만 공격은 불가능했다.
'sc', 'on', 'im', 'ri', 'pt' 을 입력하고 제출하면 "no hack"이라는 문구가 출력이 된다.
그래서 NULL로 우회해도 <script>, <oneerror>, <img> 태그를 사용할 수 없었고, (추가로 href도 안 됐다.)
가운데에 끼워넣는 방식도 사용할 수 없다는 것을 알게 되었다.
혹시나 해서 대소문자를 섞어 사용해보았는데 이것도 실패했다.
그러니까 'sc'와 같은 문자를 입력하면 공격에 실패하는 상황인 것이다...
여기서부터 방법을 더 이상 찾을 수 없어 다른 풀이 글을 찾아보며 문제를 풀었다.
[3] 올바른 문제 풀이
다른 사람들의 문제 풀이 글을 보니 내가 잘못 생각한 부분이 있다.
script나 oneerror의 'sc', 'on' 이라서가 아니라,
그냥 입력된 영문자가 2개 이상이면 "no hack"이라는 메세지를 출력하는 것이었다...
이 문제는 주소창에 원하는 문자 사이사이에 NULL을 입력하여 우회해주면 되는 방식이다.
(입력하고 제출하는 칸에 넣으면 안 되는 이유는 그렇게 하면 %가 필터링이 된다.)
<s%00c%00r%00i%00p%00t>a%00l%00e%00r%00t(1);</s%00c%00r%00i%00p%00t>
위의 문자를 code= 뒤에 입력해주면 된다.
문제 풀이 완료!
[4] 참고
https://intunknown.tistory.com/535
Webhacking.kr 23번 -old
webhacking.kr 23번 [문제풀이] 안녕하세요. 오늘은 webhacking.kr이라는 사이트의 23번(old) 문제를 풀어보려고 합니다. 문제를 풀기 위해 해당 사이트로 이동해주세요. 웹 해킹 23번 문제풀이 [200점] 23번
intunknown.tistory.com
[5] 느낀 점
두 개 이상의 문자열을 입력받는 것을 막는 방식도 있다는 것을 접해보았고, GET 방식에 대해 찾아볼 수 있는 기회였다.
'Hacking (CTF) > 웹 해킹' 카테고리의 다른 글
[Dreamhack/드림핵] csrf-1 (0) | 2023.11.10 |
---|---|
[Dreamhack/드림핵] XSS Filtering Bypass (0) | 2023.11.10 |
[Dreamhack/드림핵] xss-2 (0) | 2023.11.06 |
[xss-game] Level 5: Breaking protocol (3) | 2023.11.06 |
[Dreamhack/드림핵] xss-1 (0) | 2023.11.05 |