XSS(跨站脚本漏洞)——皮卡丘练习(小白随笔)
环境准备:小皮(phpstudy)、皮卡丘(pikachu)、burpsuite、火狐浏览器
概念理解:
操作步骤:
1、新建txt文档,后缀改为php
<html> <body> :静态页面
<?php> 后端代码:在服务器先做计算,在再把计算结果返回到页面
1 <html> 2 <title>XSS TEST</title> 3 <body> 4 <div>这是一个测试页面</div> 5 keyword:<?php echo $_GET['keyword'];?><br> 6 </body> 7 </html>
echo $_GET['k'];
echo $_POST['keyword']; // get和post都为变量值,通过k值写入1234567890123
访问结果:
输入:在链接后添加数值
* 也支持运算:
keyword:<?php echo $_GET['k']+1111;?><br>
如果访问有乱码,将文件另存为其它编码
2、在静态代码中增加一条 动态
<html> <title>XSS TEST</title> <body> <div>这是一个测试页面</div> <script>alert('XSS!')</script> keyword:<?php echo $_GET['k']+1111;?><br> </body> </html>
访问结果:弹窗(此语句在前端执行)
3、当传输参数时没有任何过滤,并且参数还能返回到页面,此时可注入js代码
*网站链接注入代码,也可弹窗
获取cookie值:扩展——搜索:安装插件cookie Editor(可看到当前页cookie信息)
(cookie插件)
(cookie信息)
或者链接获取cookie信息:
http://127.0.0.1/1.php?k=<script>alert(document.cookie)</script>
XSS跨站脚本攻击过程:
1、恶意攻击者通过Email或HITP将构造好的URL发送给普通用户
2、普通用户在浏览器中浏览该URL
3、汶览器执行脚本后,返回数据
4、在普通用户毫不知情的情况下,脚本将其cookie等信息发送给攻击者
5、攻击者使用盗取来的cookie等敏感信息用来伪造用户
恶意脚本形式:
1、利用XSS弹警告窗:
<script>alert('XSS!')</script>
2、嵌入其他网站:
<iframe src=http://www.163.com width=1000 height=1000></iframe>
3、获取cookie值:
<script>alert(document.cookie)</script>
4、XSS输入也可能是HTML代码段,如使网页不停刷新:
<meta http-equiv='refresh' content="1;">
XSS的危害:
- 网络钓鱼,包括盗取各类用户账号
- 窃取用户cookie资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作
- 劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账,强制发表日志,发送电子邮件强制弹出广告页面,刷流量等
- 浏览器挖矿
- 网页挂马
- 进行恶意操作,例如篡改页面信息,删除文章等
- 进行大量客户端攻击,如DDOS攻击
- 获取客户端信息,如用户浏览历史,真实IP,开放端口等控制受害者及其向其他网站发起攻击
- 结合其他漏洞进一步扩大攻击
- 传播XSS跨站脚本蠕虫等
- ......
隐藏的危害:通过网上的 “短链接生成” 等工具将恶意代码藏到短链接,或者生成二维码
常见的三种攻击类型:
1、反射型(非持久性):
一般来说这种类型的XSS,需要攻击者提前构造一个恶意链接,来诱使客户点击,比如这样的一段链接: www.abc.com/?params= <script>alert(/xss/)</script>。
2、存储型(持久型):
这种类型的XSS,危害比前一种大得多。比如一个攻击者在论坛的楼层中包含了一段JavaScript代码,并且服务器没有正确进行过滤输出,那就会造成浏览这个页面的用户执行这段JavaScript代码。
3、DOM-XSS:
DOM—based XSS漏洞是基于文档对象模型Document Object Model,DOM)的一种漏洞。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—basedXSS漏洞。
利用代码注入的方法,造成浏览器执行了恶意代码,XSS漏洞是借助服务器漏洞对用户浏览器进行攻击的—种方法;不同浏览器呈现的结果不一样。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义。
pikachu平台测试:
1、反射型(get)
若显示不全,可将字符限制“20”改为“50”,即可解决
访问链接结果:
burpsuite抓包分析:
1 GET /pikachu/vul/xss/xss_reflected_get.php?message= 2 %3Cscript%3Ealert%28%27XSS%EF%BC%81%27&submit=submit HTTP/1.1 3 Host: 127.0.0.1 4 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0 5 Accept: */* 6 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 7 Accept-Encoding: gzip, deflate 8 Connection: close 9 Sec-Fetch-Dest: empty 10 Sec-Fetch-Mode: no-cors 11 Sec-Fetch-Site: same-origin
对应代码:(位置:根据网址找到对应路径下的文本文件)
1 <?php 2 /** 3 * Created by runner.han 4 * There is nothing new under the sun 5 */ 6 7 8 $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); 9 10 if ($SELF_PAGE = "xss_reflected_get.php"){ 11 $ACTIVE = array('','','','','','','','active open','','active','','','','','','','','','', 12 '','','','','','','','','','','','','','','','','','','','','','','','','','','','','','', 13 '','','','','','','','','','','','','','','','','','','','','','','','','','','','','','', 14 '','','','','','','','','','','','','','','','','','','','','','','','','','','','','','', 15 '','','','','','','','','','','','','','','','','','','','','','','','','','','','','','', 16 '','','','',''); 17 18 } 19 20 $PIKA_ROOT_DIR = "../../"; 21 include_once $PIKA_ROOT_DIR.'header.php'; 22 23 24 $html=''; 25 if(isset($_GET['submit'])){ 26 if(empty($_GET['message'])){ 27 $html.="<p class='notice'>输入'kobe'试试-_-</p>"; 28 }else{ 29 if($_GET['message']=='kobe'){ 30 $html.="<p class='notice'>愿你和{$_GET['message']}一样,永远年轻,永远热血沸腾!</p> 31 <img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />"; 32 }else{ 33 $html.="<p class='notice'>who is {$_GET['message']},i don't care!</p>"; 34 } 35 } 36 } 37 ?>
2、反射型(post)
若忘记登录密码:查看他的数据库——小皮
(点击管理——>打开)
(百度搜索此值,即可获得密码)
登陆后返回页面结果:
访问后出现弹窗表示成功;抓包制作发送页(post)
制作单独跳转页:
复制链接并访问(在代理环境下)
点击后又弹出弹窗。
3、存储型XSS
输入字符串并加入干扰项元素123:
出现弹窗并存储干扰项123:
(并且再次访问此链接还会出现弹窗)
分析源码:高危风险
1 $link=connect(); 2 $html=''; 3 if(array_key_exists("message",$_POST) && $_POST['message']!=null){ //校验POST中是否有“massage”键值 4 $message=escape($link, $_POST['message']); 5 $query="insert into message(content,time) values('$message',now())"; //将massage值写入数据库 6 $result=execute($link, $query); 7 if(mysqli_affected_rows($link)!=1){ 8 $html.="<p>数据库出现异常,提交失败!</p>";
4、DOM型XSS
输入语句:aaa'onclick="alert('xss')"
并点击,出现弹窗;点击确定跳转到一个不存在的页面。
出现一个情况:在此操作期间并没有抓到包,直到跳转到其他页面才抓到包。
解释:因为在输入语句进行传参的时候并没有给到服务器,查看源码发现造成此原因是因为DOM型默认有此语句,所以在前端就已经校验
源码分析:
1 <script> 2 function domxss(){ 3 var str = document.getElementById("text").value; //从前端直接获取 4 document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
//"<a href='aaa'onclick="alert('xss')"'>>what do you see?</a>" —— 拼凑 触发原理
5 </script>
当输入语句:<a href='aaa'onclick="alert('xss')"'>点这里~</a><a style="display:none出现:
5、DOM型XSS-X
(1)输入脚本语句 '><img src="#" onmouseover="alert('xss')">
(2)构造语句 '><img src="a" onerror="alert('xss')"> —— (会直接弹出告警)
第一种情况的运行结果:
代码分析:
<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=' '><img src="#" onmouseover="alert('xss')"></a><a'>就让往事都随风,都随风吧</a>"; } // 引入一个图片“#”,当鼠标划过的时候告警 //试试:'><img src="#" onmouseover="alert('xss')"> //试试:' onclick="alert('xss')">,闭合掉就行 </script>
结束。