SQL注入攻击 - update注入

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客

一、MySQL UPDATE语句复习:

  • UPDATE语句用于修改表中的数据,基本形式为:UPDATE 表名称 SET 列名称=新值 WHERE 更新条件;
  • 语法结构示例:UPDATE 【表名】SET 字段1=新值1, 字段2=新值2 [WHERE 条件];

Update语句练习:

要修改security数据库中users表的admin字段的值为000000,可以使用以下UPDATE语句:

UPDATE users SET admin='000000' WHERE <更新条件>;

请确保将<更新条件>替换为适合您情况的实际条件,以确保只有符合条件的行会被更新。如果要更新整个表中的所有行,可以省略WHERE子句

二、update 注入代码分析

靶场的17关(Less-17)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-17 Update Query- Error based - String</title>
</head>

<body bgcolor="#000000">

<div style=" margin-top:20px;color:#FFF; font-size:24px; text-align:center"><font color="#FFFF00"> [PASSWORD RESET] </br></font>&nbsp;&nbsp;<font color="#FF0000"> Dhakkan </font><br></div>

<div  align="center" style="margin:20px 0px 0px 520px;border:20px; background-color:#0CF; text-align:center; width:400px; height:150px;">

<div style="padding-top:10px; font-size:15px;">
 

<!--Form to post the contents -->
<form action="" name="form1" method="post">

  <div style="margin-top:15px; height:30px;">User Name &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;
    <input type="text"  name="uname" value=""/>  </div>
  
  <div> New Password : &nbsp; &nbsp;
    <input type="text" name="passwd" value=""/></div></br>
    <div style=" margin-top:9px;margin-left:90px;"><input type="submit" name="submit" value="Submit" /></div>
</form>
</div>
</div>
<div style=" margin-top:10px;color:#FFF; font-size:23px; text-align:center">
<font size="6" color="#FFFF00">



<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);

function check_input($value)
	{
	if(!empty($value))
		{
		// truncation (see comments)
		$value = substr($value,0,15);
		}

		// Stripslashes if magic quotes enabled
		if (get_magic_quotes_gpc())
			{
			$value = stripslashes($value);
			}

		// Quote if not a number
		if (!ctype_digit($value))
			{
			$value = "'" . mysql_real_escape_string($value) . "'";
			}
		
	else
		{
		$value = intval($value);
		}
	return $value;
	}

// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))

{
//making sure uname is not injectable
$uname=check_input($_POST['uname']);  

$passwd=$_POST['passwd'];


//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname."\n");
fwrite($fp,'New Password:'.$passwd."\n");
fclose($fp);


// connectivity 
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";

$result=mysql_query($sql);
$row = mysql_fetch_array($result);
//echo $row;
	if($row)
	{
  		//echo '<font color= "#0000ff">';	
		$row1 = $row['username'];  	
		//echo 'Your Login name:'. $row1;
		$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
		mysql_query($update);
  		echo "<br>";
	
	
	
		if (mysql_error())
		{
			echo '<font color= "#FFFF00" font size = 3 >';
			print_r(mysql_error());
			echo "</br></br>";
			echo "</font>";
		}
		else
		{
			echo '<font color= "#FFFF00" font size = 3 >';
			//echo " You password has been successfully updated " ;		
			echo "<br>";
			echo "</font>";
		}
	
		echo '<img src="../images/flag1.jpg"   />';	
		//echo 'Your Password:' .$row['password'];
  		echo "</font>";
	


  	}
	else  
	{
		echo '<font size="4.5" color="#FFFF00">';
		//echo "Bug off you Silly Dumb hacker";
		echo "</br>";
		echo '<img src="../images/slap1.jpg"   />';
	
		echo "</font>";  
	}
}

?>


</font>
</div>
</body>
</html>

这段源代码存在SQL注入问题,特别是在处理UPDATE查询时。让我们逐步分析代码中的关键部分,以了解为什么会存在这个安全漏洞。

1. 用户输入处理

$uname=check_input($_POST['uname']);

这行代码调用了check_input函数来处理用户输入的用户名(uname)。check_input函数的目的是清理输入数据,以防止SQL注入攻击。它对输入值执行以下操作:

  • 如果输入非空,截断到前15个字符。
  • 如果启用了魔术引号(magic quotes),则去除转义的斜杠。
  • 如果值不是数字,将其用单引号包围,并通过mysql_real_escape_string进行转义,以避免SQL注入攻击。
  • 如果值是数字,通过intval转换为整数。

2. SQL查询构建

$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";

这行代码构建了一个SQL查询,用于查找与输入的用户名匹配的用户。由于uname已经通过check_input函数进行了处理,理论上应该是安全的。然而,问题出现在后面的更新密码部分。

3. 密码更新操作

$update="UPDATE users SET password = '$passwd' WHERE username='$row1'"; mysql_query($update);

这里构建了一个UPDATE SQL查询,用于更新用户密码。但是,请注意,新密码($passwd)没有经过任何清理或转义处理,直接插入到SQL查询中。这意味着如果$passwd包含SQL语句的一部分,例如单引号('),它可以终止密码字符串,并允许攻击者注入额外的SQL命令。

例如,假设攻击者在“New Password”字段中输入以下内容:

', email = 'attacker@example.com

这将导致$update变量包含如下SQL语句:

UPDATE users SET password = '', email = 'attacker@example.com' WHERE username='victim'

这就修改了目标用户的电子邮件地址,展示了如何通过未经处理的用户输入来操纵SQL查询,这是典型的SQL注入攻击。

解决方案

为了防止SQL注入,所有用户提供的数据都必须适当地清理和转义,特别是在构建SQL查询时。可以使用参数化查询(预处理语句)来安全地处理用户输入。此外,应避免使用mysql_*函数,因为它们已经被弃用并在PHP 7.0中被移除。改用mysqliPDO可以提供更好的安全性和功能。

三、手动注入演示

在密码的输入框输入

1' and extractvalue(1,concat(0x7e,database(),0x7e))#

注入语句解释:

基于原始的SQL更新语句:

$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";

如果攻击者在密码($passwd)字段中插入了注入代码:

1' and extractvalue(1,concat(0x7e,database(),0x7e))#

这段注入代码的目的是尝试通过引发一个错误来泄露当前数据库的名称。下面是如何将这段代码插入到原始语句中,并解释其工作原理:

插入注入代码

假设攻击者控制的$passwd变量的值被设置为注入代码,那么当这个值被插入到原始的SQL语句中时,最终执行的SQL语句将变为:

UPDATE users SET password = '1' and extractvalue(1,concat(0x7e,database(),0x7e))#' WHERE username='$row1';

这里,注入的代码试图通过以下方式操作:

  1. 1':首先,数字1后跟一个单引号'用来结束原始的password值字符串,使得接下来的部分被视为SQL代码而不是字符串值。

  2. and:逻辑运算符and用于确保只有当前面的条件(这里是1)为真时,后面的extractvalue函数才会被执行。在这种情况下,1总是为真,因此可以确保执行注入的代码。

  3. extractvalue(1,concat(0x7e,database(),0x7e)):这是关键部分,extractvalue是一个XML函数,用于从XML文档中提取信息。这里,它被滥用来生成一个错误消息,因为第一个参数1并不是有效的XML文档。concat(0x7e,database(),0x7e)函数调用将数据库名与~字符连接起来,database()函数返回当前数据库的名称。目的是让错误消息中包含数据库名称,从而泄露这一信息。

  4. #:井号#开始了注释,意味着这个符号之后的所有内容(原始语句的剩余部分)都会被MySQL忽略。这样可以防止语法错误和原始SQL语句的其他部分干扰注入代码的执行。

通过这种方式,攻击者试图利用extractvalue函数引发的错误消息来间接获取数据库名称。如果数据库配置为向用户显示详细的错误信息,那么这个错误可能会包含由concat(0x7e,database(),0x7e)生成的值,即当前数据库的名称,被~符号包围。

四、sqlmap 进行自动注入演示

SQLMap 工具我使用kali中自带的

使用bp对靶场进行抓包

# 格式:
sqlmap -r 文件名称 -p 参数名 --dbs --batch
 
# 示例:(我的数据包文件是存放在kali的桌面所以这里就是 /home/kali/桌面/test.txt)
sqlmap -r /home/kali/桌面/test.txt -p passwd --dbs --batch
  • -r /home/kali/桌面/test.txt 指定了一个请求文件,这个文件应该包含了一个HTTP请求,可能是从浏览器或者其他抓包工具中导出的。这个请求会被sqlmap用来测试SQL注入。
  • -p passwd 指示sqlmap针对HTTP请求中的passwd参数进行测试。这意味着passwd参数可能存在SQL注入漏洞,需要被检测。
  • --dbs 告诉sqlmap在发现SQL注入漏洞后尝试列出数据库的名称。
  • --batch 表明sqlmap将以批处理模式运行,这意味着它会自动选择默认选项而不会提示用户输入

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

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

相关文章

SpringCloud Ribbon 负载均衡服务调用

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第三篇&#xff0c;即介绍 Ribbon 负载均衡服务调用 二、概述 2.1 Ribbon 是什么 Spring Cloud Ribbon…

云计算 3月8号 (wordpress的搭建)

项目wordpress 实验目的&#xff1a; 熟悉yum和编译安装操作 锻炼关联性思维&#xff0c;便于以后做项目 nginx 编译安装 1、安装源码包 [rootlinux-server ~]# yum -y install gcc make zlib-devel pcre pcre-devel openssl-devel [rootlinux-server ~]# wget http://nginx.…

PCL不同格式点云读取速度(Binary和ASCII )

首先说明一点&#xff1a;Binary(二进制)格式点云文件进行读取时要比Ascll码格式点云读取时要快的多&#xff0c;尤其是对于大型的点云文件&#xff0c;如几百万、甚至几千万个点云的情况下。 今天遇到了一种情况&#xff0c;在写项目的时候进行点云读取&#xff0c;读取的时候…

3.5作业

课程代码复习&#xff1a; 使用select完成TCP并发服务器&#xff1a; #include<myhead.h> #define SER_IP "192.168.244.140" //服务器IP #define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv[]) {//1、创建用于监听的套接…

6. 虚拟机及Linux安装

虚拟机及Linux安装 进行嵌入式项目开发&#xff0c;第一步就是要建立嵌入式开发环境&#xff0c;主要包括安装 Bootloader 工具、不同平台的交叉编译器&#xff08;如ARM 平台的arm-linux-gcc&#xff09;、内核源码树&#xff08;在需要编译和配置内核时&#xff09;、在调试…

docker学习进阶

一、dockerfile解析 官方文档&#xff1a; Dockerfile reference | Docker Docs 1.1、dockfile是什么&#xff1f; dockerfile是用来构建docker镜像的文本文件&#xff0c;由一条条构建镜像所需的指令和参数构成的脚本。 之前我们介绍过通过具体容器反射构建镜像(docker comm…

第11周,第三期技术动态

大家好&#xff0c;才是真的好。 真没想到&#xff0c;本周是今年第十一周&#xff0c;2024年还有不到三百天就结束了。 今天周五&#xff0c;我们继续介绍与Domino相关产品新闻&#xff0c;以及互联网或其他IT行业动态等。 一、在Windows 10和Windows 11上运行Domino和Trav…

错误和异常之标准异常创建异常

标准异常 表 10.2 列出了所有的 Python 当前的标准异常集,所有的异常都是内建的. 所以它们在脚本启动 前或在互交命令行提示符出现时已经是可用的了. 表10.2 Python内建异常 异常名称描述所有异常的基类 python 解释器请求退出 用户中断执行(通常是输入^C) 常规错误的基类

大模型时代下的自动驾驶研发测试工具链-SimCycle

前言&#xff1a; 最近OpenAI公司的新产品Sora的发布&#xff0c;正式掀起了AI在视频创作相关行业的革新浪潮&#xff0c;AI不再仅限于文本、语音和图像&#xff0c;而直接可以完成视频的生成&#xff0c;这是AI发展历程中的又一座重要的里程碑。AI正在不断席卷着过去与我们息…

仿牛客项目Day02:http、调试、日志、git

http状态码 后端调试 f8&#xff1a;逐行执行 f7&#xff1a;进入语句内部 f9&#xff1a;执行到下一个断点 前端调试 f10&#xff1a;逐行调试 f11&#xff1a;进入语句内部 f8&#xff1a;执行到下一个断点 日志 按照级别开启日志 日志的测试类 比如把application里…

基于交叉表生成风控规则(Python)

大家好&#xff0c;我是东哥。 规则是风控策略中最常用的工具之一&#xff0c;生成、筛选、监控、调优&#xff0c;几乎每天都在打交道&#xff0c;本篇来介绍如何基于交叉表来生成风控规则&#xff0c;并且如何基于评估指标进行筛选。 出品人&#xff1a;东哥起飞 专栏&#…

【字符串】【分类讨论】【KMP】1163. 按字典序排在最后的子串

作者推荐 视频算法专题 本文涉及知识点 字符串 字典序 分类讨论 本题无法使用KMP&#xff0c;因为t1不段变化。 LeetCode1163. 按字典序排在最后的子串 给你一个字符串 s &#xff0c;找出它的所有子串并按字典序排列&#xff0c;返回排在最后的那个子串。 示例 1&#xf…

图论入门题题解

✨欢迎来到脑子不好的小菜鸟的文章✨ &#x1f388;创作不易&#xff0c;麻烦点点赞哦&#x1f388; 所属专栏&#xff1a;刷题_脑子不好的小菜鸟的博客-CSDN博客 我的主页&#xff1a;脑子不好的小菜鸟 文章特点&#xff1a;关键点和步骤讲解放在 代码相应位置 拓扑排序 / 家谱…

基于Docker搭建Maven私服仓库(Linux)详细教程

文章目录 1. 下载镜像并启动容器2. 配置Nexus3. 配置本地Maven仓库 1. 下载镜像并启动容器 下载Nexus3镜像 docker pull sonatype/nexus3查看Nexus3镜像是否下载成功 docker images创建Nexus3的挂载文件夹 mkdir /usr/local/nexus-data && chown -R 200 /usr/local…

cadence 之 Allegro PCB封装 3D模型

Allegro PCB封装怎样赋3D模型 1、方式一 —— 设置器件高度 2、方式二 —— 指定STEP模型 2.1、Step 3D模型库 2.2、软件环境的设置和 STEP 模型库路径设置 D:\Cadence\Cadence_SPB_17.4-2019\share\local\pcb\step 2.3、指定STEP模型 即可打开 STEP 模型指定的对话框&…

【HarmonyOS】ArkTS-对象方法

目录 对象方法实例 对象方法 方法作用&#xff1a;描述对象的具体行为 约定方法类型 interface 接口名称 { 方法名: (参数:类型) > 返回值类型 }interface Person{dance: () > voidsing: (song: string) > void}添加方法&#xff08;箭头函数&#xff09; let ym: P…

服务器配置禁止IP直接访问,只允许域名访问

联网信息系统需设置只允许通过域名访问&#xff0c;禁止使用IP地址直接访问&#xff0c;建议同时采用云防护技术隐藏系统真实IP地址且只允许云防护节点IP访问服务器&#xff0c;提升网络安全防护能力。 一、Nginx 修改配置文件nginx.conf&#xff0c;在server段里插入正则表达式…

【C++ 学习】构造函数详解!!!

1. 类的6个默认成员函数的引入 ① 如果一个类中什么成员都没有&#xff0c;简称为空类。 ② 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 ③ 默认成员函数&#xff1a;用户没有显式实现&…

LoadBalancer 客户端的负载均衡器+openFeign 请求转发

LoadBalancer Spring Cloud LoadBalancer是Spring Cloud中负责客户端负载均衡的模块&#xff0c;其主要原理是从nacos中获取服务列表通过选择合适的服务实例来实现负载均衡。 源码跟踪 可以看到这里的intercept()方法&#xff0c;拦截了用户的HttpRequest请求&#xff0c;然…

在IDEA使用HBase Java API连接

一、下载安装Maven并加载到IDEA中 官网地址:Maven – Download Apache Maven 将对应版本的压缩包下载到本地,并新建一个文件夹Localwarehouse&#xff0c;用来保存下载的依赖文件 配置maven的系统环境配置&#xff0c;将maven安装的bin目录地址写入path环境变量&#xff1a; …