Curl 导致 SSRF 及 WAF 绕过方式

本文深入探讨了Curl漏洞如何被用于SSRF攻击,不仅解释了基本原理,还详细列举了多种利用方式,包括操作Redis、任意文件读取、FTP爆破等,并介绍了如何绕过WAF进行攻击。

Curl 漏洞

背景

SSRF 一般用来探测内网服务,但由于应用层使用的 Request 服务(curl/filegetcontents)一般不只是支持 HTTP/HTTPS,导致可以深层次利用。

漏洞代码

function curl($url){  
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    $re = curl_exec($ch);
    curl_close($ch);
    return $re;
}
$url = $_GET['url'];
echo curl($url);

利用方式

  • dict (操作 Redis)
  • file (任意文件读取)
  • ftp、ftps (FTP 爆破)
  • tftp(UDP 协议扩展)
  • gopher (操作 Redis、Memcached)
  • imap/imaps/pop3/pop3s/smtp/smtps(爆破邮件用户名密码)
  • rtsp
  • smb/smbs (连接 SMB)
  • telnet - 连接 SSH/Telnet
  • http、https - 内网服务探测
    • 网络服务探测
    • ShellShock 命令执行
    • JBOSS 远程 Invoker war 命令执行
    • Java 调试接口命令执行
    • axis2-admin 部署 Server 命令执行
    • Jenkins Scripts 接口命令执行
    • Confluence SSRF
    • Struts2 一堆命令执行
    • counchdb WEB API 远程命令执行
    • mongodb SSRF
    • docker API 远程命令执行
    • php_fpm/fastcgi 命令执行
    • tomcat 命令执行
    • Elasticsearch 引擎 Groovy 脚本命令执行
    • WebDav PUT 上传任意文件
    • WebSphere Admin 可部署 war 间接命令执行
    • Apache Hadoop 远程命令执行
    • zentoPMS 远程命令执行
    • HFS 远程命令执行
    • glassfish 任意文件读取和 war 文件部署间接命令执行

访问 http://test/test.php?url=http://www.baidu.com

url 改成 file:///etc/passwd (权限够的前提下)

如果知道网站目录,则可以读取网站配置文件

绕过 WAF

当 url 里出现 file:///etc/passwd 等敏感内容的时候,WAF 会拦截行为
我想到的思路是获取源站 IP,直接将请求发送到源站上。

url 改成自己的网站

查一下网站日志文件 access.log

拿到源站 IP 后,通过 Burp 修改请求即可绕过 cdn,绕过 Waf

<think>嗯……用户想知道URL使用十六进制编码绕过的方法,这问题正好和我之前整理的4条引用完全匹配。用户引用中既有概念解释又有实际案例,看来已经做过功课但需要系统总结。引用[1]的URL编码原理是核心:那些特殊字符用%加十六进制替换。Python的ord()和hex()组合就是实操工具,比如用户例子里的#变%23。引用[2]提到的关键点很妙——某些URL解码器允许0-F范围外的字符,这就可能引发解析异常造成绕过。实战层面用户提供了两个方向:引用[3]的SSRF案例用curl演示了参数注入,引用[4]的SQL注入绕过思路更值得深挖。特别是内联注释和分离关键字的手法,比如把unionselect写成union/*123*/select,或者用%0a换行符分隔关键字都能让WAF失效。要提醒用户这种绕过的本质弱点:依赖目标系统URL解码器的实现瑕疵。比如如果对方严格执行只解码0-9A-F字符,或者进行二次验证,十六进制编码就会失效。最后生成相关问题特意加入了检测方法,因为用户明显是安全测试人员,肯定关心验证手段。</think> 在URL中使用十六进制编码绕过过滤或安全限制的核心是**利用URL编码的%xx格式对特殊字符进行转换**,使过滤器无法识别原始敏感字符。以下是具体方法及原理: --- ### 一、基础绕过的实现方式 1. **直接替换敏感字符** - 将关键词/符号转为`%xx`格式(xx为十六进制ASCII码): - `#` → `%23`(如引用[1]所示) - 空格 → `%20` 或 `+` - `<` → `%3C`, `>` → `%3E`(如引用[2]提到的符号) - **示例**: ```url http://test.com?query=SELECT%2A%20FROM%20users # 等价于 SELECT* FROM users ``` 2. **混淆关键语法结构**(针对SQL注入等场景) - 如引用[4]所述,可分离关键字避开正则过滤: ```url http://vuln.com?id=1%0AUNION%0ASELECT%201,2,3 ``` `%0A`(换行符)分隔`UNION`和`SELECT`,绕过`/union\sselect/g`检测。 3. **多层嵌套编码** - 对已编码字符二次编码:`#` → `%23` → `%2523` - 用于绕过简单解码器: ```url http://sec.com?path=..%252fetc%252fpasswd # 解码后为 ../etc/passwd ``` --- ### 二、进阶技巧:十六进制溢出(Hex Overflow) **适用场景**:目标系统URL解码器存在缺陷(引用[2]) 1. **插入非法十六进制字符** - 使用超出`0-9 A-F`范围的字符(如`G`、`%`后接符号): ```url http://target.com?cmd=%G1{;cat /etc/passwd} ``` 有缺陷的解码器可能因解析异常跳过过滤逻辑。 2. **利用特殊符号干扰解析** - 结合`[]{};<>`等符号制造溢出: ```url http://api.com/getfile?name=secret.txt%3B{/etc/passwd} ``` --- ### 三、安全绕过实践示例 1. **SSRF绕过路径限制**(引用[3]) ```url http://sec.com/ssrf.php?url=http://127.0.0.1%23@attacker.com ``` `%23`(#)使后半段被解析为片段标识符,访问`127.0.0.1`。 2. **SQL注入WAF绕过**(引用[4]) ```sql http://app.com?id=1%20%55%4E%49%4F%4E%20%53%45%4C%45%43%54%201,version() ``` 关键字`UNION SELECT`被转为十六进制:`%55%4E%49%4F%4E`=`UNION`, `%53%45%4C%45%43%54`=`SELECT` --- ### 四、关键注意事项 1. **编码范围限制** URL编码仅允许ASCII字符集,非ASCII字符需用UTF-8编码后再转换(如中文`中`→`%E4%B8%AD`)。 2. **目标环境差异** 某些系统会自动多次解码URL(如多次`urldecode()`),需测试多层编码: ```python # Python生成多层编码 import urllib.parse print(urllib.parse.quote(urllib.parse.quote("../etc/passwd"))) # %252E%252E%252Fetc%252Fpasswd ``` --- ### 总结 绕过效果取决于**目标系统解码逻辑的严格性**: ✅ **生效场景**:未标准化解码、未过滤非法十六进制字符、缺乏二次验证的系统 ❌ **失效场景**:严格仅处理`0-9 A-F`字符、执行多次解码后验证的系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值