漏洞代码示例
在这个例子中,/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
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号