PbootCMS 3.0.4 SQL注入

这篇具有很好参考价值的文章主要介绍了PbootCMS 3.0.4 SQL注入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.漏洞复现

PbootCMS 3.0.4,下载仓库 · 星梦/PbootCMS - Gitee.com

复现

漏洞页面:http://127.0.0.1/?search 或 http://127.0.0.1/?keyword

POST请求:1=select 1

2.正向分析

从可见功能点正向分析

index.php

...
// 引用内核启动文件
require dirname(__FILE__) . '/core/start.php';

/core/start.php

...
// 启动内核
core\basic\Kernel::run();

/core/basic/Kernel.php

加密了,之后调用 IndexController类 的 _empty方法

...
*  翱云科技版权所有,未经许可擅自破解本文件将依法追究法律责任。
...

/apps/home/controller/IndexController.php

在 _empty方法 的开头添加:

// 空拦截器, 实现文章路由转发
public function _empty()
{
  var_dump(debug_backtrace());

访问主页,可以知道是 Kernel.php 调用的

array(4) {
  [0]=>
  array(7) {
    ["file"]=>
    string(108) "D:\environment\phpstudy_pro\WWW\PbootCMS-V3.0.4\core\basic\Kernel.php(10) : eval()'d code(1) : eval()'d code"
    ["line"]=>
    int(2)

通过对 search 或 keyword 进行 GET请求 都可以调用 SearchController类 的 index方法

// 空拦截器, 实现文章路由转发
public function _empty()
{  ...
  // 路由
  switch ($param[0]) {
    case 'search':
    case 'keyword':
      $search = new SearchController();
      $search->index();
      break;

/apps/home/controller/SearchController.php

调用了 ParserController类 的 parserSearchLabel方法

class SearchController extends Controller
{
  ...
  public function __construct()
  {
    $this->parser = new ParserController();
    ...
  }
  ...
  public function index()
  {
    ...
    $content = $this->parser->parserSearchLabel($content); // 搜索结果标签

ParserController类

/apps/home/controller/ParserController.php

class ParserController extends Controller
{
  ...
  public function __construct()
  {
    $this->model = new ParserModel();
  }
  ...
  // 解析内容搜索结果标签
  public function parserSearchLabel($content)
  {
    ...
    // 数据接收
    if ($_POST) {
      $receive = $_POST;
    } else {
      $receive = $_GET;
    }
 
    foreach ($receive as $key => $value) {
      if (! ! $value = request($key, 'vars')) {
        ...
        $where3[$key] = $value;
        ...
      }
    }
 
    // 去除特殊键值
    unset($where3['keyword']);
    ...
    $data = $this->model->getLists($scode, $num, $order, $where1, $where2, $where3, $fuzzy, $start, $lfield, $lg);

页面中的搜索框是对 keyword 进行 GET请求 的,但是如果用 keyword 请求,变量会被销毁

所以要自己进行 POST请求(1=select 1),请求会被 request函数 处理后赋值给 $where3,然后处理 SQL语句

/core/function/helper.php

request函数

function request($name, $type = null, $require = false, $vartext = null, $default = null)
{
  if (isset($_POST[$name])) {
    $d_source = 'post';
  } else {
    $d_source = 'get';
  }
  $condition = array(
    'd_source' => $d_source,
    'd_type' => $type,
    'd_require' => $require,
    $name => $vartext,
    'd_default' => $default
 
  );
  return filter($name, $condition);
}

设置了一个数组,然后通过 filter函数 进行过滤

array(5) {
  ["d_source"]=>
  string(4) "post"
  ["d_type"]=>
  string(4) "vars"
  ["d_require"]=>
  bool(false)
  [1]=>
  NULL
  ["d_default"]=>
  NULL
}

filter函数

function filter($varname, $condition)
{
  ...
  $vartext = $varname;
  ...
  // 数据源
  if (array_key_exists('d_source', $condition)) {
    switch ($condition['d_source']) {
      case 'post':
        $data = @$_POST[$varname];
        break;
  ...
  // 数据类型检测
  if (array_key_exists('d_type', $condition)) {
    switch ($condition['d_type']) {
      ...
      case 'vars':
        if (! preg_match('/^[\x{4e00}-\x{9fa5}\w\-\.,\s]+$/u', $data)) {
          $err = '只能包含中文、字母、数字、横线、点、逗号、空格!';
        }
        break;
  ...
  // 返回收据
  return escape_string($data);
}

就是,并且data 只能包含中文、字母、数字、横线、点、逗号、空格,然后通过 escape_string函数 进行过滤

/core/function/handle.php

escape_string函数

Copy

// 获取转义数据,支持字符串、数组、对象
function escape_string($string)
{
  ...
  $string = htmlspecialchars(trim($string), ENT_QUOTES, 'UTF-8');
  $string = addslashes($string);
  ...
  return $string;
}

对 select 1 用 htmlspecialchars函数 和 addslashes函数 进行了转义

ParserModel类

/apps/home/model/ParserModel.php

getLists方法

数据过滤完之后通过 ParserModel类 的 getLists方法 处理 SQL语句

// 列表内容,带分页,不区分语言,兼容跨语言
public function getLists($scode, $num, $order, $filter = array(), $tags = array(), $select = array(), $fuzzy = true, $start = 1, $lfield = null, $lg = null)
{
  ...
  return parent::table('ay_content a')->field($fields)
    ...
    ->where($select, 'AND', 'AND', $fuzzy)
    ...;
}

就在select数组 中,通过 where方法 进行了 SQL语句 拼接操作

Model类

/core/basic/Model.php

where方法

在 return 上面添加,看看最终的 SQL语句 是什么:

final public function where($where, $inConnect = 'AND', $outConnect = 'AND', $fuzzy = false)
{
  ...
  var_dump($this->sql['where']);
  return $this;
}

看到注入的 SQL语句 拼接到了最后

string(143) "WHERE(a.scode in ('5','6','7') OR a.subscode='5') AND(a.status=1 AND d.type=2 AND a.date<'2023-05-05 14:09:11' AND a.acode='cn' ) AND(select 1)"

本文为免杀三期学员笔记:https://www.cnblogs.com/Night-Tac/articles/17372836.html文章来源地址https://www.toymoban.com/news/detail-683316.html

到了这里,关于PbootCMS 3.0.4 SQL注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络安全】SQL注入--宽字节注入

    宽字节注入,在 SQL 进行防注入的时候,一般会开启 gpc,过滤特殊字符。 一般情况下开启 gpc 是可以防御很多字符串型的注入,但是如果数据库编码不 对,也可以导致 SQL 防注入绕过,达到注入的目的。如果数据库设置宽字节字 符集 gbk 会导致宽字节注入,从而逃逸 gpc 前提

    2023年04月13日
    浏览(47)
  • 【网络安全】SQL注入详解

    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。 1:寻找到SQL注入的位置 2:判断服务器类型和后台数据库类型 3:针对不同的服务器和数据库特点进行SQL注入攻击

    2024年02月06日
    浏览(45)
  • 网络安全---SQL注入攻击

            SQL 注入是一种代码注入技术,可利用 Web 应用程序和数据库服务器之间接口中的漏洞。当用户的输入在发送到后端数据库服务器之前未在 Web 应用程序中正确检查时,该漏洞就存在。         许多 Web 应用程序从用户处获取输入,然后使用这些输入构建 SQL 查询

    2024年04月12日
    浏览(38)
  • 网络安全必学SQL注入

    SQL注入漏洞可以说是在企业运营中会遇到的最具破坏性的漏洞之一,它也是目前被利用得最多的漏洞。要学会如何防御SQL注入,首先我们要学习它的原理。 针对SQL注入的攻击行为可描述为通过在用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻

    2024年02月03日
    浏览(49)
  • 【网络安全】初探SQL注入漏洞

    要想玩SQL注入,一个简单的数据交互页面是需要的,故我们用PHP做一个简易网页,有登录、注册和首页三块内容。 登录需要输入账号密码,等待提交后进入系统; 注册需要输入名字,密码,手机号,照片,等待提交后进入系统; 首页需要利用PHP和数据库联动后的查询语句,

    2024年02月16日
    浏览(32)
  • 「网络安全」SQL注入攻击的真相

    点击此处即可获得282G网络安全学习资料 我们生活在数据的黄金时代。有些公司将其分析为更好的自己,有些公司为了获利而进行交易,没有一家公司因其价值而自由放弃 - 对于他们的业务和犯罪分子。 SQL(结构化查询语言)是一种非常流行的与数据库通信的方式。虽然许多

    2024年02月07日
    浏览(38)
  • 网络安全-初学SQL注入&基本概念

    SQL语句:解释SQL(Structured Query Language)是一种用于与关系型数据库进行交互的语言。SQL语句用于执行各种数据库操作,例如插入、更新、删除和查询数据。 用户输入与SQL查询的拼接:说明应用程序通常会接受用户的输入,并将其用作构建SQL查询语句的一部分。这种拼接用户

    2024年02月13日
    浏览(29)
  • 【网络安全】SQL注入漏洞的修复建议

    SQL注入是Web应用程序常见的安全漏洞之一,攻击者通过恶意构造的SQL查询语句,成功在应用程序的数据库中执行任意操作,导致数据泄露、篡改或其他安全问题。 本篇技术博客将详细介绍SQL注入漏洞的修复建议,包括过滤危险字符和使用预编译语句,通过具体的代码案例帮助

    2024年02月06日
    浏览(40)
  • 网络安全之SQL注入及防御(下篇)

    目录 什么是SQL注入? 一,SQL注入会导致什么呢? 二,SQL注入思想与步骤 三,SQL注入的绕过 四,sqlmap工具的使用  五,sql注入的防御方法 总结 什么是SQL注入? SQL注入(SQL Injection)是一种常见的网络攻击手段,是因为应用程序对用户输入的数据验证不到位造成的。攻击者在

    2024年04月28日
    浏览(30)
  • 网络安全B模块(笔记详解)- SQL注入

    1.使用渗透机场景kali中工具扫描服务器场景,将apache的端口号和版本号作为Flag提交(格式:端口号_版本号)  Flag:8081_7.5 2.使用渗透机场景windows7访问服务器场景SQL网站,并将网站中概述页面中的Flag提交; Flag:sql_is_good 3.使用渗透机场景windows7访问服务器中的SQL网站中的数

    2024年01月20日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包