Web学习笔记 Writeup

攻防世界入门题单:https://adworld.xctf.org.cn/challenges/problem-set-index?id=25

入门题单教程:https://www.bilibili.com/video/BV1rz4y137dF/(讲的非常通俗,爱了爱了)

1.view_source

题目描述:

1
X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。

本题要求就是看网页源代码,按F12,元素里就可以看到flag

flag为:

1
cyberpeace{34c612f0278f14ab46733186fa21d41f} 

2.get_post

题目描述:

1
X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗?

通过上网查询,得知:

HTTP协议中最常用的两种请求方法是GET和POST。

  • GET:用于从服务器获取数据,参数通过URL传递(如/test?name=value),适合非敏感信息的查询,但数据长度受URL限制。
  • POST:用于向服务器提交数据,参数放在请求体中(如表单提交),适合传输敏感或大量数据(如文件上传)。

这是HTTP协议中基础且最广泛使用的两种方法,其他方法(如PUT、DELETE等)通常用于RESTful API设计,但日常场景中GET和POST最为常见。

其中,需要注意的是,GET请求的参数必须放在URL的?之后,格式为 ?参数名=值(多个参数用&分隔)。

例如本题,题目第一个要求是

1
请用GET方式提交一个名为a,值为1的变量

例如本题:

http://61.147.171.103:64044/是**url**,其中**/**后面加参数,根据上面说的规则,应该是下面这种形式:

http://61.147.171.103:64044/**?a=1**

这样我们就构造了一个get请求,然后我们就可以用两种方式来发送:

第一种就是直接访问http://61.147.171.103:64044/**?a=1**这个就能看到改变。

第二种就是使用浏览器插件hackbar,具体安装教程可以上网查询,也可以看我开头给的别的师傅的教程。

使用hackbar:

1.右键鼠标点击检查或者直接F12,上面选项的最右边就是hackbar

2.点击load,会载入现在查看的网页,在你构造完get请求后点击EXECUTE,就可以发现页面发生变化,出现第二个要求:

1
请再以POST方式随便提交一个名为b,值为2的变量

这里在hackbar里点击USE POST method → 声明请求方法为 POST

body里填写b=2→ 将参数放入 HTTP 请求体(Body)(参数放在请求体中(如表单提交)这是上面上网查询得到的,hackbar就是完成这一步操作的工具,Body 中的数据是 URL 编码的键值对(格式为 参数名=值),请按此规则解析。)

点击EXECUTE发送即可得到flag:

1
cyberpeace{7ae8333fd47e586cf2c048df6233108a}

3.robots

题目描述:

1
X老师上课讲了Robots协议,小宁同学却上课打了瞌睡,赶紧来教教小宁Robots协议是什么吧。

Robots 协议(又叫 robots.txt、爬虫协议)是网站用来告诉搜索引擎爬虫(spider、bot)哪些页面可以抓取、哪些不可以抓取的约定。它本身不是防火墙,也没有强制执行力,只有遵守协议的爬虫才会按指令行动。


1️⃣ 为什么会有这个协议?

  • 保护站点隐私:站长可以阻止搜索引擎抓取后台、登录页、临时文件等不希望公开的内容。
  • 减轻爬虫负载:通过限制爬取频率(Crawl‑delay)或排除大文件,避免对服务器造成过大压力。
  • 控制搜索结果:只让重要的页面被索引,提高 SEO 效果。

如果站点根目录下没有 robots.txt,搜索引擎默认可以抓取所有非受密码保护的页面[1]


2️⃣ 文件位置与格式

  • 必须放在网站根目录的 /robots.txt(即 http://example.com/robots.txt)下[4]
  • 文件是纯文本(ASCII/UTF‑8),每行一条指令,以 # 开头的行为注释。

3️⃣ 基本指令(最常见的几条)

指令 作用 示例
User-agent: 指定哪类(或全部)爬虫适用本组规则。* 表示 所有爬虫[2]。
Disallow: 禁止爬虫访问后面的路径。路径相对于根目录。
Allow: 允许访问即使上层有 Disallow(用于细粒度放行)。
Crawl-delay: 建议爬虫每次请求之间的等待秒数(非所有搜索引擎都实现)[2]。
Sitemap: 声明站点地图位置(不受 User-agent 限制)[2]。

常见写法示例

txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 1. 让所有爬虫只能访问根目录,其他全部禁止
User-agent: *
Disallow: /

# 2. 只禁止特定目录 /admin/,其他都可以
User-agent: *
Disallow: /admin/

# 3. 为 Googlebot 单独放行一个文件
User-agent: Googlebot
Allow: /folder1/myfile.html
Disallow: /

# 4. 设置爬取间隔(对支持的爬虫)
User-agent: *
Crawl-delay: 10

# 5. 声明 Sitemap
Sitemap: https://example.com/sitemap.xml
# 1. 让所有爬虫只能访问根目录,其他全部禁止
User-agent: *
Disallow: /

# 2. 只禁止特定目录 /admin/,其他都可以
User-agent: *
Disallow: /admin/

# 3. 为 Googlebot 单独放行一个文件
User-agent: Googlebot
Allow: /folder1/myfile.html
Disallow: /

# 4. 设置爬取间隔(对支持的爬虫)
User-agent: *
Crawl-delay: 10

# 5. 声明 Sitemap
Sitemap: https://example.com/sitemap.xml

Disallow: 后面可以使用 通配符 *(匹配任意字符)和 正则 $ 来匹配文件后缀等[2]。


4️⃣ 扩展/补充方式

名称 说明
Robots Meta 标签 放在页面 <head> 中的 <meta name="robots" content="noindex,nofollow">,对单个页面细粒度控制[4]
X‑Robots‑Tag HTTP Header 通过服务器返回头部 X-Robots-Tag: noindex, nofollow,可以对非 HTML 资源(PDF、图片等)设置指令。
非标准指令 Allow:(最早不是正式标准,但已被多数搜索引擎接受)[2]。

这些方式都是**“自律”**的约定,搜索引擎可以选择不遵守(尤其是恶意爬虫),因此不能把 robots.txt 当作安全防护手段[1]


5️⃣ 使用注意事项(避免常见坑)

  1. 路径大小写敏感:Linux 主机上 /Admin//admin/ 被视为不同路径。
  2. 不要在 Disallow 中写 * 代表所有文件(Disallow: * 实际会被解释为“禁止访问名为 * 的文件”),应使用 Disallow: /[2]。
  3. 不要阻止 CSS/JS:如果搜索引擎抓取不到页面的样式或脚本,可能导致页面被误判为低质量。
  4. 定期检查:可以用 https://www.google.com/webmasters/tools/robots-testing-toolcurl -I https://example.com/robots.txt 查看是否生效。
  5. Sitemap 必须可访问:若在 robots.txt 中声明了 Sitemap,确保该 URL 返回 200,否则搜索引擎会忽略站点地图。

6️⃣ 小结

  • Robots 协议 = 站点根目录的 robots.txt,用来说明**“哪些内容可以被搜索引擎抓取,哪些不可以”**。
  • 通过 User-agentDisallowAllow 等指令,站长可以细粒度控制爬虫行为。
  • 它是自愿遵守的规则,并非硬件防护;真正的安全措施仍需通过认证、权限控制来实现。

这样,小宁同学就能在以后写网站或调试爬虫时,快速判断或配置 robots.txt,让搜索引擎与站点和谐相处啦! 🚀

对于本题页面是空白的,查看源代码发现显示flag is not here,所以先访问容器下的robots.txt查看允许我访问什么,例如 http://61.147.171.105:57360/robots.txt,然后页面返回的是:

1
2
3
User-agent: *
Disallow:
Disallow: f1ag_1s_h3re.php

虽然这上面写着 f1ag_1s_h3re.php不能被访问,但是我们仍然可以去访问试试,即http://61.147.171.105:57360/f1ag_1s_h3re.php,发现flag出了:

1
cyberpeace{a51eb719c6d2ce582fc6781fd17d85f2}

4.backup

题目描述:

1
X老师忘记删除备份文件,他派小宁同学去把备份文件找出来,一起来帮小宁同学吧!

backup就是备份文件的意思

你点击容器后发现页面上有一句话:

1
你知道index.php的备份文件名吗?

备份文件主要后缀名有

.git (git工作目录),.svn.swp.~.bak.bash_history(bash历史指令)

先访问index.php发现还是那个页面,之后不断在后面加后缀,例如:http://61.147.171.105:57073/index.php.bak,

http://61.147.171.105:57073/index.php.git

最后在写到.bak那个后缀的时候你下载到了一个文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<html>
<head>
<meta charset="UTF-8">
<title>备份文件</title>
<link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet" />
<style>
body{
margin-left:auto;
margin-right:auto;
margin-TOP:200PX;
width:20em;
}
</style>
</head>
<body>
<h3>你知道index.php的备份文件名吗?</h3>
<?php
$flag="Cyberpeace{855A1C4B3401294CB6604CCC98BDE334}"
?>
</body>
</html>

所以,flag为:

1
Cyberpeace{855A1C4B3401294CB6604CCC98BDE334}

这里还有第二种解题方式,在你不知道备份文件是什么的前提下,可以使用kali自带的dirsearch,就是路径扫描

命令是

1
2
3
4
dirsearch -u <target url>
例如:dirsearch -u http://61.147.171.105:58474/
或者单纯指定php
dirsearch -u http://61.147.171.105:58474/ -e php

这样他就会扫描这个网址的全部目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
┌──(kali㉿kali)-[~/Desktop]
└─$ dirsearch -u http://61.147.171.105:58474/
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
from pkg_resources import DistributionNotFound, VersionConflict

_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25
Wordlist size: 11460

Output File: /home/kali/Desktop/reports/http_61.147.171.105_58474/__26-01-23_07-18-13.txt

Target: http://61.147.171.105:58474/

[07:18:13] Starting:
[07:18:30] 403 - 295B - /.ht_wsr.txt
[07:18:30] 403 - 298B - /.htaccess.bak1
[07:18:30] 403 - 300B - /.htaccess.sample
[07:18:30] 403 - 298B - /.htaccess_orig
[07:18:30] 403 - 296B - /.htaccess_sc
[07:18:31] 403 - 296B - /.htaccessOLD
[07:18:31] 403 - 289B - /.html
[07:18:31] 403 - 288B - /.htm
[07:18:31] 403 - 298B - /.htpasswd_test
[07:18:31] 403 - 295B - /.httr-oauth
[07:18:31] 403 - 298B - /.htaccess.orig
[07:18:31] 403 - 298B - /.htaccess.save
[07:18:31] 403 - 297B - /.htaccessOLD2
[07:18:31] 403 - 294B - /.htpasswds
[07:18:31] 403 - 299B - /.htaccess_extra
[07:18:31] 403 - 296B - /.htaccessBAK
[07:18:34] 403 - 289B - /.php3
[07:18:34] 403 - 288B - /.php
[07:19:32] 200 - 500B - /index.php.bak
[07:19:50] 403 - 297B - /server-status
[07:19:50] 403 - 298B - /server-status/

Task Completed
1
[07:19:32] 200 -  500B  - /index.php.bak

这样就发现了,然后如法炮制,即可得到flag.

题目描述:

1
X老师告诉小宁他在cookie里放了些东西,小宁疑惑地想:‘这是夹心饼干的意思吗?’

打开页面是:

1
你知道什么是cookie吗?

Cookie 是网站存储在用户浏览器中的小型文本数据片段,用于识别用户、保存状态或个性化设置,是 Web 交互的基础机制之一。简单来说,它是网站用来“记住你”的小纸条。

怎么看自己的cookie呢?

直接F12在选项:应用,里面可以找到cookie的选项点开可以发现cookie.php,这里我们去访问一下,发现页面出现一句话:

1
See the http response

http协议中,发包叫request,response就是响应的意思,那么响应怎么看呢?

依旧F12,找到选项:网络,重新刷新网页或者ctrl+R强制刷新,打开cookie.php那个响应,在标头界面往下翻可以发现flag:

1
cyberpeace{18c9da0e745d26b7ab63d5ddd95e0199}

这里补充几点:

User-agent叫请求标头

host就是我们访问的网址

6.disabled_button

题目描述:

1
X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢?

这题涉及到前端知识的简单修改就是修改html代码,让按钮可以点。

打开F12-元素,按中左上角那个小图标,抓取按钮那一部分

可以发现有关前端代码:

1
<input disabled="" class="btn btn-default" style="height:50px;width:200px;" type="submit" value="flag" name="auth">

可以看到是有了disabled我才点不了的,所以干脆把disabled=””删掉,怎么修改呢?

右键点击这个就行了修改完了以后点击其他地方就能生效了,然后再次点击那个按钮,响应完成后就可以看到flag:

1
cyberpeace{4bc727d4d0fe2ce93f584285046928c0}

在获得flag后我们复盘一下

发现修改完成之后相当于向后端发送了一个POST请求,请求体是auth=flag,前端也是这么写的:

1
<form action="" method="post">

7.simple_js

题目描述:

1
小宁发现了一个网页,但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} )

打开以后确实有一个选项框让你输入密码,随便输入一个密码都会提示:FAUX PASSWORD HAHA

这时候我们看看源代码,F12或者ctrl+u都可以,源代码是js代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<html>
<head>
<title>JS</title>
<script type="text/javascript">
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;}
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));

h = window.prompt('Enter password');
alert( dechiffre(h) );

</script>
</head>

</html>

这个代码的意思是

主要函数 dechiffre(pass_enc)

  • 硬编码了一个密码数组:70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65
  • 将输入的密码字符串按逗号分割成数组
  • 通过复杂的索引操作将两个数组组合

实际执行流程:

  1. 代码在底部调用 dechiffre("\x35\x35\x2c\x35\x36\x2c...")
  2. 弹窗要求用户输入密码
  3. 将用户输入传递给 dechiffre 函数
  4. 显示处理结果

密码分析: 硬编码的ASCII码 70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65 转换为字符是: FAUX PASSWORD HAHA(意思是”假密码 哈哈”)

就是你不管输入什么密码都会给你返回FAUX PASSWORD HAHA,看似无解其实关键在于

1
\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30

这个十六进制字符串,用python脚本转换一下,先把十六进制转换为一些数字,再把数字转换成ASCII码就是flag里包裹的内容:

1
2
3
4
5
6
7
s = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"
s = s.split(",")
print(s)
result = ""
for num in s:
result += chr(int(num))
print(result)

结果为:

1
2
['55', '56', '54', '79', '115', '69', '114', '116', '107', '49', '50']
786OsErtk12

第二行就是我们flag里的字符串,所以flag为:

1
Cyberpeace{786OsErtk12}

8.xff_referer

题目描述:

1
X老师告诉小宁其实xff和referer是可以伪造的。