LXSS开发笔记

项目地址:https://github.com/zxyxx/L-XSS.git 一个XSS平台


前期工作

选型:

python Django 前端用 Vue.js

无数据库模式[待商榷,可能用sqlite也行],接收数据json加密存储在文件中,payload和prob考虑直接明文存储

功能:

双页面 / 和 /auth

/只处理XSS的接受,/auth处理所有逻辑

/根目录

记录访问到根目录的所有请求的url,参数,header,location.hash,json格式化后加密存储在文件中,

以下都是/auth页面的面板

xss receiver

显示面板,读取文件后用表格显示,单击可以弹出卡片,用可展开的表格代替

encode/decode

参考 xss’or 和 ph 师傅的 playground,主要是url编码和全编码,base64编码解码,hex编码解码,\u和&#格式的16进制,string.fromcharcode编码,JS美化(可选),哈希,UTF-7

probe

参考 xss’o r的 codz 和probe,我更倾向于说这是一个控制台,用于生成、管理payload

codz用来生成一些JS模版操作,probe用来在本地生成一个js文件可以直接调用,以及经常使用的小片段cheatsheet

具体来说:

  1. 自表单模板,包括 html 的表单和用 JS 动态生成的表单

需要考虑的功能:

  • [ ] CSP 相关
  • [ ] SOME 相关
  • [ ] JS payload fuzzer

难弄的地方:Vue 和 Django 只能通过 ajax 通讯,导致这里的 paylaod 可能需要一直用 ajax,是否会存在风险?

xss’or 是直接把 csrf 的 payload 放在 JS 里的

about

Make XSS Great Again !

开发中笔记

Vue如何和django整合

有很多文章有写

如何判断是否有新纪录插入?

用类似 xss 平台的 id_list,setInterval 一个 ajax,判断是否有新的id出现

关于登陆的问题

是通过django处理还是vue处理?

django可以通过middleware判断是否登陆,但是如果没登陆那么应该进入登陆页面,那么问题来了,登陆页面由谁处理?

http://www.iteye.com/topic/168930

登陆页面单独由django渲染

用缓存保存session

vue提交表单怎么加入django的 csrftoken

无解,只能换一种防御方法

判断referer

还是用middleware处理,判断referer只能是同源

如何判断referer是否同源:

参考防范ssrf的方法,urlparse hostname

配色

原字体颜色:#4b2354 按钮颜色:#bd59d4

主题黄色:#ffd04b

axios

axios默认发送json格式的请求,需要用 qs 使得content-type为from html

axios和qs的使用:

qs:

axios:

JSON.stringify

有两个可选参数,第二个是一个filter,第三个是格式化空格符

数据绑定

存储在 vuex 中 state 里的数据不能动态绑定

encode/decode 面板如何固定中间按钮的宽度

现在 encode/decode 面板是分三栏,左右一个输入框一个输出框,中间一个按钮组

在屏幕较小的浏览器下,中间的按钮组出现排布乱的问题,最好的方法是固定中间按钮组的宽度

需要固定中间按钮组的宽度为390px,而左右两栏自适应

一篇讲响应式和自适应区别的文章:https://juejin.im/entry/58b6414a128fe1006421bfa7

一个简单的方法,直接设置el-col的min-width

删除选中行

需要在删除选中行后在表格中去除这一行,这样需要获得这一行的index,但是elementui提供的api里貌似没有在表格外拿到选中行的index的方法

所以用以下:

然后删除的函数:

前端密码加密

关于密码前端hash一次有没有意义的问题

我这里是用了前端加盐hash,每次访问 /auth 生成一个随机盐,打印到到页面的一个DOM节点并存储在session中,前端 JS 获取 DOM 节点中的盐并用其加密,用户提交 post 的密码便是加了盐了 hash ,交由后端用 session 中的盐加密了的 hash 比对,这样的话,即使前端加密的 hash 暴露了,也不会导致什么危害

这样做的意义是,防止中间人重放攻击,尽可能保护用户密码安全,而不仅仅是保证网站的安全性

前端加密一个重要的地方是,不要让前端的加密影响到后端的安全等级设计,不要因为前端加密了一次就让后端的安全等级下降

当然,https 是一个最终解决方案

probe面板

保留了xss’or里的csrf功能,同时增加template功能,更容易操控probe的内容

组件里导入自己写的js

python 处理列表中函数的问题:

最开始用

来处理不同的命令,但是这样处理会有问题

以上会返回:

猜测是在定义cmd_list的时候就执行了函数,在cmd_list和print之间加入一个time.sleep证明了猜测,奇怪的是,他先打印出

sleep过后才打印出

额,这个None是func_1的返回值,所以他是先执行一遍所有的函数,最后get的时候再执行一遍

emmmm,所以不能用这种方法来判断cmd了

href和src的动态绑定

https://blog.csdn.net/wang1006008051/article/details/77885643

安装和部署

如果用nginx反代理:

如果需要install,可能需要一个middleware来判断是否存在install文件,在install之后删除这个middleware

部署

删除vue-cli建立的项目中.gitignore中的dist

删除了/usr/bin中的uwsgi,但是pip install出错,缺少python3-dev,需要apt install

但是重新pip安装以后/usr/bin中还是没有uwsgi ???

用尼玛的uwsgi

还是用之前用过的gunicorn把

setting中的referer:

aaaaa.example.com

静态文件404 nginx:

我的目录在 /home/wwwroot/aaaaa.example.com/L-XSS/frontend/dist/static/

比如我想访问/static/js/1.js,就会访问到/home/wwwroot/aaaaa.example.com/L-XSS/frontend/dist/static/js/1.js

cookie无法拿到data

需要在nginx中设:

好像不是nginx的问题,是gunicorn的问题…

暂时用nohup直接挂python了:

TODO

  • [x] linux和windows对读取文件顺序有差异,需要读取后根据时间戳排序
  • [x] probe全版面的设计和开发
  • [x] 密码加密,需要给一个随机数给前端配合密码hash,后端直接比对hash,存储的是密码的hash
  • [ ] 数据加密?是否需要?暂时不考虑
  • [ ] gunicorn代理无法维持cookie,需要继续研究
  • [x] encode面板在尺寸小的显示器上中间的按钮区域宽度会缩小,需要固定宽度
  • [ ] 考虑是否需要用 bcrypt 代替 md5
  • [x] 思考如何存放和代理静态文件