PHP-变量特性(练习)

[题目信息]:

题目名称题目难度
PHP-变量特性(练习)2

[题目考点]:

PHP变量特性

[Flag格式]:

SangFor{Lc9cyksB8xyK8V5cQtOTu3Kr7JpjB2Qk}

[环境部署]:

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

http://分配ip:2062

[题目writeup]:

1、实验主页

2、源码分析

 <?php
error_reporting(0);
include("flag.php");
highlight_file(__FILE__);
$ctf_show = md5($flag);
$url = $_SERVER['QUERY_STRING'];
function waf($url){
    if(preg_match('/\`|\~|\!|\@|\#|\^|\*|\(|\)|\\$|\_|\-|\+|\{|\;|\:|\[|\]|\}|\'|\"|\<|\,|\>|\.|\\\|\//', $url)){
        return true;
    }else{
        return false;
    }
}
if(waf($url)){
    die("emmmm?");
}else{
    extract($_GET);
}
if($ctf_show==='ilove36d'){
    echo $flag;
} 

前置知识

$_SERVER['QUERY_STRING']
query string是Uniform Resource Locator (URL)的一部分, 其中包含着需要传给web application的数据

extract()
函数从数组中将变量导入到当前的符号表,使用数组键名作为变量名,使用数组键值作为变量值

分析代码逻辑,首先给$ctf_show进行了赋值,其次自定义waf过滤url传入的数据。最后看到输出flag条件的这一行代码,需要$ctf_show=ilove36d。然而$ctf_show已经进行赋值了,但是结合上一行代码中的,extract($_GET)可知可使用变量覆盖的方式重新赋值。

此时在GET方式中传参?ctf_show=ilove36d即可实现变量覆盖。但是回到自定义waf中,ctf_show中的_在过滤范围内,结合此前的知识:

php中变量名只有数字字母下划线,被get或者post传入的变量名,如果含有空格、+、[则会被转化为_

。在过滤中可以发现没有空格所以这里可以使用空格代替下划线。

综上所诉,构造payload:

?ctf show=ilove36d





[题目信息]:

题目名称题目难度
PHP-变量特性2

[题目考点]:

PHP变量特性

[Flag格式]:

SangFor{ZUUYNzVn2seoIhNx8qsxpdEe_1aIswH1}

[环境部署]:

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

http://分配ip:2061

[题目writeup]:

1、实验主页

2、源码分析

<?php
error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
$a=$_SERVER['argv'];
$c=$_POST['fun'];
if(isset($_POST['SXF'])&&isset($_POST['CTF_Sangfor.com'])&&!isset($_GET['fl0g'])){
    if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?|flag|GLOBALS|echo|var_dump|print/i", $c)&&$c<=16){
         eval("$c".";");
         if($fl0g==="flag_give_me"){
             echo $flag;
         }
    }
} 

分析代码,总体上而言可以看到在12行可以输出flag值,可以考虑由此入手。但是在此行代码上,可以看到eval()函数会执行$c,所以只需要关注$c和if判断的两个POST方法即可。

在if条件判断中需要检测变量*$_POST[‘SXF’]$_POST[‘CTF_Sangfor.com’]*是否设置,并且不能设置$_GET[‘fl0g’]。这些条件都是可以通过用户输入来自行控制的。

然而在php中变量名只有数字字母下划线,get或者post传入的变量名,如果含有空格、+、[则会被转化为_,所以按理来说我们构造不出CTF_Sangfor.com这个变量(因为含有.),但php中有个特性就是如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换。

然而,与上题不同此题目对$c进行了更多的过滤,包括flag,GLOBALS,echo,var_dump,print等字符串。可以通过highlight_file来显示文件,可以观察到flag字符串在POST方法中被过滤掉了所以这里可以通过GET方法传参。

综上所诉,构造如下payload

?sangfor=flag.php

POST:
SXF=1&CTF[Sangfor.com=1&fun=highlight_file($_GET[sangfor])







[题目信息]:

题目名称题目难度
PHP-变量特性2

[题目考点]:

PHP变量特性

[Flag格式]:

SangFor{AYaogSmNpZR2-K9jrGGn0BFq5t0FoGyB}

[环境部署]:

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

http://分配ip:2060

[题目writeup]:

1、实验主页

2、源码分析

<?php
error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
$a=$_SERVER['argv'];
$c=$_POST['fun'];
if(isset($_POST['SXF'])&&isset($_POST['CTF_Sangfor.com'])&&!isset($_GET['fl0g'])){
    if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?/", $c)&&$c<=18){
         eval("$c".";");  
         if($fl0g==="flag_give_me"){
             echo $flag;
         }
    }
}  

分析代码,总体上而言可以看到在12行可以输出flag值,可以考虑由此入手。但是在此行代码上,可以看到eval()函数会执行$c,所以只需要关注$c和if判断的两个POST方法即可。

在if条件判断中需要检测变量*$_POST[‘SXF’]$_POST[‘CTF_Sangfor.com’]*是否设置,并且不能设置$_GET[‘fl0g’]。这些条件都是可以通过用户输入来自行控制的。

然而在php中变量名只有数字字母下划线,get或者post传入的变量名,如果含有空格、+、[则会被转化为_,所以按理来说我们构造不出CTF_Sangfor.com这个变量(因为含有.),但php中有个特性就是如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换。

在第二个if条件判断中对用户输入的$c进行了过滤,然而不影响构造执行命令打印flag

构造payload:

SXF=1&CTF[Sangfor.com=1&fun=echo $flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值