김승현
[Dreamhack : Web] xss-1 본문
문제
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 |