百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

PHP 代码审计之 SQL 注入

citgpt 2024-09-26 11:28 6 浏览 0 评论

点击右上角【关注】发哥微课堂头条号,get更多相关技能~



0x00:前言

用 CMS 做例子,今天刚下载安装,因为首页的搜索功能比较显眼,所以看了一下是存在 sql 注入的,基本没有防护机制,CMS 比较冷门,不属于热门,所以安全性也低一点,做审计练手很合适。

0x01:代码追踪

搜索时 URL 如下:/archives/detail.php?name=1,通过 URL 可知其相应的 php 文件为 archives 下的 detail.php,打开此文件,内容如下:

PHP 代码审计之 SQL 注入

<?php
 require_once('include/detail.inc.php');
?>

只有一行内容,包含了 include 下的 detail.inc.php 文件,打开这个文件,定位到搜索接收 name 参的代码上,其片段代码如下:

$arrWhere = array();
$arrWhere[] = "type_title_english = '".$_GET['name']."'";
$strWhere = implode(' AND ', $arrWhere);
$strWhere = 'where '.$strWhere;
$arrInfo = $objWebInit->getInfoWhere($strWhere);

代码中是直接通过 $_GET 获取到的搜索内容,这里并没有做相关的防护措施,获取到搜索内容后,直接拼接到了 $strWhere 变量中,也就是 sql 语句的 where 部分,然后传递给了 getInfoWhere 函数,初步判定是有 sql 注入危险,随后 ctrl + 左键定位到这个函数查看,其代码如下:

public function getInfoWhere($strWhere=null,$field = '*',$table=''){
 try {
 $table = $table?$table:$this->tablename1;
 $strSQL = "SELECT $field FROM $table $strWhere";
 $rs = $this->db->query($strSQL);
 $arrData = $rs->fetchall(PDO::FETCH_ASSOC);
 if(!empty($arrData[0]['structon_tb'])) $arrData = $this->loadTableFieldG($arrData);
 if($this->arrGPdoDB['PDO_DEBUG']) echo $strSQL.'<br><br>';
 return current($arrData);
 } catch (PDOException $e) {
 echo 'Failed: ' . $e->getMessage().'<br><br>';
 }
}

在这个函数中传来的 $strWhere 变量直接拼接到了 $strSQL 中,直至到执行 sql,那么可以确定这个搜索功能有 sql 注入问题。前提是程序没有使用全局过滤器或其他的防护措施。

0x02:渗透验证

通过代码的流程可以看出来搜索功能是存在 sql 注入的,下面通过 burp 和 sqlmap 进行验证,结果如下:

可以证明,搜索功能存在 sql 注入漏洞。

0x03:修复建议

通常情况下 sql 注入修复方式有两种,第一个是过滤危险的字符,这些字符不止限与单引号双引号,包扩 union、sleep 等数据库的关键字。第二个是使用预编译语句,收到的值使用占位符进行数据库的 CURD,而不是直接拼接到 sql 中。

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: