%5c暴库漏洞

本文介绍了Microsoft IIS 4.0/5.0的CGI文件名错误解码漏洞,攻击者可利用此漏洞执行任意系统命令。还分析了利用该漏洞进行%5c暴库的成功条件,如服务器为IIS 4.0或5.0且未屏蔽错误信息、数据库连接无容错代码、采用相对路径等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在黑基又看到了关于%5c暴库的文章。呵呵,这招真的很管用,大概10个网站里会有一个会暴库吧。。

关于这个漏洞。绿盟有相关的资料。


Microsoft IIS CGI文件名错误解码漏洞

发布日期:2001-05-15

CVE CAN ID:CVE-2001-0333

受影响的软件及系统:
====================
- Microsoft IIS 4.0
- Microsoft IIS 5.0

未受影响的软件及系统:
======================
- Windows IIS 4.0 (sp6/sp6a 没有安装其他新的hotfix)

综述:
======
NSFOCUS安全小组发现微软IIS 4.0/5.0在处理CGI程序文件名时存在一个安全漏洞,由于错误地对文件名进行了两次解码,攻击者可能利用这个漏洞执行任意系统命令。

分析:
======
IIS在加载可执行CGI程序时,会进行两次解码。第一次解码是对CGI文件名进行http解码,然后判断此文件名是否为可执行文件,例如检查后缀名是否为".exe"或".com"等等。在文件名检查通过之后,IIS会再进行第二次解码。正常情况下,应该只对该CGI的参数进行解码,然而,IIS错误地将已经解码过的CGI文件名和CGI参数一起进行解码。这样,CGI文件名就被错误地解码了两次。

通过精心构造CGI文件名,攻击者可以绕过IIS对文件名所作的安全检查,例如对"../"或"./"的检查,在某些条件下,攻击者可以执行任意系统命令。

例如,对于'/'这个字符,正常编码后是%5c。这三个字符对应的编码为:
'%' = %25
'5' = %35
'c' = %63

如果要对这三个字符再做一次编码,就可以有多种形式,例如:
%255c
%%35c
%%35%63
%25%35%63
...

因此,"../"就可以表示成"..%255c"或"..%%35c"等等形式。

在经过第一次解码之后,变成"..%5c"。IIS会认为这是一个正常的字符串,不会违反安全规则检查。而在第二次被解码之后,就会变成"../"。因此攻击者就可以使用"../"来进行目录遍历,执行web目录之外的任意程序。

测试方法:
==========
例如,如果TARGET存在一个虚拟可执行目录(scripts),并且它与windows系统在同一驱动器上。那么提交类似下列请求:

http://target/scripts/..%5c..%5cwinnt/system32/cmd.exe?/c+dir+c:/

就会列出C:/的根目录。

当然,对于'/'或者'.'做变换同样可以达到上面的效果。
例如:"..%252f", ".%252e/"...

注意:攻击者只能以IUSER_machinename用户的权限执行命令。

解决方法:
==========
1、如果不需要可执行的CGI,可以删除可执行虚拟目录,例如 /scripts等等。
2、如果确实需要可执行的虚拟目录,建议将可执行虚拟目录单独放在一个分区
3、将所有可被攻击者利用的命令行工具移到另外一个目录中并禁止GUEST组访问。

厂商状态:
==========
2001.3.27 我们将这个问题通报给了微软公司。
2001.4.01 微软告知重现了这个问题
2001.4.16 微软提供了补丁程序供测试,测试发现此问题已被解决
2001.4.23 微软请求我们延迟2个星期发布公告以等待更完善的测试
2001.4.30 微软告知我们还须再推迟一个星期发布
2001.5.14 微软已就此发布了一个安全公告(MS01-026)以及相应补丁

您可以在下列地址看到微软安全公告的详细内容:

http://www.microsoft.com/technet/security/bulletin/ms01-026.asp

补丁程序可以在下列地址下载:

. Microsoft IIS 4.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=29787

. Microsoft IIS 5.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=29764

呵呵。虽然这个我们这个漏洞呵暴库关系不是很大, 但是明眼人还是看的出相关的地方,IIS 二次解码。大家知道在 url中 "/" 和 "/"
是一样的,也就是说http://www.example.com/abc/123.asp?id=5http://www.example.com/abc/123.asp?id=5 是一样的。

http://www.example.com/abc%5c123.asp?id=5 经过一次解码后变成http://www.example.com/abc/123.asp?id=5 这里是不会出错的。
而 经过 IIS 二次解码后就变成http://www.example.com/abc%5c123.asp?id=5, 如果数据库连接文件用的相对路径的话。HOO, 找不到数据
库文件,当然就出错了。还很老实呢,连物理路径都出来了。大家看。

Microsoft JET Database Engine 错误 '80004005'

'D:/wwwroot/hell/wwwroot/data/abc.asp'不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。

/blog/conn.asp,行29


这个是我暴 Oblog 暴出来的,这个月的黑防大家都有看吧。。(晕倒,早知道我也去投稿了。我发现的比他早多了,郁闷。)

很多人都在分析成功的条件,就象itbbs里的人讨论的一样。(itbbs最近我怎么上不去啊,知道告诉偶.)

sykkk 认为:

1,是数据库连接中没有加入容错代码 所以导致错误不能跳过而活生生的把数据文件连接暴出来

2, 对方的IIS没有关闭错误提示 只要关了错误提示就算你怎么暴也没有用

3,不一定要2级目录 但是肯定的是一级目录是绝对不成功的 要是你成功了欢迎拿出来给大家分享 他文章说的自己够造个noexists/..%C的2级目录 个人认为应该是错误的 至少我没有成功过 有成功的欢迎留下网站测试

4,还有就是 要成功一定要调用到数据库 不一定是5c1.asp?id=1 这种类别的 只要是提交或者检测数据的基本都可以 非常多的六合采网站都是采用/XXX/CHECK.ASP来认证 找到认证位置 直接/XXX%5CCHECK。ASP同样可以达到 暴库的目的

其实我们 XST的老大ToToDoDo说的必要条件他忘了,数据库要相对路径,绝对路径是暴不出来的。还有我补充一点 应该是 IIS 4.0 或者 IIS 5.0 ,IIS 6 应该是不行了。

关于二级目录,我同意sykkk的看法,有的人说一定是二级目录,呵呵,我可以告诉大家那是错误的。应该是最靠近的asp文件的那个 "/"改成
"%5c", 只有有调用数据库都有可能暴库。哈哈,还有当然对方要没有屏蔽错误信息,要不然你是肯定看不到di

总结:%5c暴库成功条件

1. 对方服务器用的是 IIS 4.0 或 IIS 5.0, 并且没有屏蔽错误信息。


2. 是数据库连接中没有加入容错代码 所以导致错误不能跳过而活生生的把数据文件连接暴出来 (On Error Resume Next)

3.应该是Microsoft JET Database Engine 方式

4. 数据库文件调用用的是相对路径!!


不一定要求是二级目录。三级也是可以的(我有成功过), 二级目录反倒没成功,呵呵。还有构造二级目录,我是没成功过,嘿嘿,应该是错误的。:)


随便也告诉大家,aspx %5c 也有文章的,运用也很巧妙,想知道就知道google吧。^_^

个人见解,欢迎大家批评指正。

<think>我们有一段URL编码的数据,需要逐步解码。URL编码的规则是%后跟两位十六进制数表示一个字符。我们可以使用编程语言或者手动替换来解码,但这里数据较长且嵌套,手动替换容易出错,建议使用编程方式。 观察数据,发现有多层编码:最外层是%7B...%7D,对应{"...}",而内部还有嵌套的编码,比如%22对应双引号,%3A对应冒号,%2C对应逗号,%5C对应反斜杠(但这里可能是转义的双引号),%7B对应左花括号,%7D对应右花括号等。 由于数据是字符串形式,且内部有多次编码的迹象(例如,在已经编码的字符串内部又出现编码),我们需要进行多次解码直到得到可读的JSON。 步骤: 1. 首先,对给出的整个字符串进行一次URL解码,得到第一层字符串。 2. 观察解码后的字符串,如果内部还有URL编码的字符(如%22,%7B等),则可能需要再次解码,直到没有URL编码的字符。 但是注意:在JSON字符串中,双引号会被转义为\",而在URL编码中,双引号是%22。在解码过程中,我们可能会遇到转义符(反斜杠)的情况,比如\",这实际上是JSON字符串中的合法转义,不需要再进行URL解码。 因此,我们只需要进行一次URL解码,然后尝试解析为JSON对象。在JSON对象中,某些字段的值可能仍然是字符串形式的JSON,这时我们需要再次解析。 具体到给定的字符串: 原始字符串:%7B%22msgType%22%3A%223%22%2C%22msg%22%3A%22%7B%5C%22code%5C%22%3A4%2C%5C%22isBle%5C%22%3Afalse%2C%5C%22softBusData%5C%22%3A%7B%5C%22data%5C%22%3A%7B%5C%22transactionId%5C%22%3A%5C%22hgjhgkjhfkjhlkjhd%5C%22%2C%5C%22fields%5C%22%3A%5B%7B%5C%22field%5C%22%3A%5C%22904%5C%22%2C%5C%22cmd%5C%22%3A%5C%22logType%3D0%5C%22%7D%2C%7B%5C%22field%5C%22%3A%5C%22903%5C%22%2C%5C%22cmd%5C%22%3A%5C%22day%3D0%5C%22%7D%5D%2C%5C%22taskState%5C%22%3A10%2C%5C%22followDevices%5C%22%3A%5B%5D%2C%5C%22debugStartTime%5C%22%3A1751437907955%2C%5C%22debugPlanEndTime%5C%22%3A1751438507955%2C%5C%22debugEndTime%5C%22%3A0%2C%5C%22createTime%5C%22%3A1751437907955%2C%5C%22updateTime%5C%22%3A1751437907955%2C%5C%22deviceIndex%5C%22%3A0%7D%2C%5C%22taskType%5C%22%3A%5C%22CommunicateRada%5C%22%7D%7D%22%7D 我们使用一次URL解码,将%XX替换为对应的字符。 解码过程(使用Python示例): import urllib.parse decoded_str = urllib.parse.unquote(encoded_str) 解码后,我们得到: { "msgType": "3", "msg": "{\"code\":4,\"isBle\":false,\"softBusData\":{\"data\":{\"transactionId\":\"hgjhgkjhfkjhlkjhd\",\"fields\":[{\"field\":\"904\",\"cmd\":\"logType=0\"},{\"field\":\"903\",\"cmd\":\"day=0\"}],\"taskState\":10,\"followDevices\":[],\"debugStartTime\":1751437907955,\"debugPlanEndTime\":1751438507955,\"debugEndTime\":0,\"createTime\":1751437907955,\"updateTime\":1751437907955,\"deviceIndex\":0},\"taskType\":\"CommunicateRada\"}}" } 注意,msg字段的值是一个字符串,这个字符串是一个JSON格式的字符串(包含转义的双引号)。因此,我们需要将msg字段的值再解析一次JSON。 所以,完整解码后应该是: { "msgType": "3", "msg": { "code": 4, "isBle": false, "softBusData": { "data": { "transactionId": "hgjhgkjhfkjhlkjhd", "fields": [ { "field": "904", "cmd": "logType=0" }, { "field": "903", "cmd": "day=0" } ], "taskState": 10, "followDevices": [], "debugStartTime": 1751437907955, "debugPlanEndTime": 1751438507955, "debugEndTime": 0, "createTime": 1751437907955, "updateTime": 1751437907955, "deviceIndex": 0 }, "taskType": "CommunicateRada" } } } 现在,我们将按照这个步骤进行解码,并输出最终的JSON结构。 由于问题要求恢复数据,我们直接给出解码后的JSON字符串。 注意:我们不需要执行代码,而是描述解码过程和结果。但为了准确,这里用代码思路解释。 最终,我们输出解码后的JSON字符串(美化格式)。</think>### URL编码数据恢复结果 经过URL解码后,原始数据恢复如下(已格式化): ```json { "msgType": "3", "msg": { "code": 4, "isBle": false, "softBusData": { "data": { "transactionId": "hgjhgkjhfkjhlkjhd", "fields": [ { "field": "904", "cmd": "logType=0" }, { "field": "903", "cmd": "day=0" } ], "taskState": 10, "followDevices": [], "debugStartTime": 1751437907955, "debugPlanEndTime": 1751438507955, "debugEndTime": 0, "createTime": 1751437907955, "updateTime": 1751437907955, "deviceIndex": 0 }, "taskType": "CommunicateRada" } } } ``` ### 关键解码说明: 1. **核心解码映射**: - `%7B` → `{`(左花括号) - `%22` → `"`(双引号) - `%3A` → `:`(冒号) - `%2C` → `,`(逗号) - `%5C%22` → `\"`(转义双引号) - `%5B` → `[`(左方括号) - `%5D` → `]`(右方括号) 2. **数据结构分析**: - 包含设备调试任务信息(`taskType: "CommunicateRada"`) - 时间戳均为毫秒级(如`1751437907955`对应**2025-07-01 07:31:47 UTC**) - 包含两个配置字段: - 字段904:日志类型设置(`logType=0`) - 字段903:天数设置(`day=0`) 3. **特殊解码处理**: - 嵌套JSON中的转义双引号`%5C%22`需双重解码 - 空数组`%5B%5D`直接解码为`[]`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值