Tett open redirect i login-next
next-parameteren godtok "//evil.com", som nettlesere tolker som en ekstern URL. Nå godtas bare stier som starter med én skråstrek. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JcEy43fNYpwg6K6oTKakWR
This commit is contained in:
parent
d2e45fb6c9
commit
227faff373
2 changed files with 15 additions and 1 deletions
|
|
@ -129,7 +129,9 @@ def login():
|
||||||
session["uid"] = user.id
|
session["uid"] = user.id
|
||||||
csrf_token()
|
csrf_token()
|
||||||
nxt = request.form.get("next") or url_for("admin.index")
|
nxt = request.form.get("next") or url_for("admin.index")
|
||||||
if not nxt.startswith("/"):
|
# Kun stier på dette nettstedet: "//evil.com" og "/\\evil.com"
|
||||||
|
# tolkes som skjema-relative URL-er av nettlesere.
|
||||||
|
if not nxt.startswith("/") or nxt.startswith("//") or "\\" in nxt:
|
||||||
nxt = url_for("admin.index")
|
nxt = url_for("admin.index")
|
||||||
return redirect(nxt)
|
return redirect(nxt)
|
||||||
flash("Feil brukernavn eller passord.", "error")
|
flash("Feil brukernavn eller passord.", "error")
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,18 @@ def test_guest_flow_and_isolation(client, cfg):
|
||||||
assert client.get("/nytt-innlegg/").status_code == 404
|
assert client.get("/nytt-innlegg/").status_code == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_login_next_no_open_redirect(client):
|
||||||
|
for bad in ("//evil.com", "/\\evil.com", "https://evil.com"):
|
||||||
|
r = client.post(
|
||||||
|
"/admin/login", data={"username": "eier", "password": "hemmelig123", "next": bad}
|
||||||
|
)
|
||||||
|
assert r.headers["Location"] == "/admin/", bad
|
||||||
|
r = client.post(
|
||||||
|
"/admin/login", data={"username": "eier", "password": "hemmelig123", "next": "/admin/users"}
|
||||||
|
)
|
||||||
|
assert r.headers["Location"] == "/admin/users"
|
||||||
|
|
||||||
|
|
||||||
def test_csrf_enforced(client):
|
def test_csrf_enforced(client):
|
||||||
login(client)
|
login(client)
|
||||||
assert client.post("/admin/new", data={}).status_code == 403
|
assert client.post("/admin/new", data={}).status_code == 403
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue