代码审计sql注入部分函数绕过方法

目录

1.宽字节注入

2.预编译模式下的sql注入

3无法预编译的

1.3.1. like关键字

1.3.2.不能加单引号

4.相关实战实战

4.1.某个业务网站具有sql注入

4.2.梦想cms代码审计

5.相关参考资料

 

1.宽字节注入

<?php
$db=init_db();
$db->query("set SET NAMES'gbk'); //设置gbk字符集
$username = addslashes($_GET['username']); //input: admin' and 1=1#
$db->query("select* from table where username = '$username' ")
?>

这里我们可以看到在对代码层面做操作,首先有个函数addslashes,他是一种在PHP中存在的字符串处理函数,它的作用是在指定的字符前添加反斜线。这些特定的字符包括单引号(')、双引号(")、反斜线(\)以及NULL。通常用于准备一个字符串用于将数据插入到数据库中,特别是在使用旧版本的PHP或没有预处理语句时,防止SQL注入攻击。

我们输入admin' and 1=1#时,会被系统解析为select* from table where username ='admin\' and 1=1#,单引号被\拦截

但是我输入一个admin%bf' and 1=1#时,就可以绕过。执行的sql语句就为

select* from table where username ='admin縗' and 1=1#

 我们输入的%bf系统为了影响单引号闭合的“\”也就是0x5c结合,就构成了一个新的汉字“

0x5c=\

0x27='

0xbf27=¿'

0xbf5c=縗

GBK编码的汉字会占据两个字节(bf是第一个而5c是第二个),当使用GBK编码遇到两个字节都符合其取值范围时,就会将其解析成为一个汉字,第一个字节取值范围为129-254,第二个字节范围为64-254

2.预编译模式下的sql注入

<?php
$username = $GET['username'];  // 从GET请求中取出名为'username'的参数,将其值赋给变量$username
$db="mysql:host=127.0.0.1;dbname=test;charset=gbk";  // 定义了数据库连接的DSN(数据源名称),包括主机、数据库名和字符集
$dbname ="root";  // 数据库用户名
$passwd ="root";  // 数据库密码
$conn =new PDO($db, $dbname, $passwd);  // 使用PDO对象(PHP数据对象)创建一个新的数据库连接
$conn->query('SET NAMES GBK');  // 设置客户端字符编码为GBK
$stmt = $conn->prepare("select * from table where username= :username");  // 准备一条SQL查询语句,使用命名参数":username"
$stmt->bindParam(":username", $username);  // 将$username变量绑定到命名参数":username"
$stmt->execute();  // 执行该SQL查询
?>

在这里,看似可能是安全的,但是还是无法解决问题,因为在第8行的

$stmt = $conn->prepare("select * from table where username= :username");

实际上是这样子的

==>$stmt->sql ="select * from table where username='${addslashes($input)}'"

接下来的流程就和我们上述的宽字节过程一样了,

输入:admin%bf' and 1=1#
执行的sql语句就为:select* from table where username ='admin縗' and 1=1#

3无法预编译的

1.3.1. like关键字

我们知道sql语句的模糊查找里面用的关键字like,而like关键字默认是不会预编译的(如果使用Mybats则是预编译报错)。数据库方给出的原因是like预编译会造成慢查询和DOS

<?php
$username = $_GET['username'];
$db = "mysql:host=127.0.0.;dbname=test;";
$dbname ="root";
$passwd ="root";
$conn = new PDO($dbs, $dbname, $passwd);
$conn->query('SET NAMES GBK');
$stmt = $conn->prepare("select *from table where username like'%:username%'"); //不生效 这不会工作,因为带有占位符的LIKE模式不能这样使用
$stmt = $conn->prepare("select * from table where username like concat('%',:username,'%'");//生效 这则会正常工作,因为正确地通过concat拼接了模糊匹配的通配符
$stmt->bindParam(":username",$username):
$stmt->execute();
?>

很多开发人员会遗漏手动添加这个点,因而预编译未生效。

java的开发人员开发时,Mybatis编译报错,然后他们自己去添加过滤(过滤没写好)或者不过滤(使用原生语句),导致GG.与之类似的还有IN关键字,该位置也默认不能预编译,需要在预编译语法中去for循环,有些程序员为了方便,可能也会在这边偷工减料。

1.3.2.不能加单引号

我们分析一下上述一段代码

$newInput = addslashes($input)//内容转义
sql = select * from table where column = '$newInput'//强制用单引号包裹

该代码强制了改sql语句进行单引号进行闭合,

我们有下列sql语句

select $username$,password from $tables where $username2$ = '$dada$' order by $username3$ $desc$ limit $0$,l

上述红色字体都是不能接单引号的,总结就是

表名、列名、limit子句、order by(desc/asc)

很多开发可能会忽略这一点,导致存在漏洞

4.相关实战实战

4.1.某个业务网站具有sql注入

可以看到,并没有对$ip传入的值进行过滤的操作。

如下应该是定位该函数,看谁定义的这个函数,全局搜索是观察引用的函数。

realIP来源:

Server用法(获取IP):

这里我们填入以下payload

ip' union select 1,2,3,4,5# 

证明有注入点就行,这里不过多展示。

4.2.梦想cms代码审计

首先来到相关页面,观察到有几个参数。

在相关提示中提示在BookAction.class.php中存在注入漏洞。

打开查看

前台存在sql注入:

跟踪filter:

这里过滤了太多东西,大小写还有正则,但是我们回到第一张图片,可以看到一个函数:urldecode(),对url解码

回到第一张图片,进入getNameDate函数:

跟踪oneModel

注入语句:

' and updatexml(0,concat(0x7e,user()),1)#

编码一次:

%61%6e%64%20%75%70%64%61%74%65%78%6d%6c%28%30%2c%63%6f%6e%a63%61%74%28%30%78%37%65%2c%75%73%65%72%28%29%29%2c%31%29

编码两次:

%25%32%37%25%32%30%25%36%31%25%36%65%25%36%34%25%32%30%25%37%35%25%37%30%25%36%34%25%36%31%25%37%34%25%36%35%25%37%38%25%36%64%25%36%63%25%32%38%25%33%30%25%32%63%25%36%33%25%36%66%25%36%65%25%36%33%25%36%31%25%37%34%25%32%38%25%33%30%25%37%38%25%33%37%25%36%35%25%32%63%25%37%35%25%37%33%25%36%35%25%37%32%25%32%38%25%32%39%25%32%39%25%32%63%25%33%31%25%32%39%25%32%33

 两次url编码,利用成功

5.相关参考资料

奇安信攻防社区-SQL注入&预编译

https://codeantenna.com/a/WzaLCig9qw

https://codeantenna.com/a/WzaLCig9qw

奇安信攻防社区-梦想cms漏洞合集

奇安信攻防社区-梦想cms二次注入漏洞分析

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机基带电路设计20问(1)

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 大家好&#xff0c;我是工程师看海&#xff0c;原创文章欢迎点赞分享&#xff01; 1 小电压和小电流供电是不是可以减小大部分功耗&#xff1…

【电路笔记】-逻辑与非门

逻辑与非门 文章目录 逻辑与非门1、概述2、晶体管与非门3、数字逻辑与非门4、通用与非门逻辑与非门是数字逻辑与门和非门串联的组合。 1、概述 NAND(非与)门的输出通常处于逻辑电平“1”,并且仅当其所有输入都处于逻辑电平“1”时才变为“低”至逻辑电平“0”。 逻辑与非门…

入门Arduino与Esp8266:一步步教你点亮LED灯

文章目录 一、前言二、下载与安装Arduino1. 通过输入网址&#xff1a;Arduino.cc进行下载2. 点击上面的SOFTWARE软件选项3. 选择右边的Windows版本进行下载4. Just Download 立即下载4. 正在下载&#xff0c;请稍等5. 下载完成6. 双击开始安装&#xff0c;单击我同意许可证协议…

二分查找 -- 力扣(LeetCode)第704题

题目 https://leetcode.cn/problems/binary-search/description/ 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例…

Ubuntu 20.04.06 PCL C++学习记录(十六)

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16 学习内容 用一组点云数据做简单的平面的分割 源代码及所用函数 源代码 #include<iostr…

IDEA中修改git的作者、邮箱名称

目录 一、查看当前git信息 1、查看git作者名称 如下图&#xff1a; 2、查看git邮箱信息 二、修改git信息 1、修改git作者名称 如下图&#xff1a; 2、修改git邮箱名称 一、查看当前git信息 1、查看git作者名称 在git控制台 或者 Terminal 输入 git config user.name …

如何高效学习Python编程语言

理解Python的应用场景 不同的编程语言有不同的发展历史和应用场景,了解Python主要应用在哪些领域对于学习它会有很大帮助。Python最初是一种通用脚本语言,主要用于系统级任务自动化。随着时间的推移,它逐步成为数据处理、科学计算、Web开发、自动化运维等众多领域的主要编程语…

【多线程】多线程下使用集合类

一.Java中线程安全的集合类 Java中提供了多种线程安全的集合类&#xff0c;它们可以在多线程环境下安全地被多个线程同时访问而无需外部同步。以下是一些常见的线程安全集合类&#xff1a; Vector: 类似于 ArrayList 的动态数组&#xff0c;但是所有方法都是同步的&#xff0…

lottery-攻防世界

题目 flag在这里要用钱买&#xff0c;这是个赌博网站。注册个账号&#xff0c;然后输入七位数字&#xff0c;中奖会得到相应奖励。 githacker获取网站源码 &#xff0c;但是找到了flag文件但是没用。 bp 抓包发现api.php&#xff0c;并且出现我们的输入数字。 根据题目给的附…

跨越网络边界:借助C++编写的下载器程序,轻松获取Amazon商品信息

背景介绍 在数字化时代&#xff0c;数据是新的石油。企业和开发者都在寻找高效的方法来收集和分析网络上的信息。亚马逊&#xff0c;作为全球最大的电子商务平台之一&#xff0c;拥有丰富的商品信息&#xff0c;这对于市场分析和竞争情报来说是一个宝贵的资源。 问题陈述 然…

Vue - 你知道Vue中computed和watch的区别吗

难度级别:中高级及以上 提问概率:70% 二者都是用来监听数据变化的,而且在日常工作中大部分时候都只是局限于简单实用,所以到了面试中很难全面说出二者的区别。接下来我们看一下,二者究竟有哪些区别呢? 先说computed,它的主要用途是监听…

vs2017离线安装(配合QT5.9.2使用)

以vs2017_Professional版本为例&#xff1a; 一、下载安装包vs2017_Professional.exe&#xff08;在线安装包即可&#xff09; 二、创建在目录&#xff1a;C:\vs2017_Professional_Package&#xff0c;把vs2017_Professional.exe放在该目录下。 ID&#xff1a; Microsoft.Vis…