apache的..%5c漏洞原因源代码分析

%5C暴库原理 暴库有两个方法,第一个就是利用%5c,另外一个conn.asp暴库。而且这里的暴库是针对access数据库的,而和access搭配的脚本一般是asp,因此出现暴库的一般为asp类型站点。   ASP是动态服务器页面(Active Server Pages)的英文缩写,后来也称为经典ASP,是微软公司开发的代替CGI脚本程序的一种应用,也是微软公司的第一个服务器侧的脚本引擎,能够动态产生Web 阅读详情
下面是源代码 src/main/http_request.c: 的处理请求的代码:


static void process_request_internal(request_rec *r)
{
int access_status;

/* Ignore embedded %2F's in path for proxy requests */
if (r->proxyreq == NOT_PROXY && r->parsed_uri.path) {
/* 如果不是代理 */
access_status = ap_unescape_url(r->parsed_uri.path);
/* 解码%,rfc要求 */
if (access_status) {
ap_d ie(access_status, r);
return;
}
}

ap_getparents(r->uri); /* OK --- shrinking transformations... */
/* 处理/../,出错,没考虑windows下面的/../ */

if ((access_status = location_walk(r))) {
ap_die(access_status, r);
return;
}

if ((access_status = ap_translate_name(r))) {
decl_die(access_status, "translate", r);
return;
}

if (r->proxyreq == NOT_PROXY) {
/*
* We don't want TRACE to run through the normal handler set, we
* handle it specially.
*/
if (r->method_number == M_TRACE) {
if ((access_status = ap_send_http_trace(r)))
ap_die(access_status, r);
else
ap_finalize_request_protocol(r);
return;
}
}

if (r->proto_num > HTTP_VERSION(1,0) && ap_table_get(r->subprocess_env, "downgrade-1.0")) {
r->proto_num = HTTP_VERSION(1,0);
}

/*
* NB: directory_walk() clears the per_dir_config, so we don't inherit
* from location_walk() above
*/

if ((access_status = directory_walk(r))) {
ap_die(access_status, r);
return;
}

if ((access_status = file_walk(r))) {
ap_die(access_status, r);
return;
}

if ((access_status = location_walk(r))) {
ap_die(access_status, r);
return;
}

if ((access_status = ap_header_parse(r))) {
ap_die(access_status, r);
return;
}

switch (ap_satisfies(r)) {
case SATISFY_ALL:
case SATISFY_NOSPEC:
if ((access_status = ap_check_access(r)) != 0) {
decl_die(access_status, "check access", r);
return;
}
if (ap_some_auth_required(r)) {
if (((access_status = ap_check_user_id(r)) != 0)    !ap_auth_type(r)) {
decl_die(access_status, ap_auth_type(r)
? "check user. No user file?"
: "perform authentication. AuthType not set!", r);
return;
}
if (((access_status = ap_check_auth(r)) != 0)    !ap_auth_type(r)) {
decl_die(access_status, ap_auth_type(r)
? "check access. No grou ps file?"
: "perform authentication. AuthType not set!", r);
return;
}
}
break;
case SATISFY_ANY:
if (((access_status = ap_check_access(r)) != 0)    !ap_auth_type(r)) {
if (!ap_some_auth_required(r)) {
decl_die(access_status ? access_status :
HTTP_INTERNAL_SERVER_ERROR,
ap_auth_type(r) ? "check access"
: "perform authentication. AuthType not set!", r);
return;
}
if (((access_status = ap_check_user_id(r)) != 0)    !ap_auth_type(r)) {
decl_die(access_status, ap_auth_type(r)
? "check user. No user file?"
: "perform authentication. AuthType not set!", r);
return;
}
if (((access_status = ap_check_auth(r)) != 0)    !ap_auth_type(r)) {
decl_die(access_status, ap_auth_type(r)
? "check access. No groups file?"
: "perform authentication. AuthType not set!", r);
return;
}
}
break;
}

if (! (r->proxyreq != NOT_PROXY
&& r->parsed_uri.scheme != NULL
&& strcmp(r->parsed_uri.scheme, "http") == 0) ) {
if ((access_status = ap_find_types(r)) != 0) {
decl_die(access_status, "find types", r);
return;
}
}

if ((access_status = ap_run_fixups(r)) != 0) {
ap_die(access_status, r);
return;
}

if ((access_status = ap_invoke_handler(r)) != 0) {
ap_die(access_status, r);
return;
}

/* Take care of little things that need to happen when we're done */
ap_finalize_request_protocol(r);
}


下面是源代码 src/main/util.c 处理/../的代码:


API_EXPORT(void) ap_getparents(char *name)
{
int l, w;

/* Four paseses, as per RFC 1808 */
/* a) remove ./ path segments */

for (l = 0, w = 0; name[l] != '/0';) {
if (name[l] == '.' && name[l + 1] == '/' && (l == 0    name[l - 1] == '/'))
l += 2;
else
name[w++] = name[l++];
}

/* b) remove trailing . path, segment */
if (w == 1 && name[0] == '.')
w--;
else if (w > 1 && name[w - 1] == '.' && name[w - 2] == '/')
w--;
name[w] = '/0';

/* c) remove all xx/../ segments. (including leading ../ and /../) */
l = 0;

while (name[l] != '/0') {
if (name[l] == '.' && name[l + 1] == '.' && name[l + 2] == '/' &&
(l == 0    name[l - 1] == '/')) {
register int m = l + 3, n;

l = l - 2;
if (l >= 0) {
while (l >= 0 && name[l] != '/')
l--;
l++;
}
else
l = 0;
n = l;
while ((name[n] = name[m]))
(++n, ++m);
}
else
++l;
}

/* d) remove trailing xx/.. segment. */
if (l == 2 && name[0] == '.' && name[1] == '.')
name[0] = '/0';
else if (l > 2 && name[l - 1] == '.' && name[l - 2] == '.' && name[l - 3] == '/') {
l = l - 4;
if (l >= 0) {
while (l >= 0 && name[l] != '/')
l--;
l++;
}
else
l = 0;
name[l] = '/0';
}
}

大家看到了,显然没有考虑windows下面的“/../”,看来编写这个函数的人不熟悉WINDOWS的特性,是个长期在*UNIX下面编程的人员。其实没考虑WINDOWS下面的“/../”已经出过很多问题的了。那为什么直接telnet 用“/../”不行呢?看来在解码之前把所有“/”替换成了“/”。显然这个转换是该在解码之后,估计上面没有检测“/../”的原因就是认为先已经转换了,这个就与IIS的%c1%1c 漏洞一样。照这样就一定得注意如果有什么编码、解码的,一定得重新考虑前面的一些检测,因为弄不好就能重新编码出不符合前面检测的东西来。


看这是源代码 src/main/http_protocol.c 中将URI中的“/”转化成“/”的处理模块:

/* parse_uri: break apart the uri
* Side Effects:
* - sets r->args to rest after '?' (or NULL if no '?')
* - sets r->uri to request uri (without r->args part)
* - sets r->hostname (if not set already) from request (scheme://host:port)
*/
CORE_EXPORT(void) ap_parse_uri(request_rec *r, const char *uri)
{
int status = HTTP_OK;

r->unparsed_uri = ap_pstrdup(r->pool, uri);

if (r->method_number == M_CONNECT) {
status = ap_parse_hostinfo_components(r->pool, uri, &r->parsed_uri);
} else {
/* Simple syntax Errors in URLs are trapped by parse_uri_components(). */
status = ap_parse_uri_components(r->pool, uri, &r->parsed_uri);
}

if (ap_is_HTTP_SUCCESS(status)) {
/* if it has a scheme we may need to do absoluteURI vhost stuff */
if (r->parsed_uri.scheme
&& !strcasecmp(r->parsed_uri.scheme, ap_http_method(r))) {
r->hostname = r->parsed_uri.hostname;
} else if (r->method_number == M_CONNECT) {
r->hostname = r->parsed_uri.hostname;
}
r->args = r->parsed_uri.query;
r->uri = r->parsed_uri.path ? r->parsed_uri.path
: ap_pstrdup(r->pool, "/");
#if defined(OS2)    defined(WIN32)
/* Handle path translations for OS/2 and plug security hole.
* This will prevent "http://www.enet.com.cn/../..//" from
* returning a directory for the root drive.
*/
{
char *x;

for (x = r->uri; (x = strchr(x, '//')) != NULL; )
*x = '/';
/* /转换成/ */

}
#endif /* OS2    WIN32 */
}
else {
r->args = NULL;
r->hostname = NULL;
r->status = status; /* set error status */
r->uri = ap_pstrdup(r->pool, uri);
}
}
利用%5c绕过验证        利用%5c绕过验证---------------------------------------       lake2(http://mrhupo.126.com)       2004-11-27---------------------------------------    说到%5c,你是不是想起了当前流行的那个%5c暴库漏洞,呵呵,本文就是对%5c利用的探索(呵 阅读详情

相关推荐

Apache RocketMQ高危漏洞CVE-2023-37582深度剖析与复现

远程代码执行(RCE)漏洞是网络安全领域常见的严重威胁,其原理在于攻击者能够通过未授权访问或输入验证缺陷,在目标系统上执行任意命令。这类漏洞通常源于对用户输入的处理不当,例如在拼接系统命令时未进行有效过滤或转义,从而形成命令注入。从技术价值看,深入理解RCE漏洞的成因与利用链,对于构建纵深防御体系、提升代码安全审计能力至关重要。在消息队列等分布式中间件的应用场景中,管理接口往往成为薄弱环节。本文聚焦于Apache RocketMQ NameServer组件中一个典型的高危漏洞(CVE-2023-37582)

weixin_30924239的博客 583

%5c暴库原理

%5c暴库原理 作者:sasa 发布于:2012-5-21 20:26 Monday 分类:Web渗透         暴库有两个方法,第一个就是利用%5c,另外一个conn.asp暴库。而且这里的暴库是针对access数据库的,而和access搭配的脚本一般是asp,因此出现暴库的一般为asp类型站点。         %5c暴库         简单点说,就是在打开页面的时候把网页

eldn__的专栏 5556

Apache Commons FileUpload CVE-2023-24998漏洞原理与免费修复实战

在Java Web应用开发中,文件上传是常见的功能需求,而Apache Commons FileUpload组件因其易用性被广泛集成于Struts2、Spring MVC等框架中。其核心原理是通过解析multipart/form-data请求,将数据流分割为独立的表单字段和文件项。然而,组件内部解析逻辑的缺陷可能导致严重的安全风险,例如拒绝服务攻击,攻击者通过构造恶意请求参数,可触发低效的循环算法,大量消耗服务器CPU资源,影响服务可用性。这种漏洞的技术价值在于揭示了依赖库安全维护的重要性,以及如何通过版本

weixin_30399155的博客 376

Apache 关于 mod_rewrite 遇到 "百分号2F"或"百分号5C" (正反斜杠)等特殊符号导致URL重写失效出现404的问题

.htaccess 文件 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule> ...

xiaoxinshuaiga的博客 512

Apache路径穿越漏洞CVE-2021-41773:原理、复现与修复指南

路径穿越(Path Traversal)是一种经典的Web安全漏洞,其核心原理在于应用程序未能对用户输入的路径参数进行充分验证和规范化处理,导致攻击者可以通过构造包含特殊字符序列(如`../`或其URL编码形式)的请求,绕过预期的目录访问限制,从而读取或操作服务器文件系统上的任意文件。这种漏洞的技术价值在于它直接破坏了Web应用最基本的安全边界——文件系统隔离,危害巨大。在常见的应用场景中,攻击者利用路径穿越漏洞可以窃取配置文件、源代码、数据库凭证等敏感信息,甚至可能作为跳板实现权限提升或远程代码执行。本文

weixin_34380948的博客 379

Apache OFBiz远程代码执行漏洞CVE-2024-38856深度剖析与实战复现

远程代码执行漏洞是Web应用安全领域的核心威胁之一,其原理在于攻击者通过构造恶意输入,利用应用程序对用户数据验证不足的缺陷,在服务器端执行任意操作系统命令。这类漏洞的技术价值在于能够直接获取服务器控制权,常被用于数据窃取、系统破坏或作为内网渗透的跳板,常见于Java、PHP等动态语言开发的Web框架中。在Java生态中,Apache OFBiz作为广泛使用的开源ERP/CRM系统,其服务调用机制若存在参数绑定和表达式语言处理缺陷,便可能引发严重的远程代码执行风险。本文以CVE-2024-38856为例,深入

掬水月在手,弄花香满衣 564

Apache路径穿越漏洞CVE-2021-41773:从原理到实战复现

路径遍历(Directory Traversal)是一种经典的Web安全漏洞,攻击者通过构造包含特殊字符序列(如`../`)的请求,绕过服务器的访问控制逻辑,访问或操作Web根目录之外的文件系统资源。其原理在于Web服务器对用户输入的URL路径进行规范化处理时,未能充分验证和过滤相对路径符号,导致安全边界被突破。这类漏洞的技术价值在于揭示了应用层输入验证与系统文件访问控制之间的关键耦合点,常被用于窃取配置文件、源代码、系统密码文件等敏感信息,是渗透测试中信息收集阶段的重要手段。在Apache HTTP Se

weixin_34013044的博客 386

手把手复现Apache解析漏洞CVE-2017-15715:Vulhub与Docker实战指南

文件上传漏洞是Web安全领域的常见威胁,攻击者通过上传恶意文件可获取服务器控制权。其原理在于服务器对用户上传文件的类型、内容及路径验证不严,导致危险文件被存储并执行。在众多漏洞类型中,解析漏洞尤为典型,它利用了Web服务器(如Apache、Nginx)在解析请求时的逻辑缺陷。以Apache HTTP Server的CVE-2017-15715漏洞为例,其核心在于正则表达式匹配时,行尾锚点$会匹配文件名末尾的换行符(\x0A),导致如shell.php\x0A.jpg的文件被误判为PHP脚本执行。这种漏洞常出

weixin_30432579的博客 319

JSP漏洞大观

综述:服务器漏洞是安全问题的起源,黑客对网站的攻击也大多是从查找对方的漏洞开始的。所以只有了解自身的漏洞,网站管理人员才能采取相应的对策,阻止外来的攻击。下面介绍一下一些服务器(包括Web服务器和JSP服务器)的常见漏洞。   Apache泄露重写的任意文件漏洞是怎么回事?   在Apache1.2以及以后的版本中存在一个mod_rewrite模块,它用来指定特殊URLS在网络服务器文件系统上所映

ncnynl的专栏 1560

【网络安全之文件上传漏洞详解】

我自认为文件上传漏洞特点是多且杂,不像SQL注入那样成体系只要一步步往下走就行。以上文章只是对文件上传漏洞重点部分原理做了介绍与复现,此外还有大小写绕过、双写绕过,将php解析为php5等绕过方式前文中并没有提。就是说针对不同的过滤规则有不同的绕过方式,掌握原理后灵活应对即可。针对中间件的解析漏洞除了apache和IIS外还有Nginx。因为需要docker环境,笔者比较懒,并且网上有很多中间件所爆出来的漏洞的详细利用过程,因此对中间件没有过多介绍与复现。

Flipped_Move的博客 1810

CTFshow文件上传漏洞实战:从JS绕过到条件竞争攻防解析

文件上传功能是Web应用中的常见模块,其安全性直接关系到服务器控制权。攻击者通过构造恶意文件,利用服务器解析逻辑缺陷或验证不严,可执行任意代码。其技术原理涉及HTTP协议、文件解析机制及服务器配置,在渗透测试中具有极高利用价值。本文聚焦CTFshow平台151-160关实战,系统拆解了从基础的前端JS验证绕过、服务端黑名单突破,到高级的图片马制作、条件竞争漏洞利用等核心手法。通过剖析MIME类型校验、.htaccess攻击及解析漏洞等典型场景,揭示了文件上传漏洞在真实攻防中的关键地位,为安全从业者提供了从攻

culi4814的博客 1040

Apache OFBiz高危漏洞CVE-2024-45195复现:文件写入到RCE利用链深度解析

在Java Web应用安全领域,文件上传与反序列化是两大经典漏洞类型,其核心原理在于应用对用户输入数据的验证与处理存在缺陷。攻击者通过构造恶意请求,可绕过安全边界,将可控内容写入服务器文件系统,进而实现远程代码执行(RCE)。这种从文件写入到代码执行的技术路径,在诸如Apache OFBiz等复杂企业级框架中尤为危险,因其常涉及大量XML配置与自定义请求处理器,易在参数处理边界形成风险点。理解此利用链对于企业进行有效的安全加固、部署WAF规则以及实施入侵检测至关重要。本文以高危漏洞CVE-2024-4519

weixin_34184561的博客 533

Upload-labs靶场通关与代码审计:文件上传漏洞攻防实战

文件上传是Web应用中的常见功能,其安全漏洞往往源于服务器端验证机制的缺失或缺陷。攻击者通过绕过前端验证、黑名单限制、文件内容检测等手段,可能上传恶意脚本(如Webshell),进而控制服务器。理解文件上传漏洞的原理,需要从服务器端验证逻辑入手,包括MIME类型检查、扩展名过滤、文件内容解析等环节。这些技术不仅有助于渗透测试,更能指导开发人员构建更安全的文件上传模块。在实际应用中,结合白名单验证、文件重命名、目录执行权限控制等策略,可有效防御此类攻击。本文以Upload-labs靶场为例,通过代码审计分析,

505

CVE-2012-4426:mcrypt格式化字符串漏洞的技术考古与实战分析

格式化字符串漏洞是C/C++程序中一类经典的安全问题,其根源在于printf系列函数对用户输入缺乏严格验证。攻击者通过注入%n、%x等格式化字符,可以读取或篡改进程内存,实现信息泄露乃至代码执行。这类漏洞在安全开发中具有重要警示价值,常出现在处理用户可控数据的日志、调试或字符串格式化场景。本文以PHP mcrypt扩展的历史漏洞CVE-2012-4426为案例,深入剖析其利用链构造与防御机制。通过复现该漏洞在mcrypt_generic_init函数中的触发过程,演示了如何结合GDB调试与ASLR绕过技术,

cqwf95925的博客 445

西门子 S7-200 SMART 系列六:手把手教你配置S7-200 SMART Modbus RTU

最新发表:https://www.ics-pedia.com/%e8%a5%bf%e9%97%a8%e5%ad%90-s7-200-smart-%e7%b3%bb%e5%88%97%e5%85%ad%ef%bc%9a%e6%89%8b%e6%8a%8a%e6%89%8b%e6%95%99%e4%bd%a0%e9%85%8d%e7%bd%aes7-200-smart-modbus-rtu%e5%ae%9e%e4%be%8b/

John_09040211的博客 3283

RK3576平台部署NanoTrack:边缘AI视觉跟踪实战指南

边缘AI部署是将深度学习模型在资源受限的嵌入式设备上高效运行的关键技术,其核心在于模型压缩、硬件适配与软件栈优化。通过INT8量化、算子融合与内存优化等原理,能显著降低模型计算量与内存占用,从而在嵌入式NPU上实现实时推理。这项技术的价值在于为安防监控、无人机视觉、工业检测等场景提供低功耗、高响应的智能感知能力。以瑞芯微RK3576平台部署轻量级视觉跟踪模型NanoTrack为例,其过程涉及模型结构分析、RKNN工具链转换、C++推理程序开发及多线程性能优化,完整展现了从算法到产品的工程化路径,为开发者提供

weixin_31887307的博客 428

shiro反序列化漏洞分析、模拟攻击及修复(一)

实验概述 Apache Shiro 在 Java 的权限及安全验证框架中占用重要的一席之地,在它编号为550的 issue 中爆出严重的 Java 反序列化漏洞。下面,我们将首先搭建漏洞环境,模拟还原此漏洞的场景及分析,最后修补此漏洞。 实验内容 在windows环境中搭建shiro漏洞环境 分析漏洞原因 使用反弹shell利用漏洞模拟攻击 漏洞修复分析及方案 实验采用工具与环境 W...

婷子的博客 1万+

华为防火墙USG6000系列多ISP上网(通过WEB界面设置)

华为防火墙多ISP上网,内网分区上网。内网多网段不同上网方式。

daxihe880的博客 1万+
上一篇: 谈php+mysql注射语句构造
下一篇: 给 XML 初学者
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值