2024-08-07

要使用phpStudy在本地搭建网站并通过内网穿透进行远程访问,您需要完成以下步骤:

  1. 安装phpStudy。
  2. 配置网站。
  3. 安装并设置内网穿透软件。

以下是具体操作步骤和示例代码:

  1. 安装phpStudy:

    访问phpStudy官网下载最新版本,按照引导进行安装。

  2. 配置本地网站:

    打开phpStudy,启动服务,并通过浏览器访问本地服务器。

  3. 安装内网穿透软件:

    例如,使用ngrok,需要访问ngrok官网注册账户并下载对应的软件。

  4. 设置内网穿透:

    在命令行中运行ngrok,并提供授权令牌和要暴露的端口号。




ngrok authtoken <YOUR_AUTHTOKEN>
ngrok http 80
  1. 访问您的网站:

    启动内网穿透后,ngrok会提供一个外网可访问的地址,使用这个地址就可以在远程设备上访问您的本地网站。

请注意,内网穿透服务如ngrok可能需要一个付费账户来获得稳定的链接,而且在使用时需要确保您的外网可访问地址不会导致安全问题。

2024-08-07

这是一个BugKu平台的PHP题目,名为“聪明的PHP”。这个问题涉及到PHP代码审计和安全性。

题目描述:




<?php
$flag = "bugku{*****************}";
if (isset ($_GET['password'])) {
    if (eregi ("iloveyou", $_GET['password'])) {
        echo 'YOU SHOULD NOT LOVE ME';
        exit;
    }
    if (eregi ('[a-zA-Z0-9]', $_GET['password'])) {
        echo 'ONLY NUMBERS AND LETTERS';
        exit;
    }
    $password = $_GET['password'];
    if ($password == "1314520") {
        echo $flag;
    } else {
        echo 'WRONG PASSWORD';
    }
} else {
    highlight_file(__FILE__);
}
?>

解决方法:

这个问题的关键在于绕过三层过滤。第一层是eregi函数,它检查$\_GET['password']是否包含"iloveyou"字符串。第二层过滤检查是否只包含字母和数字。最后一层是检查密码是否等于1314520。

  1. 绕过eregi函数的"iloveyou"检查,可以使用unicode字符集,例如I\u006Cove\u006Fyou
  2. 绕过只包含字母和数字的检查,可以使用特殊字符,例如1314520a

因此,构造的payload为:




password=I\u006Cove\u006Fyou1314520a

将此payload作为URL参数传递,即可得到flag。

注意:eregi函数在PHP 7.0.0版本后已被废弃,并在PHP 7.3.0中完全移除。在实际应用中,应该使用preg_match函数和i修饰符来进行不区分大小写的正则表达式匹配。

2024-08-07

在PHP中处理高并发主要有两种方法:多进程和多线程。以下是使用多线程处理高并发的示例代码:




class AsyncOperation extends Thread {
    public $url;
 
    public function __construct($url) {
        $this->url = $url;
    }
 
    public function run() {
        if ($this->url) {
            $response = file_get_contents($this->url);
            // 处理响应
        }
    }
}
 
// 使用ThreadPool处理并发
$pool = new Pool(4); // 最多并发4个线程
 
// 添加任务到线程池
for ($i = 0; $i < 10; $i++) {
    $url = "http://example.com/api/data?id=" . $i;
    $worker = new AsyncOperation($url);
    $pool->submit($worker);
}
 
// 等待所有线程完成
$pool->shutdown();

这段代码使用了Pthreads扩展来创建多线程环境。AsyncOperation类继承自Thread,实现了线程要执行的任务。然后,我们创建了一个Pool对象,限制最多并发执行4个线程。我们将需要并发执行的任务通过submit方法提交到线程池,并在所有任务完成后调用shutdown方法等待线程池关闭。

请注意,Pthreads扩展在PHP 7.4之后不再被官方支持,因此在使用时需要考虑兼容性问题。此外,多线程在处理共享资源时可能会遇到同步和竞态条件的问题,需要特别注意线程安全性。

2024-08-07

array_reduce() 函数在PHP中是用来通过使用用户自定义的函数来减少数组,从而将数组简化为单一值的。这个函数会对数组中的每个元素应用回调函数,并且将上次的回调函数结果与当前的元素组合起来。

下面是一个使用 array_reduce() 函数的例子,它将一个整数数组中的所有元素相加,从而得到数组元素的总和。




<?php
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, function ($carry, $item) {
    return $carry + $item;
});
 
echo $sum; // 输出 15
?>

在这个例子中,array_reduce() 函数的第二个参数是一个匿名函数,它接受两个参数:$carry(进位值)和 $item(当前元素)。这个匿名函数的作用是将当前元素加到进位值上,并返回新的进位值。在第一次迭代时,$carry 的值是数组的第一个元素,而 $item 是第二个元素。随着迭代的进行,$carry 的值会不断更新,最终计算出数组的总和。

2024-08-07

在CTF中,PHP可能会有一些函数和正则表达式的限制,以至于我们需要找到绕过的方法。以下是一些常见的PHP函数和正则表达式的绕过方法:

  1. preg_match()preg_replace():

    • 利用点.匹配换行符绕过,如果正则表达式中使用了s修饰符,点就会匹配换行符。
    • 使用\R来匹配所有的换行符,这在PHP 7.2.0以上版本中可用。
    • 利用(?s)来启用preg_match()中的.匹配换行符。
  2. eval():

    • 使用其他代码执行函数如assert()create_function()array_map()call_user_func()替换eval()进行绕过。
  3. disable_functions:

    • 如果eval()或其他函数被禁用,可以使用base64编码来执行代码。
  4. shell_exec(), exec(), system(), passthru():

    • 使用PHP的内置函数如pcntl_exec() (需要proc\_open函数开启),或者使用文件包含漏洞来运行外部程序。
  5. file_get_contents(), fopen(), file(), readfile():

    • 使用PHP的内置函数如fsockopen()配合file_get_contents()或者fopen()来读取远程文件。
  6. parse_str():

    • 使用%00截断的方法绕过,如?var=something&something=%00
  7. escapeshellarg(), escapeshellcmd():

    • 使用特殊构造的字符串绕过,比如用单引号替代双引号,或者使用管道操作符(|)和后台命令。
  8. preg_replace()e修饰符:

    • 在PHP 5.5.0以上,preg_replace()/e修饰符被移除,但可以使用preg_replace_callback()代替。

以上是一些常见的PHP函数和正则表达式的绕过方法,具体情况还需要根据CTF题目的具体限制来选择合适的绕过方式。

2024-08-07

在PHP中实现文件上传功能,需要使用超全局变量$_FILES,它包含了所有上传的文件信息。以下是一个简单的例子:

  1. HTML表单代码(upload\_form.html):



<form action="upload.php" method="post" enctype="multipart/form-data">
  选择文件:<input type="file" name="fileToUpload" id="fileToUpload">
  <input type="submit" value="上传文件" name="submit">
</form>
  1. PHP处理上传(upload.php):



<?php
$target_dir = "uploads/"; // 指定上传目录
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); // 目标文件路径
 
// 检查文件大小
if ($_FILES["fileToUpload"]["size"] > 500000) {
  echo "抱歉,文件过大。";
  exit;
}
 
// 允许的文件格式
$allowed_types = array("jpg", "png", "jpeg", "gif");
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
if (!in_array($imageFileType, $allowed_types)) {
  echo "抱歉,只允许 JPG, JPEG, PNG & GIF 文件格式。";
  exit;
}
 
// 检查是否有错误
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
  echo "文件上传成功。";
} else {
  echo "上传失败。";
}
?>

确保服务器配置文件php.ini中已经正确设置了文件上传的相关配置项,如upload_max_filesizepost_max_size,以及确保上传目录有足够的权限。

2024-08-07



<?php
// 高精度加法
function bcadd($left_operand, $right_operand, $scale = 0) {
    return $left_operand + $right_operand; // 示例代码,实际应使用BCMath库
}
 
// 高精度减法
function bcsub($left_operand, $right_operand, $scale = 0) {
    return $left_operand - $right_operand; // 示例代码,实际应使用BCMath库
}
 
// 高精度乘法
function bcmul($left_operand, $right_operand, $scale = 0) {
    return $left_operand * $right_operand; // 示例代码,实际应使用BCMath库
}
 
// 高精度除法
function bcdiv($left_operand, $right_operand, $scale = 0) {
    return $left_operand / $right_operand; // 示例代码,实际应使用BCMath库
}
 
// 比较高精度数字
function bccomp($left_operand, $right_operand, $scale = 0) {
    return $left_operand <=> $right_operand; // PHP 7+ 的 spaceship 运算符用于比较
}
 
// 高精度取模
function bcmod($left_operand, $modulus) {
    return $left_operand % $modulus; // 示例代码,实际应使用BCMath库
}
 
// 高精度指数运算
function bcpow($left_operand, $right_operand, $scale = 0) {
    return pow($left_operand, $right_operand); // 示例代码,实际应使用BCMath库
}
 
// 高精度平方根
function bcsqrt($operand, $scale = 0) {
    return sqrt($operand); // 示例代码,实际应使用BCMath库
}
 
// 将字符串转换为高精度数字
function bcadd($number, $scale = 0) {
    return floatval($number); // 示例代码,实际应使用BCMath库
}
 
// 设置全局精度和小数点位数
function bcscale($scale) {
    return ini_set('bcscale', $scale); // 示例代码,实际应使用BCMath库
}
 
// 以下是使用示例
$result1 = bcadd(1.234, 4.567);
$result2 = bcsub(2.345, 1.234);
$result3 = bcmul(3.456, 7.890);
$result4 = bcdiv(10.000, 3.000);
$compare = bccomp(5.555, 5.554);
$modulus = bcmod(123, 10);
$power = bcpow(2, 8);
$sqrt = bcsqrt(16);
$str2num = bcadd('123.456');
$scale = bcscale(4);
 
// 打印结果
print_r($result1);
print_r($result2);
print_r($result3);
print_r($result4);
print_r($compare);
print_r($modulus);
print_r($power);
print_r($sqrt);
print_r($str2num);
print_r($scale);
 
// 注意:以上代码只是为了展示函数的使用方式,实际上这些函数需要PHP的BCMath扩展支持。
// 在实际应用中,应确保BCMath库已经安装并启用。
?>

这段代码展示了如何使用PHP中的高精度计算函数。每个函数都是一个简单的示例,说明了它们的功能和用法。注意,这

2024-08-07



<?php
// 假设这是ThinkPHP框架中的一个控制器文件,我们将测试序列化漏洞。
 
namespace Home\Controller;
use Think\Controller;
 
class SerializeController extends Controller {
    public function index() {
        $data = $_GET['data'];
        $unserializedData = unserialize($data);
        echo $unserializedData;
    }
}
 
// 使用以上代码,攻击者可以通过发送带有恶意序列化对象的GET请求来尝试利用序列化漏洞。
// 例如,攻击者可以发送以下请求来尝试利用漏洞:
// http://your-thinkphp-app.com/index.php/Home/Serialize/index?data=O:8:"stdClass":1:{s:4:"test";s:5:"hello";}
 
// 注意:实际攻击时,攻击者可能会尝试利用更复杂的序列化数据来执行恶意代码。
// 这里展示的是序列化漏洞的基本测试方法,实际应用中应该采取防护措施,如对输入进行验证和清理,使用安全的序列化和反序列化方法等。

在这个代码实例中,我们定义了一个简单的控制器,它接受GET参数data,并尝试对其进行反序列化。这可以作为序列化漏洞的测试用例,同时提醒开发者注意这一安全问题。在实际应用中,应该采取防护措施,例如对输入进行验证和清理,使用安全的序列化和反序列化方法等。

2024-08-07

要在VS Code中使用Live Server和Five Server进行PHP实时调试,你需要在VS Code中安装相应的插件,并进行配置。

  1. 安装插件:

    • Live Server:通过扩展商店搜索并安装Live Server插件。
    • Five Server:通过扩展商店搜索并安装Five Server插件。
  2. 配置Live Server:

    • 打开VS Code,在项目目录中,右键点击你的PHP文件,选择“Open with Live Server”。
    • 你也可以在VS Code中打开settings.json文件,添加以下配置来改变默认端口:

      
      
      
      "liveServer.settings.port": 5500
  3. 配置Five Server:

    • 在项目目录中打开终端。
    • 运行fiveserver命令启动服务器,默认情况下,它会在5500端口上运行。
    • 如果需要,可以在终端中指定不同的端口:

      
      
      
      fiveserver -p 8080
  4. 设置launch.json进行调试:

    • 在VS Code中打开调试面板(Ctrl+Shift+D)。
    • 点击“创建launch.json”,选择“PHP”。
    • 修改生成的launch.json文件,配置XDebug相关参数,例如:

      
      
      
      {
        "version": "0.2.0",
        "configurations": [
          {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000
          }
        ]
      }
  5. 配置php.ini:

    • 修改php.ini文件,启用XDebug扩展,并设置监听端口和IDE关键字:

      
      
      
      zend_extension=xdebug.so
      xdebug.mode=debug
      xdebug.start_with_request=yes
      xdebug.client_port=9000
      xdebug.client_host=localhost
      xdebug.idekey=vscode

完成以上步骤后,你可以在VS Code中启动调试会话,并通过Five Server或Live Server打开你的PHP文件,进行实时编辑和调试。记得在修改文件后刷新浏览器页面以查看更改。

2024-08-07



<?php
// 首先检查APCu是否可用
if (function_exists('apcu_store') && function_exists('apcu_fetch')) {
    // 存储一个变量到缓存中
    apcu_store('key', 'value', 3600); // 存储键为'key'的值,有效期为3600秒
 
    // 从缓存中获取一个变量
    $value = apcu_fetch('key');
    if ($value === false) {
        // 如果变量不存在于缓存中,可以进行相应处理
        $value = 'default'; // 假设的默认值
    }
 
    // 输出获取到的变量
    echo $value;
} else {
    // 如果APCu不可用,可以输出提示信息或执行其他逻辑
    echo 'APCu is not available.';
}
?>

这段代码首先检查APCu是否可用,然后尝试存储并获取一个缓存项。如果变量不存在,它会设置一个默认值。这个流程是处理缓存数据时的一个基本模式,开发者可以在此基础上根据自己的需求进行功能扩展。