김승현

[Dreamhack : Web] xss-1 본문

Web/Dreamhack : Web

[Dreamhack : Web] xss-1

kshind 2023. 2. 22. 00:38

문제

xss-1 문제 같은 경우에 여러 기능이 있고 url을 확인하는 것도 있는데 거기에 xss 취약점을 이용해서

flag를 얻는 문제인 것 같다. 형식은 DH{}

 

이건 함께실습 문제니까 공부할 땐 하나하나 보겠지만 강의에서 대부분 코드가 설명되어 있으니까

write up엔  필요한 코드만 대충 넣고 다음 문제인 실습 문제는 코드 하나하나 자세하게 기록하겠습니다....!

+) 근데 xss-2와 내용이 거의 동일해서 그냥 여기서 한 줄 한 줄 분석하고 다음 주제부터 이렇게 하겠습니다.

 

풀이

사이트로 들어가면 이런 식으로 만들어져있다.

vuln(xss) page에 들어가면 주소에 나와있는 것처럼 reflected xss 취약점이 있는 걸 볼 수 있다.

주소의 쿼리를 고침으로써 다른 것들도 실행할 수 있는 걸 볼 수 있다.

memo의 경우 vuln을 들어갈 때마다 hello가 출력되는 것 같다.

flag의 경우엔 이렇게 localhost:8000에 vuln path에서 파라미터를 입력해서 제출하도록 만들어져있다.

파이썬 코드를 살펴보자.

app= Flask(__name__)으로 flask 객체를 생성했고 app.secret_key 변수에 랜덤한 값을 저장했다.

FLAG 변수에 ./flag.txt를 open해서 값을 저장했고 오류가 발생하면 [**FLAG**]가 저장되게 했다.

 

app.route("/vuln")

param 변수에 vuln에서 입력된 파라미터를 그대로 저장한다.(이때 xss 취약점이 발생함)

 

app.route("/flag")

만약 요청된 메소드가 GET이라면 flag.html을 보여준다. POST라면 param 변수에 사이트에서 받은 파라미터를 저장한다. 

만약 check_xss 함수가 참이 아니라면 잘못 됐다고 하며 wrong??이라는 경고창을 띄우고 그게 아니라면 good을 띄운다. 

참거짓 판별은 이따 read_url 함수의 여기서 나오는데 에러가 발생하는 게 아니라면 참을 띄운다.

check_xss()

check_xss 함수가 실행되면 일단 url에 http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}을 저장한다.

여기서 urllib.parse.quote(param)은 입력받은 아스키코드형식이 아닌 글자를 URL 인코딩 시켜주는 것이다.

  • check_xss의 param : /flag 엔드포인트에서 입력받은 값
  • 쿠키라는 딕셔너리의 name : flag라는 문자열 저장
  • 쿠키라는 딕셔너리의 value : FLAG 변수에서 공백 제거한 문자열 저장

그리고 마지막으로 readurl() 함수를 반환해준다.

 

 

read_url()

일단 webdriver가 들어가는 내용은 selenium에서 사용하는 건데 크롬, 웨일 등등 다양한 환경을 테스트할 수 있게 해주는 그런 프레임 웹 자동화 프레임워크라고 하는데 딱히 읽을 필요 없을 것 같다.

그냥 간단하게 말하자면 웹 사이트를 구성하는 데에서 오류가 발생하면 리턴값으로 False를 주기 때문에

read_url엔 false가, 그렇기 때문에 check_xss 리턴값에도 false가 들어간다.

그러면 이 if문의 check_xss 리턴값이 false인데 not이기 때문에 if문이 실행되어 wrong이 뜨고 뒤로 가게 된다.

 

app.route("/memo")

사이트에서 입력한 memo 내용을 전달 받아 전역변수인 memo_text에 저장하고 화면을 띄운다.

여기서 render_template는 HTML 엔티티코드로 저장해서 전달하기 때문에 XSS가 발생하지 않는다고 한다!

 

여기까지 코드를 보면 flag를 통해 xss 취약점을 이용해서 쿠키를 memo에 출력되게 해서 flag를 얻으면 될 것 같다.

함께 실습 강의에서 쿠키 내에 flag가 있다고 했기 때문에 flag를 얻으려면 일단 쿠키를 얻어야 한다.

 

<script>location.href = "/memo?memo=" + document.cookie;</script>

flag 엔드포인트에 위의 코드를 입력해줘야 한다.  그렇게 되면 최종 완성되는 주소는

http://127.0.0.1:8000/vuln?param=<script>location.href = "/memo?memo=" + document.cookie;</script>

vuln 엔드포인트의 파라미터에 xss 공격을 해서 location.href를 이용해서 memo 엔드포인트로 이동한다.

그리고 거기에 document.cookie로 쿠키를 가져와서 memo_text에 저장을 하고 우리에게 출력이 될 것이다.

 

'Web > Dreamhack : Web' 카테고리의 다른 글

[Dreamhack : Web] csrf-1  (0) 2023.02.22
[Dreamhack : Web] xss-2  (0) 2023.02.22
[Dreamhack : Web] cookie  (0) 2023.02.21
[Dreamhack : Web] session-basic  (0) 2023.02.21
[Dreamhack : Web] devtools  (0) 2023.02.21