Hacking (CTF)/웹 해킹

[webhacking.kr] Challenge old-23

gapsoo 2023. 11. 9. 22:32


[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