实战Pikachu XSS
跨站脚本攻击(XSS)
Xss简介
XSS的实质其实是HTML代码与Javscript代码的注入。
跨站点脚本(XSS)攻击是一种注入问题,其中恶意脚本被注入到原本良性和可信任的网站中。当攻击者使用Web应用程序将恶意代码(通常以浏览器端脚本的形式)发送给其他最终用户时,就会发生XSS攻击。允许这些攻击成功的缺陷非常普遍,并且会在Web应用程序中使用来自用户输入的输出(未经验证或编码)的任何地方发生。
攻击者可以使用XSS将恶意脚本发送给毫无戒心的用户。最终用户的浏览器无法知道该脚本不受信任,并将执行JavaScript。由于恶意脚本认为脚本来自受信任的来源,因此可以访问您的浏览器保留并与该站点一起使用的任何cookie,会话令牌或其他敏感信息。这些脚本甚至可以重写HTML页面的内容。
基于DOM的XSS是一种特殊情况,反映了JavaScript呈现在页面中时隐藏在URL中,并在页面中被JavaScript提取,而不是在提供服务时嵌入到页面中。与其他正在阅读页面正文的攻击和WAF或其他保护措施相比,这可以使它更隐秘。
一般XSS可以分为如下几种常见类型:
- 反射型XSS
- 存储型XSS
- DOM型XSS
防范措施:
一般会采用:对输入进行过滤、输出进行转义的方式进行处理
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入
输出转义:根据输出点的位置对输出到前端的内容进行适当转义
XSS修复建议
- 不含有富文本编辑器(自定义样式)且没有使用DOM的站点:
输入:过滤双引号,单引号,左右尖括号,分号。
输出:对上述字符进行HTML实体编码即可。
- 不含有富文本编辑器(自定义样式)但使用DOM的站点:
输入:在DOM中转义双引号,单引号,左右尖括号,分号。
输出:在输出之前进行编码,如:innerHTML=encodeHTML(output)
- 含有富文本编辑器(自定义样式)但没有使用DOM的站点:
输入:过滤双引号,单引号,分号。
输出:对上述字符进行HTML实体编码即可。
- 含有富文本编辑器(自定义样式)且使用DOM的站点:
没办法…指哪儿修哪儿…
DOM型XSS的防御方法
DOM型XSS主要是由客户端的脚本通过DOM动态地输出数据到页面而不是依赖于将数据提交给服务器端,而从客户端获得DOM中的数据在本地执行,因而仅从服务器端是无法防御的。
其防御在于:
(1) 避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务器端使用动态页面来实现
(2) 分析和强化客户端JS代码,特别是受到用户影响的DOM对象,注意能直接修改DOM和创建HTML文件的相关函数或方法,并在输出变量到页面时先进行编码转义,如输出到HTML则进行HTML编码、输出到则进行JS编码
1、反射型xss(get)
交互的数据一般不会被存在在数据库里面,只是简单的把用户输入的数据反射给浏览器,一次性,所见即所得。
<?php
$name = $_GET['name'];
echo "Welcome $name<br>";
?>
使用工具:火狐浏览器开发者工具,最新版本的谷歌浏览器对xss做了限制,在谷歌浏览器中攻击不会成功
源码:
<?php /** * Created by runner.han * There is nothing new under the sun */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "xss_reflected_get.php"){ $ACTIVE = array('','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; $html=''; if(isset($_GET['submit'])){ if(empty($_GET['message'])){ $html.="<p class='notice'>输入'kobe'试试-_-</p>"; }else{ if($_GET['message']=='kobe'){ $html.="<p class='notice'>愿你和{$_GET['message']}一样,永远年轻,永远热血沸腾!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />"; }else{ $html.="<p class='notice'>who is {$_GET['message']},i don't care!</p>"; } } } ?> <div class="main-content"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="xss.php">xss</a> </li> <li class="active">反射型xss(get)</li> </ul><!-- /.breadcrumb --> <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)" data-content="管tmd什么xss,首先你应该输入kobe看一下再说"> 点一下提示~ </a> </div> <div class="page-content"> <div id="xssr_main"> <p class="xssr_title">Which NBA player do you like?</p> <form method="get"> <input class="xssr_in" type="text" maxlength="20" name="message" /> <input class="xssr_submit" type="submit" name="submit" value="submit" /> </form> <?php echo $html;?> </div> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR.'footer.php'; ?> 反射型xss(get)
源码分析:
前端通过input文本框接收用户输入数据,将用户输入保存到变量message中,后端代码通过$_GET['message']直接获取用户输入的值,没有对变量message进行检查过滤
最后直接将$_GET['message']返回到在前端页面展示,没有进行任何转义
用户可以任意输入恶意代码,例如:<script>alert(1)</script>,后端代码没有做任何处理直接返回到前端,导致了反射型xss的产生
查找漏洞步骤与方法:
文本框中输入正常的数据进行查询,查询结果正常显示
文本框中输入代码:<script>alert(1)</script>,发现后面script显示不全:<script>alert(1)</sc。首先猜测前端代码对输入内容长度做了限制
打开浏览器开发者工具查看前端代码:发现input中属性maxlenth=20即最多输入20个字符,果断修改给200然后输入:<script>alert(1)</script>
XSS漏洞验证
浏览器开发者工具内将前端对文本框中内容进行长度验证的maxlength=20属性值修改为200,然后在文本框中直接输入:<script>alert(1)</script>,提交后浏览器出现弹窗。
验证成功
2、反射型xss(post)
源码:
<?php /** * Created by runner.han * There is nothing new under the sun */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "xss_reflected_get.php"){ $ACTIVE = array('','','','','','','','active open','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $PIKA_ROOT_DIR = "../../../"; include_once $PIKA_ROOT_DIR.'inc/config.inc.php'; include_once $PIKA_ROOT_DIR.'inc/mysql.inc.php'; include_once $PIKA_ROOT_DIR.'inc/function.php'; include_once $PIKA_ROOT_DIR.'header.php'; $link=connect(); $is_login_id=check_xss_login($link); if(!$is_login_id){ header("location:post_login.php"); } $state = '你已经登陆成功,<a href="xss_reflected_post.php?logout=1">退出登陆</a>'; $html=''; if(isset($_POST['submit'])){ if(empty($_POST['message'])){ $html.="<p class='notice'>输入'kobe'试试-_-</p>"; }else{ //下面直接将前端输入的参数原封不动的输出了,出现xss if($_POST['message']=='kobe'){ $html.="<p class='notice'>愿你和{$_POST['message']}一样,永远年轻,永远热血沸腾!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />"; }else{ $html.="<p class='notice'>who is {$_POST['message']},i don't care!</p>"; } } } if(isset($_GET['logout']) && $_GET['logout'] == '1'){ setcookie('ant[uname]',''); setcookie('ant[pw]',''); header("location:post_login.php"); } ?> <div class="main-content"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="../xss.php">xss</a> </li> <li class="active">xss概述</li> </ul><!-- /.breadcrumb --> <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)" data-content="问题还是那个问题,只是提交方式变成了post,怎么利用?"> 点一下提示~ </a> </div> <div class="page-content"> <div id="xssr_main"> <p class="xssr_title">Which NBA player do you like?</p> <form method="post"> <input class="xssr_in" type="text" name="message" /> <input class="xssr_submit" type="submit" name="submit" value="submit" /> </form> <br /> <?php echo $state;?> <br /> <?php echo $html;?> </div> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR . 'footer.php'; ?>
源码分析:
输入用户名:admin 密码:123456登录成功,登录成功后文本框中输入数据未做输入过滤和输出编码,导致xss产生。
查找漏洞步骤与方法:
需要登录后台后,文本框中输入xss攻击代码,获取cookie
XSS漏洞验证:
payload :<script>alert(document.cookie)</script>
获取成功:
3、存储型xss
将xss payload存放在数据库中,任何访问该留言板的用户都会受到攻击。
源码:
<?php /** * Created by runner.han * There is nothing new under the sun */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "xss_stored.php"){ $ACTIVE = array('','','','','','','','active open','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; include_once $PIKA_ROOT_DIR."inc/config.inc.php"; include_once $PIKA_ROOT_DIR."inc/mysql.inc.php"; $link=connect(); $html=''; if(array_key_exists("message",$_POST) && $_POST['message']!=null){ $message=escape($link, $_POST['message']); $query="insert into message(content,time) values('$message',now())"; $result=execute($link, $query); if(mysqli_affected_rows($link)!=1){ $html.="<p>数据库出现异常,提交失败!</p>"; } } if(array_key_exists('id', $_GET) && is_numeric($_GET['id'])){ //彩蛋:虽然这是个存储型xss的页面,但这里有个delete的sql注入 $query="delete from message where id={$_GET['id']}"; $result=execute($link, $query); if(mysqli_affected_rows($link)==1){ echo "<script type='text/javascript'>document.location.href='xss_stored.php'</script>"; }else{ $html.="<p id='op_notice'>删除失败,请重试并检查数据库是否还好!</p>"; } } ?> <div class="main-content"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="xss.php">xss</a> </li> <li class="active">存储型xss</li> </ul><!-- /.breadcrumb --> <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)" data-content="无用提示:这个留言板的框框是可以拉长和拉宽的,还行不,大兄弟!"> 点一下提示~ </a> </div> <div class="page-content"> <div id="xsss_main"> <p class="xsss_title">我是一个留言板:</p> <form method="post"> <textarea class="xsss_in" name="message"></textarea><br /> <input class="xsss_submit" type="submit" name="submit" value="submit" /> </form> <div id="show_message"> <br /> <br /> <p class="line">留言列表:</p> <?php echo $html; $query="select * from message"; $result=execute($link, $query); while($data=mysqli_fetch_assoc($result)){ echo "<p class='con'>{$data['content']}</p><a href='xss_stored.php?id={$data['id']}'>删除</a>"; } echo $html; ?> </div> </div> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR.'footer.php'; ?>
源码分析:
实现功能留言板,前端页面显示文本框用户输入留言信息后点击提交按钮,留言信息自己保存到数据库,未进行任何过滤:
if(array_key_exists("message",$_POST) && $_POST['message']!=null){
$message=escape($link, $_POST['message']);
$query="insert into message(content,time) values('$message',now())";
$result=execute($link, $query);
if(mysqli_affected_rows($link)!=1){
$html.="<p>数据库出现异常,提交失败!</p>";
}
}
留言展示列表直接从数据库中获取留言信息展示,未进行任何处理:
<p class="line">留言列表:</p>
<?php echo $html;
$query="select * from message";
$result=execute($link, $query);
while($data=mysqli_fetch_assoc($result)){
echo "<p class='con'>{$data['content']}</p><a href='xss_stored.php?id={$data['id']}'>删除</a>";
}
echo $html;
?>
查找漏洞步骤与方法:
文本框中输入:<script>alert("XSS")</script>,发现弹窗
XSS漏洞验证:
需求:获取任意浏览留言板列表用户的:cookie
payload :<script>alert(document.cookie)</script>
留言文本框中输入:<script>alert(document.cookie)</script>
获取成功
4、DOM型xss
源码:
<?php /** * Created by runner.han * There is nothing new under the sun */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "xss_dom.php"){ $ACTIVE = array('','','','','','','','active open','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; include_once $PIKA_ROOT_DIR."inc/config.inc.php"; include_once $PIKA_ROOT_DIR."inc/mysql.inc.php"; if(isset($_GET['text'])){ $haha = "这里是后台的处理逻辑"; } ?> <div class="main-content"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="xss.php">xss</a> </li> <li class="active">DOM型xss</li> </ul><!-- /.breadcrumb --> <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)" data-content="先到这里把什么是dom搞明白了在说http://www.w3school.com.cn/htmldom/"> 点一下提示~ </a> </div> <div class="page-content"> <div id="xssd_main"> <script> function domxss(){ var str = document.getElementById("text").value; document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>"; } //试试:'><img src="#" onmouseover="alert('xss')"> //试试:' onclick="alert('xss')">,闭合掉就行 </script> <!--<a href="" onclick=('xss')>--> <input id="text" name="text" type="text" value="" /> <input id="button" type="button" value="click me!" onclick="domxss()" /> <div id="dom"></div> </div> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR.'footer.php'; ?>
源码分析:
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
</script>
获取用户输入在文本框中输入的值,保存到str变量中,然后通过直接拼接到innerHTML="<a href='"+str+"'> 中<a href="">中,没有进行任何处理,导致DOM型XSS
查找漏洞步骤与方法:
文本框在输入正常的内容,添加成功后,发现页面提示what do you see?是个a标签,通过源码发现: "<a href='"+str+"'>what do you see?</a>"直接将用户输入的值拼接到a标签的href属性中,导致了DOM行XSS
漏洞验证:
payload : ' onmouseover="alert('xss')">
将payload输入到文本框中,点击:
5、DOM型xss-x
源码:
<?php /** * Created by runner.han * There is nothing new under the sun */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "xss_dom.php"){ $ACTIVE = array('','','','','','','','active open','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; include_once $PIKA_ROOT_DIR."inc/config.inc.php"; include_once $PIKA_ROOT_DIR."inc/mysql.inc.php"; $html=''; if(isset($_GET['text'])){ $html.= "<a href='#' onclick='domxss()'>有些费尽心机想要忘记的事情,后来真的就忘掉了</a>"; } ?> <div class="main-content"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="xss.php">xss</a> </li> <li class="active">DOM型xss</li> </ul><!-- /.breadcrumb --> <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)" data-content="dom型XSS是鸡肋吗?"> 点一下提示~ </a> </div> <div class="page-content"> <div id="xssd_main"> <script> function domxss(){ var str = window.location.search; var txss = decodeURIComponent(str.split("text=")[1]); var xss = txss.replace(/\+/g,' '); // alert(xss); document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>"; } //试试:'><img src="#" onmouseover="alert('xss')"> //试试:' onclick="alert('xss')">,闭合掉就行 </script> <!--<a href="" onclick=('xss')>--> <form method="get"> <input id="text" name="text" type="text" value="" /> <input id="submit" type="submit" value="请说出你的伤心往事"/> </form> <div id="dom"></div> </div> <?php echo $html;?> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR.'footer.php'; ?>
源码分析:
<script>
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
</script>
与上面DOM不同之处使用了:window.location.search
该属性获取页面 URL 地址。
查找漏洞步骤与方法:
同上
DOM型XSS-x漏洞验证:
payload :' onclick="alert('xss')">
6、xss之盲打
存储型XSS,文本框中输入内容不会显示在当前页面,是一个留言功能,用户输入留言内容后,管理员登录后台查看留言。
源码:
<?php /** * Created by runner.han * There is nothing new under the sun */ $PIKA_ROOT_DIR = "../../../"; include_once $PIKA_ROOT_DIR.'inc/config.inc.php'; include_once $PIKA_ROOT_DIR.'inc/mysql.inc.php'; $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "xss_blind.php"){ $ACTIVE = array('','','','','','','','active open','','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } include_once $PIKA_ROOT_DIR.'header.php'; $link=connect(); $html=''; if(array_key_exists("content",$_POST) && $_POST['content']!=null){ $content=escape($link, $_POST['content']); $name=escape($link, $_POST['name']); $time=$time=date('Y-m-d g:i:s'); $query="insert into xssblind(time,content,name) values('$time','$content','$name')"; $result=execute($link, $query); if(mysqli_affected_rows($link)==1){ $html.="<p>谢谢参与,阁下的看法我们已经收到!</p>"; }else { $html.="<p>ooo.提交出现异常,请重新提交</p>"; } } ?> <div class="main-content" xmlns="http://www.w3.org/1999/html"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="../xss.php">xss</a> </li> <li class="active">xss盲打</li> </ul><!-- /.breadcrumb --> <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)" data-content="登录后台,看会发生啥?后台登录地址是/xssblind/admin_login.php"> 点一下提示~ </a> </div> <div class="page-content"> <div id="xss_blind"> <p class="blindxss_tip">请在下面输入你对"锅盖头"这种发型的看法:</p> <p class="blindxss_tip">我们将会随机抽出一名送出麻港一日游</p> <form method="post"> <textarea class="content" name="content"></textarea><br /> <label>你的大名:</label><br /> <input class="name" type="text" name="name"/><br /> <input type="submit" name="submit" value="提交" /> </form> <?php echo $html;?> </div> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR.'footer.php'; ?>
源码分析:
留言板功能,将用户输入的内容未经处理直接存放到数据库中,然后管理员登录查看留言列表信息,直接从数据库中读取,未做任何处理。
if(array_key_exists("content",$_POST) && $_POST['content']!=null){
$content=escape($link, $_POST['content']);
$name=escape($link, $_POST['name']);
$time=$time=date('Y-m-d g:i:s');
$query="insert into xssblind(time,content,name) values('$time','$content','$name')";
$result=execute($link, $query);
if(mysqli_affected_rows($link)==1){
$html.="<p>谢谢参与,阁下的看法我们已经收到!</p>";
}else {
$html.="<p>ooo.提交出现异常,请重新提交</p>";
}
}
查找漏洞步骤与方法:
留言板中输入xss注入语句后提交成功,没有报错,初步判断存在xss注入
漏洞验证:
payload : <script>alert(/xss/)</script>
留言板文本框中输入:<script>alert(/xss/)</script>,提交成功。
管理员登录后台查看留言板:http://192.168.10.7:85/pikachu-master/vul/xss/xssblind/admin.php
7、xss过滤
源码:
<?php /** * Created by runner.han * There is nothing new under the sun */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "xss_01.php"){ $ACTIVE = array('','','','','','','','active open','','','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; $html = ''; if(isset($_GET['submit']) && $_GET['message'] != null){ //这里会使用正则对<script进行替换为空,也就是过滤掉 $message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']); if($message == 'yes'){ $html.="<p>那就去人民广场一个人坐一会儿吧!</p>"; }else{ $html.="<p>别说这些'{$message}'的话,不要怕,就是干!</p>"; } } ?> <div class="main-content"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="xss.php">xss</a> </li> <li class="active">xss之过滤</li> </ul><!-- /.breadcrumb --> <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)" data-content="有些内容被过滤了,试试看怎么绕过?"> 点一下提示~ </a> </div> <div class="page-content"> <div id="xssr_main"> <p class="xssr_title">阁下,请问你觉得人生苦短吗?</p> <form method="get"> <input class="xssr_in" type="text" name="message" /> <input class="xssr_submit" type="submit" name="submit" value="submit" /> </form> <?php echo $html;?> </div> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR.'footer.php'; ?>
源码分析:
使用正则对<script进行替换为空
if(isset($_GET['submit']) && $_GET['message'] != null){
$message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);
查找漏洞步骤与方法:
输入:<script>alert("XSS")</script>发现被过滤了,返回>,查看源码发现过滤了小写的<script
漏洞验证:
payload用大写即可绕过:<SCRIPT>alert(111)</SCRIPT>
输入:<SCRIPT>alert(111)</SCRIPT>
8、xss使用htmlspecialchars
源码
<?php /** * Created by runner.han * There is nothing new under the sun */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "xss_02.php"){ $ACTIVE = array('','','','','','','','active open','','','','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; $html=''; $html1=''; $html2=''; if(isset($_GET['submit'])){ if(empty($_GET['message'])){ $html.="<p class='notice'>输入点啥吧!</p>"; }else { //使用了htmlspecialchars进行处理,是不是就没问题了呢,htmlspecialchars默认不对'处理 $message=htmlspecialchars($_GET['message']); $html1.="<p class='notice'>你的输入已经被记录:</p>"; //输入的内容被处理后输出到了input标签的value属性里面,试试:' onclick='alert(111)' // $html2.="<input class='input' type='text' name='inputvalue' readonly='readonly' value='{$message}' style='margin-left:120px;display:block;background-color:#c0c0c0;border-style:none;'/>"; $html2.="<a href='{$message}'>{$message}</a>"; } } ?> <div class="main-content"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="xss.php">xss</a> </li> <li class="active">xss之htmlspecialchars</li> </ul><!-- /.breadcrumb --> <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)" data-content="先去查一下htmlspecialchars这个方法的含义"> 点一下提示~ </a> </div> <div class="page-content"> <div id="xssr_main"> <p class="xssr_title">人生之所有苦短,是因为你的xss学习的还不够好</p> <form method="get"> <input class="xssr_in" type="text" name="message" /> <input class="xssr_submit" type="submit" name="submit" value="submit" /> </form> <?php echo $html; echo $html1; echo $html2; ?> </div> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR.'footer.php'; ?>
源码分析:
htmlspecialchars()是php里面把预定义的字符转换为HTML实体的函数:
预定义的字符是:
- & 成为 &
- " 成为 "
- ' 成为 '
- < 成为 <
- > 成为 >
使用了htmlspecialchars()进行处理:$message=htmlspecialchars($_GET['message']),将'转义成\
查找漏洞步骤与方法:
输入:' onclick='alert(111)' 发现讲'过滤成了\',只能通过js和事件注入。
漏洞验证:
payload :javascript:alert(111)
payload : ' onclick='alert(111)'
如图1:
如图2:
9、xss之href输出
源码:
<?php /** * Created by runner.han * There is nothing new under the sun */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "xss_03.php"){ $ACTIVE = array('','','','','','','','active open','','','','','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; $html=''; if(isset($_GET['submit'])){ if(empty($_GET['message'])){ $html.="<p class='notice'>叫你输入个url,你咋不听?</p>"; } if($_GET['message'] == 'www.baidu.com'){ $html.="<p class='notice'>我靠,我真想不到你是这样的一个人</p>"; }else { //输出在a标签的href属性里面,可以使用javascript协议来执行js //防御:只允许http,https,其次在进行htmlspecialchars处理 $message=htmlspecialchars($_GET['message'],ENT_QUOTES); $html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>"; } } ?> <div class="main-content"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="xss.php">xss</a> </li> <li class="active">xss之href输出</li> </ul><!-- /.breadcrumb --> <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)" data-content="a标签里面的href,img里面的src属性,有什么特殊的么"> 点一下提示~ </a> </div> <div class="page-content"> <div id="xssr_main"> <p class="xssr_title">请输入一个你常用的网站url地址,我就知道你是什么人</p> <form method="get"> <input class="xssr_in" type="text" name="message" /> <input class="xssr_submit" type="submit" name="submit" value="submit" /> </form> <?php echo $html; ?> </div> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR.'footer.php'; ?>
源码分析:
输出在a标签的href属性里面,可以使用javascript协议来执行js
防御:只允许http、https、其次在进行htmlspecialchars处理
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="<p class='notice'>叫你输入个url,你咋不听?</p>";
}
if($_GET['message'] == 'www.baidu.com'){
$html.="<p class='notice'>我靠,我真想不到你是这样的一个人</p>";
}else {
//输出在a标签的href属性里面,可以使用javascript协议来执行js
//防御:只允许http,https,其次在进行htmlspecialchars处理
$message=htmlspecialchars($_GET['message'],ENT_QUOTES);
$html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";
}
}
查找漏洞步骤与方法:
输入:<script>alert("XSS")</script> 报403错误
漏洞验证:
payload :javascript:alert(111)
输入:javascript:alert(111)
10、xss之js输出
源码:
<?php /** * Created by runner.han * There is nothing new under the sun */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "xss_04.php"){ $ACTIVE = array('','','','','','','','active open','','','','','','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; $jsvar=''; $html=''; //这里讲输入动态的生成到了js中,形成xss //javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义 //讲这个例子主要是为了让你明白,输出点在js中的xss问题,应该怎么修? //这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。 //所以在JS的输出点应该使用\对特殊字符进行转义 if(isset($_GET['submit']) && $_GET['message'] !=null){ $jsvar=$_GET['message']; // $jsvar=htmlspecialchars($_GET['message'],ENT_QUOTES); if($jsvar == 'tmac'){ $html.="<img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/tmac.jpeg' />"; } } ?> <div class="main-content" xmlns="http://www.w3.org/1999/html"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="xss.php">xss</a> </li> <li class="active">xss之js输出</li> </ul><!-- /.breadcrumb --> <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)" data-content="输入被动态的生成到了javascript中,如何是好。输入tmac试试-_-"> 点一下提示~ </a> </div> <div class="page-content"> <div id="xssr_main"> <p class="xssr_title">which NBA player do you like?</p> <form method="get"> <input class="xssr_in" type="text" name="message" /> <input class="xssr_submit" type="submit" name="submit" value="submit" /> </form> </br> <p id="fromjs"></p> <?php echo $html;?> </div> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <script> $ms='<?php echo $jsvar;?>'; if($ms.length != 0){ if($ms == 'tmac'){ $('#fromjs').text('tmac确实厉害,看那小眼神..') }else { // alert($ms); $('#fromjs').text('无论如何不要放弃心中所爱..') } } </script> <?php include_once $PIKA_ROOT_DIR.'footer.php'; ?>
源码分析:
文本框中输入的值通过变量$jsvar,js展示在页面中
<script>
$ms='<?php echo $jsvar;?>';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
查找漏洞步骤与方法:
输入:<script>alert(1)</script> 没有反应,初步怀疑是否被转义、或者是输出呢
打开浏览器开发者工具查看,发现是js输出,注入js代码
漏洞验证:
payload1:x'</script><script>alert('xss')</script>
payload2:';alert(1)//