• NSS [鹤城杯 2021]Middle magic


    NSS [鹤城杯 2021]Middle magic

    源码直接给了。

    image-20230715194236910

    粗略一看,一共三个关卡

    先看第一关:

    if(isset($_GET['aaa']) && strlen($_GET['aaa']) < 20){
        $aaa = preg_replace('/^(.*)level(.*)$/', '${1}${2}', $_GET['aaa']);
        if(preg_match('/pass_the_level_1#/', $aaa)){
            echo "here is level 2";
    
    • 1
    • 2
    • 3
    • 4

    (1条消息) PHP正则表达式_php 正则_无痕之意的博客-CSDN博客

    正则表达式含义:

    /^(.*)level(.*)$/:包含字符串"level"的字符串

    /pass_the_level_1#/:字符串"pass_the_level_1#"

    这种正则写法是存在缺陷的:.用于任意字符匹配并不包括换行符,而且^ $界定了必须在同一行,否则匹配不到,直接利用%0a(换行符)进行绕过。

    所以我们GET传入aaa=%0apass_the_level_1#就行了。不对,不是这样。

    如果直接传入#的话,#代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如,http://www.example.com/index.html#print就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。

    只有将#转码为%23,浏览器才会将其作为实义字符处理。

    所以这一关的payload:

    ?aaa=%0apass_the_level_1%23
    
    • 1

    来到第二关:

    if (isset($_POST['admin']) and isset($_POST['root_pwd'])) {
                if ($_POST['admin'] == $_POST['root_pwd'])
                    echo '

    The level 2 can not pass!

    '
    ; // START FORM PROCESSING else if (sha1($_POST['admin']) === sha1($_POST['root_pwd'])){ echo "here is level 3,do you kown how to overcome it?";
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    我们需要POST两个变量,adminroot_pwd。要求两个变量不能弱相等并且两个变量的sha1值强相等。

    我们可以sha1强碰撞或者数组绕过。方便一点,这里用哈希数组绕过,强碰撞payload太长了。

    admin[]=1&root_pwd[]=2
    
    • 1

    来到第三关:

    if (isset($_POST['level_3'])) {
                        $level_3 = json_decode($_POST['level_3']);
                        if ($level_3->result == $result) {
                            echo "success:".$flag;
    
    • 1
    • 2
    • 3
    • 4

    要求我们POST提交一个level_3变量,是json格式的。要满足level_3变量的result键的值 与$result变量相等,但是$result变量在index.php中未定义,在result.php中是否定义,未知,所以$result变量具体值是多少我们无从得知。暂且将他当成未定义,那么值就是空,NULL

    这里据说用php的弱比较。以下是一些可能是原理的资料。

    image-20230715215935699

    (1条消息) CTF(JOSN弱类型)_ctf json_sunshinelv99的博客-CSDN博客

    (1条消息) JASON格式与布尔绕过弱类型比较_json数组绕过_王俊凯迷妹的博客-CSDN博客

    实际测试证明,这里level_3只要POST了就行,值是多少都可以。因为空NULL和什么东西弱比较都是true,那么就验证了我们的猜想,$result变量未定义。

    payload:

    &level_3={“result”:“chxvjxkvjckvrfghrekj”}
    &level_3={“result”:0} 
    &level_3={“result”:} 
    &level_3=
    
    • 1
    • 2
    • 3
    • 4

    image-20230717113530687

    扩展阅读:json数组、json对象。

  • 相关阅读:
    HAproxy:负载均衡
    Kafka RecordAccumulator 三 高并发写入数据
    LeetCode_443_压缩字符串
    postgresql简单sql
    力扣203-移除链表元素——链表
    Linux下 /etc/shadow内容详解
    C++的缺陷和思考(六)
    BGP笔记3
    iuv_5g组网问题表
    代码随想录算法训练营|五十九~六十天
  • 原文地址:https://blog.csdn.net/Jayjay___/article/details/134498579