김승현

[Dreamhack : Web] CSS Injection 본문

Web/Dreamhack : Web

[Dreamhack : Web] CSS Injection

kshind 2023. 3. 3. 17:08

문제

 

css injection 실습 문제이다.

 

풀이

접속하면 이런 화면을 볼 수 있다. 오랜만에 보는 새로운 생김새의 웹인 것 같다.

memo 엔드포인트로 이동하면 login부터 하라고 한다. register로 가입부터 해보자.

guest/guest로 만들어줬다.

login하고 memo로 가보면 이렇게 입력창과 Add 버튼이 있다. 아무거나 입력해보자.

이렇게 입력했다.

그냥 아래에 이렇게 뜨는 방식인 것 같다. Report로 가보자.

이렇게 에러가 생기면 신고하는 페이지 같다. 이번엔 오른쪽 위의 mypage를 가보자.

uid, username, api Token을 볼 수 있다. logout 버튼은 그냥 로그아웃되는 거다.

근데 uid가 2인 걸 봐선 1인 걸로 로그인 하는 그런 문제인 것 같다.(추측) 소스코드를 확인해보자.

init.sql

users라는 table과 memo라는테이플을 만든다. users는 uid, username, token 아까 mypage에서 보여준 내용들이고

memo는 idx와 uid로 몇 번째 글인지와 누가 쓴지 저장해두는 테이블인 것 같다.

 

코드 초반부

import 종류
hashlib, os, binascii,random, string, flask, functools, sqlite3, selenium, promise 등을 import한다.

binascii : 바이너리를 아스키로 변환해줌
flask : 웹 제작 프레임워크
functools - wrap : wrapper 함수를 정의할 때 함수의 이름이나 설명문 같은 속성을 유지하게 해줌
sqlite3 : sql
selenium - webdriver : 다양한 브라우저에서 사용가능한지 테스트해줌
promise : 비동기 연산이 종료된 이후 결과를 알기 위해 사용

app = ...으로 플라스크 객체 생성

app.secret_key 변수에 unsigned 랜덤 ㄱ밧을 저장

 

DATABASE 변수에 db 적용

 

FLAG 변수에 ./flag.txt의 내용 저장 만약 실패시 [**FLAG**] 문자열 저장

 

ADMIN_USERANME 변수에 adminstor 저장

ADMIN_PASSWORD에 16진수로 저장된 값을 아스키형식으로 저장

위의 ADMIN...변수들을 바탕으로 execute 함수로 admin 계정을 생성한다.

execute()

 

index

index.html을 보여줌

 

 

여길 보면 adminUid에 admin의 이름을 가진 계정의 데이터에서 flag를 가져오는 걸로 보인다.

위엘 보면 ADMIN_USERNAME은 adminstor이다.

 

report 엔드포인트에서 path를 어드민 계정으로 접속하게 되는데 이때 path를 검사하지 않기 때문에 이걸 통해서 apikey를

획득하고 나서 api/memo를 통해서 flag가 출력되도록 하면 된다.

짠