리버싱/드림핵

CSRF-함께실습(자료 참고)

chaha 2022. 9. 14. 12:43

엔드포인트설명

/ 인덱스 페이지 입니다.
/vuln 이용자가 입력한 값을 출력
(이 때 XSS가 발생할 수 있는 키워드는 필터링함)
/memo 이용자가 메모를 남길 수 있으며, 작성한 메모를 출력
/admin/notice_flag 메모에 FLAG를 작성하는 기능
이 기능은 로컬호스트에서 접속해야 함, 사이트 관리자만 사용가능
/flag 전달된 URL에 임의 이용자가 접속하게끔 함

 

코드 해석(중요하다 생각되는 일부만 가져옴)   ← 본인이 아직 코딩을 완전히 마스터하지 않았기에 이해를 돕기 위해 추가

 

@app.route('/admin/notice_flag')                               # notice_flag 페이지 라우팅

def admin_notice_flag(): global memo_text              # 메모를 전역변수로 참조

      if request.remote_addr != '127.0.0.1':                 # 이용자의 IP가 로컬호스트가 아닌 경우

           return 'Access Denied'                                   # 접근 제한

      if request.args.get('userid', '') != 'admin':            # userid 파라미터가 admin이 아닌 경우

           return 'Access Denied 2'                               # 접근 제한

      memo_text += f'[Notice] flag is {FLAG}\n'         # 위의 조건을 만족한 경우 메모에 FLAG 기록

      return 'Ok'                                                          # Ok 반환

 

-----------------------------------------------------------------

 

@app.route("/flag", methods=["GET", "POST"])                     # flag 페이지 라우팅 (GET, POST 요청을 모두 받음)

def flag():

      if request.method == "GET":                                            # 이용자의 요청이 GET 메소드인 경우

          return render_template("flag.html")                              # 이용자에게 링크를 입력받는 화면을 출력

      elif request.method == "POST":                                      # 이용자의 요청이 POST 메소드인 경우

           param = request.form.get("param", "")                     # param 파라미터를 가져온 후,

           if not check_csrf(param):                                           # 관리자에게 접속 요청 (check_csrf 함수)

               return '<script>alert("wrong??");history.go(-1);</script>'

           return '<script>alert("good");history.go(-1);</script>'

def check_csrf(param, cookie={"name": "name", "value": "value"}):

      url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"          # 로컬 URL 설정

      return read_url(url, cookie)                                                                              # URL 방문

def read_url(url, cookie={"name": "name", "value": "value"}):

      cookie.update({"domain": "127.0.0.1"})                          # 관리자 쿠키가 적용되는 범위를 127.0.0.1로 제한되도록 설정

      try:

           options = webdriver.ChromeOptions()                      # 크롬 옵션을 사용하도록 설정

 

 

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

함께 실습을 통하여 해당 실습을 풀기는 하였으나, 자력으로 완전히 이해하고 푼 것이 아니라 차후에 복습이 필요하다

 

 

자세한 내용은 드림핵 웹해킹 로드맵 스테이지5!!

https://dreamhack.io/lecture/courses/203

 

Exercise: CSRF

이 코스에서는 CSRF와 관련된 문제를 풀어봅니다.

dreamhack.io

 

'리버싱 > 드림핵' 카테고리의 다른 글

웹해킹 - Relational DBMS  (0) 2022.09.27
CSRF-혼자실습(자료 참고)  (0) 2022.09.14
CSRF  (0) 2022.09.13
웹해킹 - XSS  (0) 2022.05.03
웹해킹 - SOP문제 오답  (0) 2022.05.03