草庐IT

【PyHacker编写指南】XSS检测脚本编写

巡安似海 2023-03-28 原文

这节课是巡安似海PyHacker编写指南的XSS检测脚本编写

喜欢用Python写脚本的小伙伴可以跟着一起写一写。

编写环境:Python2.x



00x1:

需要用到的模块如下:

import requests

 

00x2:

大致思路:

每次插入一个xss,判断网页内容是否存在,如果存在则输出

def req(url,xss):
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'
    }
    req = requests.get(url=url+xss,headers=headers,verify=False,timeout=3)
    print u"正在测试",url,xss
    if xss in req.content:
        print "[+]Find Xss url:%s    payload:%s"%(url,xss)

为了方便测试,我们先定义一个payload列表

xss = ["<script>alert('XSS')</script>",
       "%3Cscript%3Ealert('XSS')%3C/script%3E",
       '"><sc<script>ript>alert(/xss/)</script>',
       "<svg onload=alert(/1/)>"

]

 

00x3:

修改一下源代码,过滤script

 

ok,一切正常

 

 

00x4:

我们来运行一下,遍历xss payload

 你也可以定义一个xss.txt,进行读取,然后遍历xss fuzz

(post请求也是如此,只需要一个post请求即可)

你也可以加上 如果存在xss则退出

 

 

00x5:

代码如下:

#!/usr/bin/python
#-*- coding:utf-8 -*-
import requests
import urllib3
urllib3.disable_warnings()

def req(url,xss):
    url = url + xss
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'
    }
    req = requests.get(url,headers=headers,verify=False,timeout=3)
    print u"正在测试",url
    if xss in req.content:
        print "[+]Find Xss url:%s    payload:%s"%(url,xss)

xss = ["<script>alert('XSS')</script>",
       "%3Cscript%3Ealert('XSS')%3C/script%3E",
       '"><sc<script>ript>alert(/xss/)</script>',
       "<svg onload=alert(/1/)>"
       ]

for x in xss:

req('http://127.0.0.1/xss.php?xss_input=1',x)

 

 

00x6:

当然这只是一个最简单的模型,下面我们来进行维护加强一下

思路:

我们可以匹配网页的form标签(表单提交),然后获取请求方式,以及请求参数,模拟请求,进行fuzz

def html(url):
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'
    }
    req = requests.get(url,headers=headers,verify=False,timeout=3)
    r =r'<form.*</form>'
    form = re.findall(r,req.content,re.S)
    print form

 

接着我们去获取他的请求方式,以及请求参数


method=re.findall(r'method="(.*?)"',str(form))
print method
name = re.findall(r'name="(.*?)"', str(form))
print name

Ok,我们设置全局变量,方便调用


global method,name

 

00x7:

添加判断,自动fuzz

if method[0] == 'get' or 'GET':
    req = requests.get(url=url+"?"+name[0]+"="+xss,headers=headers,verify=False,timeout=3)
    print u"正在测试",url,xss
    if xss in req.content:
        print "[+]Find Get Xss url:%s    payload:%s"%(url,xss)
if method[0] == 'post' or 'POST':
    data={name[0]:xss}
    req = requests.post(url=url,data=data,headers=headers,verify=False,timeout=3)
    print u"正在测试",url,xss
    if xss in req.content:
        print "[+]Find Post Xss url:%s    payload:%s"%(url,xss)
我们修改为post请求来测试一下

 

 

 

00x8:

为了更人性化,我们再修改一下,导入sys模块

sys.exit() 表示退出程序

def html(url):
    global method,name
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'
    }
    req = requests.get(url,headers=headers,verify=False,timeout=3)
    r =r'<form.*</form>'
    form = re.findall(r,req.content,re.S)
    method=re.findall(r'method="(.*?)"',str(form))
    name = re.findall(r'name="(.*?)"', str(form))
    try:
        if method==None or name==None:
            sys.exit(0)
        else:
            print u"\nFind method = %s    name = %s\n"%(method[0],name[0])
    except:
        print u"\n自动分析失败!"
        sys.exit(0)

 

 


00x9:

完整代码:

#!/usr/bin/python
#-*- coding:utf-8 -*-
import requests,re,sys
import urllib3
urllib3.disable_warnings()

def req(url,xss):
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'
    }
    if method[0] == 'get' or 'GET':
        req = requests.get(url=url+"?"+name[0]+"="+xss,headers=headers,verify=False,timeout=3)
        print u"正在测试",url,xss
        if xss in req.content:
            print "[+]Find Get Xss url:%s    payload:%s"%(url,xss)
            sys.exit(1)
    if method[0] == 'post' or 'POST':
        data={name[0]:xss}
        req = requests.post(url=url,data=data,headers=headers,verify=False,timeout=3)
        print u"正在测试",url,xss
        if xss in req.content:
            print "[+]Find Post Xss url:%s    payload:%s"%(url,xss)
            sys.exit(1)

def html(url):
    global method,name
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'
    }
    req = requests.get(url,headers=headers,verify=False,timeout=3)
    r =r'<form.*</form>'
    form = re.findall(r,req.content,re.S)
    method=re.findall(r'method="(.*?)"',str(form))
    name = re.findall(r'name="(.*?)"', str(form))
    try:
        if method==None or name==None:
            sys.exit(0)
        else:
            print u"\nFind method = %s    name = %s\n"%(method[0],name[0])
    except:
        print u"\n自动分析失败!"
        sys.exit(0)


if __name__ == '__main__':
    url = raw_input('\nurl:')
    if 'http' not in url:
        url = 'http://'+url
    xss = ["<script>alert('XSS')</script>",
           "%3Cscript%3Ealert('XSS')%3C/script%3E",
           '"><sc<script>ript>alert(/xss/)</script>',
           "<svg onload=alert(/1/)>"
           ]

    html(url)
    for x in xss:
        req(url,x)

文章写到这里就结束了,但还是存在一些缺陷,比如表单有多个name,所以你需要去加载多个name,进行请求,这里就不修改了,仅抛砖引玉,希望你可以开发出自己的大项目!

 

留个关注再走叭~

 

 

 

 

有关【PyHacker编写指南】XSS检测脚本编写的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  3. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  4. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  5. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  6. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  7. ruby - 确定 ruby​​ 脚本是否已经在运行 - 2

    有没有一种简单的方法可以判断ruby​​脚本是否已经在运行,然后适本地处理它?例如:我有一个名为really_long_script.rb的脚本。我让它每5分钟运行一次。当它运行时,我想看看之前运行的是否还在运行,然后停止第二个脚本的执行。有什么想法吗? 最佳答案 ps是一种非常糟糕的方法,并且可能会出现竞争条件。传统的Unix/Linux方法是将PID写入文件(通常在/var/run中)并在启动时检查该文件是否存在。例如pid文件位于/var/run/myscript.pid然后你会在运行程序之前检查它是否存在。有一些技巧可以避免

  8. ruby - ruby 脚本可以预编译成二进制文件吗? - 2

    我正在开发一个Ruby脚本,需要在没有Ruby解释器的情况下部署到系统上。它将需要在使用ELF格式的FreeBSD系统上运行。我知道有一个ruby​​2exe项目可以编译在Windows上运行的ruby​​脚本,但是在其他操作系统上这样做容易吗?甚至可能吗? 最佳答案 您是否检查过Rubinius或JRuby是否允许您预编译您的代码? 关于ruby-ruby脚本可以预编译成二进制文件吗?,我们在StackOverflow上找到一个类似的问题: https://

  9. ruby-on-rails - 如何为空白字段编写 rspec? [Rails3.1] - 2

    我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona

  10. ruby - 检测由 RSpec、Ruby 运行的代码 - 2

    我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题

随机推荐