南宁市第二届网络与信息安全技术竞赛——web200

这道题一开始只给了一个页面,提示u have to echo to the server。
这里写图片描述
仔细想了想,感觉可能是想让我们传参数把,有过经验的大佬不要嘲笑,也许你们一眼可以看出来使node.js的漏洞,但是毕竟我还是小白。
自然用小白的分析思路啦,首先用burp查看了中间是否有隐藏信息,或者是否发生了重定向,对包的头部信息仔细看了一下发现了几个不常见属性,比如发送包里
这里写图片描述

If-None-Match,它和ETags(HTTP协议规格说明定义ETag为“被请求变量的实体值”,或者是一个可以与Web资源关联的记号)常用来判断当前请求资源是否改变。类似于Last-Modified和HTTP-IF-MODIFIED-SINCE。但是有所不同的是Last-Modified和HTTP-IF-MODIFIED-SINCE只判断资源的最后修改时间,而ETags和If-None-Match可以是资源任何的任何属性,不如资源的MD5等。

ETags和If-None-Match的工作原理是在HTTP Response中添加ETags信息。当客户端再次请求该资源时,将在HTTP Request中加入If-None-Match信息(ETags的值)。如果服务器验证资源的ETags没有改变(该资源没有改变),将返回一个304状态;否则,服务器将返回200状态,并返回该资源和新的ETags。

ETag如何帮助提升性能?
聪明的服务器开发者会把ETags和GET请求的“If-None-Match”头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生ETag,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。

其过程如下:
1.客户端请求一个页面(A)。
2.服务器返回页面A,并在给A加上一个ETag。
3.客户端展现该页面,并将页面连同ETag一起缓存。
4.客户再次请求页面A,并将上次请求时服务器返回的ETag一起传递给服务器。
5.服务器检查该ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304(未修改——Not Modified)和一个空的响应体。

当然,这并不是这道题的内容,只是我当时遇到了不熟悉才查了下资料学习一波,记录一下而已。

后来发现了发送包里的 x-powered-by 里有express然后搜索了一波,发现这是node.js里的一个框架。于是自然就查了一下是否有对应的漏洞可以利用,顺便学习一波,提高自己
原文地址
http://www.websecgeeks.com/2017/04/pentesting-nodejs-application-nodejs.html
i春秋上有对应的版本
https://bbs.ichunqiu.com/thread-24807-1-1.html?from=beef

这里的Eval()函数很危险 存在远程代码执行(利用服务器端JavaScript注入)【JavaScript任意代码执行】
eval()是一个危险的函数,任何输入都可以通过它执行,形成一种远程命令执行场景,程序可以越权执行。它从输入参数中

竞赛题目#include <cstdio> #include <cstring> #include <ctype.h> #include <cstdlib> #include <cmath> #include <climits> #include <ctime> #include <iostream> #include <algorithm> #include <deque> #include <vector> #include <queue> #include <string> #include <map> #include <stack> #include <set> #include <numeric> #include <sstream> #include <iomanip> #include <limits> #define CLR(a) memset(a, 0, sizeof(a)) using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair <int, int> pii; typedef pair <ll, ll> pll; typedef pair<string, int> psi; typedef pair<string, string> pss; const double PI = 3.14159265358979323846264338327; const double E = exp(1); const double eps = 1e-6; const int INF = 0x3f3f3f3f; const int maxn = 1e6 + 5; const int MOD = 1e9 + 7; int main() { int n; cin >> n; vector <int> v; int num; for (int i = 0; i < n; i++) { scanf("%d", &num;); v.push_back(num); } cin >> n; for (int i = 0; i < n; i++) { scanf("%d", &num;); v.erase(v.begin() + num - 1); } vector <int>::iterator it; for (it = v.begin(); it != v.end(); it++) { if (it != v.begin()) printf(" "); cout << *it; } cout << endl; } --------------------- 作者:Dup4 来源:CSDN 原文:https://blog.csdn.net/dup4plz/article/details/79666083 版权声明:本文为博主原创文章,转载请附上博文链接!#include <cstdio> #include <cstring> #include <ctype.h> #include <cstdlib> #include <cmath> #include <climits> #include <ctime> #include <iostream> #include <algorithm> #include <deque> #include <vector> #include <queue> #include <string> #include <map> #include <stack> #include <set> #include <numeric> #include <sstream> #include <iomanip> #include <limits> #define CLR(a) memset(a, 0, sizeof(a)) using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair <int, int> pii; typedef pair <ll, ll> pll; typedef pair<string, int> psi; typedef pair<string, string> pss; const double PI = 3.14159265358979323846264338327; const double E = exp(1); const double eps = 1e-6; const int INF = 0x3f3f3f3f; const int maxn = 1e6 + 5; const int MOD = 1e9 + 7; int main() { int n; cin >> n; vector <int> v; int num; for (int i = 0; i < n; i++) { scanf("%d", &num;); v.push_back(num); } cin >> n; for (int i = 0; i < n; i++) { scanf("%d", &num;); v.erase(v.begin() + num - 1); } vector <int>::iterator it; for (it = v.begin(); it != v.end(); it++) { if (it != v.begin()) printf(" "); cout << *it; } cout << endl; } --------------------- 作者:Dup4 来源:CSDN 原文:https://blog.csdn.net/dup4plz/article/details/79666083 版权声明:本文为博主原创文章,转载请附上博文链接!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值