安全技术研究-SSRF攻击(.NET代码)

漏洞代码示例

在这个例子中,/avatar API用于更新用户的头像。

https://www.vulnerableapp.com/avatar?url=https%253A%252F%252Fapi.twitter.com%252F1.1%252Fusers%252Fshow.json%253Fscreen_name%253Dusername

url参数的值参考Twitter API的值: https://api.twitter.com/1.1/users/show.json?screen_name=username,url-encoded两次;这说明了第一次url解码将发生在我们的web服务器内,第二次url解码将发生在Twitter的服务器上。下面是检索外部URL的代码段。

WebRequest request = WebRequest.Create(inputURL);
WebResponse response = request.GetResponse();

该代码是脆弱的,因为它信任攻击者输入完整的URL;一个像下面这样的攻击向量url=file:///etc/passwd将文件的内容返回给攻击者(在Windows中,等价的语法是url=file:///C:/path/to/file)

如何防护

如果已知允许的url列表,则实现一个允许列表。在上面的同一个例子中,新的API将以这样的方式调用:

http://vulnerableapp.com/api/avatar/update?external=true&url=1&user=screen_name%3Dusername

在上面的URL中,user参数包含要发送到Twitter API的参数的名称和值;%3D是字符"="的url编码版本。如果实际的=字符必须发送到第三方URL,它必须在user值内编码两次。

enum AvatarURL
{
    Twitter = 0,
    Gravatar = 1,
    Google = 2,
    Facebook = 3
}

Dictionary allowedURLsForAvatar = new Dictionary();
allowedURLsForAvatar.Add(AvatarURL.Twitter,"https://api.twitter.com/1.1/users/show.json");


AvatarURL avatarURLEnum;
Enum.TryParse("0", out avatarURLEnum);
string safeURL = "";
allowedURLsForAvatar.TryGetValue(avatarURLEnum, out safeURL);

if (safeURL == null){
	// Return an error message
} else {
	...
	// build and use the final URL
	string finalURL=safeURL;
	if (user != null) {
		// account for encoding
		string paramName = System.Web.HttpUtility.UrlEncode(user.Split("=").First());
		string paramValue = System.Web.HttpUtility.UrlEncode(user.Split("=").Last());
		finalURL += '?' + paramName + '=' + paramValue;
	}
	...
}
展开阅读全文

页面更新:2024-06-13

标签:代码   攻击者   向量   示例   语法   漏洞   字符   例子   参数   列表

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top