CSRF-1

题目简介

XSS注入JavaScript以导致受害者发起HTTP请求。 但是如果没有XSS怎么办? 答案是直接“注入”HTTP请求。

web设计的目的是使许多不同的网站相互连接。 网站可以嵌入来自其他网站的图像,链接到其他网站,甚至重定向到其他网站。 所有这些灵活性意味着一些严重的安全风险,而且几乎没有任何措施可以防止恶意网站直接导致受害者访问者发出潜在的敏感请求,例如(在我们的例子中)将 GET 请求发送给 http://challenge.localhost/publish

这种类型的跨站点请求伪造被称为跨站请求伪造(Cross Site Request Forgery,简称CSRF)。

漏洞点分析

首先分析源码,这题其实存在XSS漏洞,但是admin不会访问/challenge.localhost,因此没办法通过把js代码写到首页去骗admin重定向到publish路由

1
2
3
4
5
6
@app.route("/", methods=["GET"])
def challenge_get():
page = "<html><body>\nWelcome to pwnpost, now XSS-free (for admin, at least)!<hr>\n"
username = flask.session.get("username", None)
if username == "admin":
page += """<b>To prevent XSS, the admin does not view messages!</b>"""

可以看到存在if username==’admin’的额外校验,根据提示应该用CSRF;

接下来看一下victim源码:

1
2
3
4
5
6
7
8
9
10
challenge_url = "http://challenge.localhost:80/"
flag = open("/flag").read().strip()
print(f"Visiting {challenge_url}")
browser.get(challenge_url)
print("Logging in as admin...")


print("Visiting the attacker's website (http://hacker.localhost:1337/)...")
browser.get("http://hacker.localhost:1337/")
time.sleep(3)

分析一下,主要分两个部分,第一个是请求challenge.localhost,并且以admin登录,接下来注意到第二部分会访问本地的1337端口;

因此只要我们在1337开一个web服务,把admin重定向到/publish路由就可以了;

因此存在CSRF漏洞,可以从我们的“钓鱼网站”伪造admin在请求

漏洞点利用

综上,利用思路就是在1337开一个服务,等victim访问我们,然后再以guest身份登录challenge.localhost即可看到flag
开启服务有很多方法,题目里就提供了两个,一个最基础的nc,前面几题都用过,不再记录

另一个是python的http.server模块,个人感觉python的比nc方便,只要写一个简单的index.html就行;

因此写出如下的index.html

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSRF Attack</title>
<script>
window.location.href="http://challenge.localhost/publish"
</script>
</head>
<body>
</body>
</html>

综上,完整流程是:

首先启动/challenge/server

之后cd到保存有index.html的目录中并运行以下命令:

1
python -m http.server 1337

之后再运行/challenge/victim,最后刷新浏览器就可以了,也是成功拿到了flag

一点基础知识补充

回看这个Wp,感觉缺了些基础知识的讲解,简单讲一下index.html怎么写出来的

其实主要是html里的这一句

1
2
3
<script>
window.location.href="http://challenge.localhost/publish"
</script>

如果是完全零基础,大概率会有疑问window.location.href是个什么东西(记得pwn.college的前面题目都没讲过这个东西),这里浅浅演示一下,深入的还得自己查,直接看下面这两张图


首先上面第一张图,看到我在浏览器的url里输入了这么个东西:

1
javascript:alert(window.location.href)

拆解一下,alert没什么好说的,alert的参数就是window这一大串,这个url意思就是执行冒号后面的javascript代码,当点击回车的时候,由于当前位于b站的首页,浏览器就会显示b站的域名,如下图


这样应该能感受到,window这一串其实可以理解为网页域名,这道题里我们通过对它赋值,起到了重定向的作用

至于javascript:是什么,其实就是一个伪协议头,可以把它理解为http://这样的东西,搜一下完整的URL组成可以知道这些都是协议头,简单记忆就是不带//的就是伪协议,反之就是我们常见的协议头

伪协议还有很多,像mailto:,这个协议后面跟邮箱,浏览器就会唤起电脑里默认的邮件应用程序,还有tel:,跟个号码,打电话用的

上述基础知识只是一个简单的补充,以后碰到具体题目再做记录


CSRF-1
http://0x4a-210.github.io/2025/07/18/pwn.college/Intro-to-Cybersecurity/Web/CSRF-1/
Posted on
July 18, 2025
Licensed under