安全矩阵

 找回密码
 立即注册
搜索
楼主: only

曾玉芳学习日记

[复制链接]

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-3-19 16:58:12 | 显示全部楼层
本帖最后由 only 于 2020-3-19 17:20 编辑

3月19日:
Beatuiful Soup

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
一.Beatuiful soup 库安装
在命令行以管理员身份输入如下命令:
  1. pip install beautifulsoup4
复制代码
二.Beautiful Soup库解析器

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐安装。


三. 创建 Beautiful Soup 对象

首先必须要导入 bs4 库

  1. from bs4 import BeautifulSoup
复制代码
创建 beautifulsoup 对象
  1. soup = BeautifulSoup(html)
复制代码
另外,我们还可以用本地 HTML 文件来创建对象,例如
  1. soup = BeautifulSoup(open('index.html'))
复制代码
上面这句代码便是将本地 index.html 文件打开,用它来创建 soup 对象。下面我们来打印一下 soup 对象的内容,格式化输出

  1. print soup.prettify()
复制代码
注:import bs4#导入BeautifulSoup库
Soup = BeautifulSoup(html)#其中html 可以是字符串,也可以是句柄
需要注意的是,BeautifulSoup会自动检测传入文件的编码格式,然后转化为Unicode格式
通过如上两句话,BS自动把文档生成为如上图中的解析树。

四. 四大对象种类

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

  1. 1. Tag
  2. 2. NavigableString
  3. 3. BeautifulSoup
  4. 4. Comment
复制代码
(1)Tag

Tag 是什么?通俗点讲就是 HTML 中的一个个标签,例如

  1. <title>The Dormouse's story</title>
  2. <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
复制代码
上面的 title a 等等 HTML 标签加上里面包括的内容就是 Tag,下面我们来感受一下怎样用 Beautiful Soup 来方便地获取 Tags
下面每一段代码中注释部分即为运行结果
  1. print soup.title
  2. #<title>The Dormouse's story</title>

  3. print soup.head
  4. #<head><title>The Dormouse's story</title></head>

  5. print soup.a
  6. #<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>

  7. print soup.p
  8. #<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
复制代码


利用 soup加标签名轻松地获取这些标签的内容,是不是感觉比正则表达式方便多了?不过有一点是,它查找的是在所有内容中的第一个符合要求的标签,如果要查询所有的标签,我们在后面进行介绍。soup.title 得到的是title标签,soup.p 得到的是文档中的第一个p标签,要想得到所有标签,得用find_all函数。find_all 函数返回的是一个序列,可以对它进行循环,依次得到想到的东西.。
我们可以验证一下这些对象的类型
  1. print type(soup.a)
  2. #<class 'bs4.element.Tag'>
复制代码

对于 Tag,它有两个重要的属性,是 name 和 attrs
  1. name
  2. print soup.name
  3. print soup.head.name
  4. #[document]
  5. #head
复制代码

soup 对象本身比较特殊,它的 name 即为 [document],对于其他内部标签,输出的值便为标签本身的名称。
  1. attrs
  2. print soup.p.attrs
  3. #{'class': ['title'], 'name': 'dromouse'}
复制代码

在这里,我们把 p 标签的所有属性打印输出了出来,得到的类型是一个字典。如果我们想要单独获取某个属性,可以这样,例如我们获取它的 class 叫什么
  1. print soup.p['class']
  2. #['title']
复制代码

还可以这样,利用get方法,传入属性的名称,二者是等价的
  1. print soup.p.get('class')
  2. #['title']
复制代码

我们可以对这些属性和内容等等进行修改,例如
  1. soup.p['class']="newClass"
  2. print soup.p
  3. #<p class="newClass" name="dromouse"><b>The Dormouse's story</b></p>
复制代码

还可以对这个属性进行删除,例如
  1. del soup.p['class']
  2. print soup.p
  3. #<p name="dromouse"><b>The Dormouse's story</b></p>
复制代码

不过,对于修改删除的操作,不是我们的主要用途,在此不做详细介绍了,如果有需要,请查看前面提供的官方文档
  1. head = soup.find('head')
  2. #head = soup.head
  3. #head = soup.contents[0].contents[0]
  4. print head

  5. html = soup.contents[0]       # <html> ... </html>
  6. head = html.contents[0]       # <head> ... </head>
  7. body = html.contents[1]       # <body> ... </body>
复制代码

可以通过Tag.attrs访问,返回字典结构的属性。
或者Tag.name这样访问特定属性值,如果是多值属性则以列表形式返回。
(2)NavigableString
既然我们已经得到了标签的内容,那么问题来了,我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可,例如
  1. print soup.p.string
  2. #The Dormouse's story
复制代码

这样我们就轻松获取到了标签里面的内容,想想如果用正则表达式要多麻烦。它的类型是一个 NavigableString,翻译过来叫 可以遍历的字符串,不过我们最好还是称它英文名字吧。来检查一下它的类型
  1. print type(soup.p.string)
  2. #<class 'bs4.element.NavigableString'>
复制代码

(3)BeautifulSoup
BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性来感受一下
  1. print type(soup.name)
  2. #<type 'unicode'>
  3. print soup.name
  4. # [document]
  5. print soup.attrs
  6. #{} 空字典
复制代码


(4)Comment
Comment 对象是一个特殊类型的 NavigableString 对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。
我们找一个带注释的标签
  1. print soup.a
  2. print soup.a.string
  3. print type(soup.a.string)
复制代码

运行结果如下
  1. <a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>
  2. Elsie
  3. <class 'bs4.element.Comment'>
复制代码

a 标签里的内容实际上是注释,但是如果我们利用 .string 来输出它的内容,我们发现它已经把注释符号去掉了,所以这可能会给我们带来不必要的麻烦。
另外我们打印输出下它的类型,发现它是一个 Comment 类型,所以,我们在使用前最好做一下判断,判断代码如下
  1. if type(soup.a.string)==bs4.element.Comment:
  2.     print soup.a.string
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-3-24 23:21:22 | 显示全部楼层
本帖最后由 only 于 2020-3-24 23:31 编辑

3月24日:
前插法和尾插法

如何构造单链表?
链表是一个动态的结构,它不需要预分配连续的存储空间,因此生成链表的过程是一个结点“逐个插入” 的过程
前插法步骤:
从一个空表开始,反复读入数据:
(1)生成新结点;
(2)将读入的数据存放到新结点的数据域中;
(3)将该新结点插入到链表的1号位置插入。
【例】逆位序输入 n 个数据元素的值,建立带头结点的正位序单链表。
操作步骤:
1. 建立一个空表;
2. 输入数据元素an,建立结点并插入;

3. 输入数据元素an-1,建立结点并插入;

4. 依次类推,直至输入a1为止
代码如下:
  1. void CreateList(LinkList &L, int n) {      
  2. // 逆序输入 n 个数据元素,建立带头结点的单链表
  3.     int  i;     LinkList  s;
  4.     L = new  LNode;    L->next = NULL;
  5. //先建立一个带头结点的空单链表
  6.     for (i = 0; i < n; ++i) {
  7.        s = new  LNode;  // 创建结点
  8.        cin>>s->data;       // 输入数据元素值
  9.        s->next = L->next;
  10.        L->next = s;           // 插入结点
  11.     }
  12. } // CreateList_L
复制代码
尾插法步骤:
(1)从一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r始终指向链表的尾结点。
(2)初始时,r同L均指向头结点。
(3)每读入一个数据元素则申请一个新结点,将新结点插入到尾结点后,r指向新的尾结点。
代码如下:
  1. void CreateList(LinkList &L,int n){
  2.       //正位序输入n个元素的值,建立带表头结点的单链表L
  3.       L=new LNode;          L->next=NULL;        //空表
  4.       int  i;     LinkList  s;
  5.       LinkList  r=L;         //尾指针r指向头结点
  6.       for(i=0;  i<n;  ++i){
  7.         s=new LNode;                 //生成新结点
  8.         cin>>s->data;                   //输入元素值
  9.         s->next=NULL;        r->next=s;            //插入到表尾
  10.         r=s;         //r指向新的尾结点
  11.       }
  12. }//CreateList_L
复制代码



回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-3-26 00:02:47 | 显示全部楼层
本帖最后由 only 于 2020-3-26 00:05 编辑

3月26日:
scrapy


Scrapy是什么?
scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量代码,就能够快速的抓取到数据内容。Scrapy 使用了 Twisted['twɪstɪd](其主要对手是Tornado)异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。

异步与非阻塞的区别:
异步:调用在发出之后,这个调用就直接返回,不管有无结果
非阻塞:关注的是程序在等待调用结果(消息,返回值)时的状态,指在不能立刻得到结果之前,该调用不会阻塞当前线程。

scrapy详细工作流程:
1.首先Spiders(爬虫)将需要发送请求的url(requests)经ScrapyEngine(引擎)交给Scheduler(调度器)。
2.Scheduler(排序,入队)处理后,经ScrapyEngine,DownloaderMiddlewares(可选,主要有User_Agent, Proxy代理)交给Downloader。
3.Downloader向互联网发送请求,并接收下载响应(response)。将响应(response)经ScrapyEngine,SpiderMiddlewares(可选)交给Spiders。     
4.Spiders处理response,提取数据并将数据经ScrapyEngine交给ItemPipeline保存(可以是本地,可以是数据库)。
5.提取url重新经ScrapyEngine交给Scheduler进行下一个循环。直到无Url请求程序停止结束。

Scrapy主要包括了以下组件:
引擎(Scrapy): 用来处理整个系统的数据流处理, 触发事务(框架核心)
调度器(Scheduler): 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
下载器(Downloader): 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
爬虫(Spiders): 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
项目管道(Pipeline): 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
下载器中间件(Downloader Middlewares): 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
爬虫中间件(Spider Middlewares): 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
调度中间件(Scheduler Middewares): 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

Scrapy运行流程大概如下:
首先,引擎从调度器中取出一个链接(URL)用于接下来的抓取
引擎把URL封装成一个请求(Request)传给下载器,下载器把资源下载下来,并封装成应答包(Response)
然后,爬虫解析Response
若是解析出实体(Item),则交给实体管道进行进一步的处理。
若是解析出的是链接(URL),则把URL交给Scheduler等待抓取




回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-3-26 21:04:14 | 显示全部楼层
本帖最后由 only 于 2020-3-26 21:52 编辑

3月26日
python操作MySQL数据库

在我们的日常生活中经常需要对一些数据进行处理,而python也可以连接数据库,今天我主要学习一些python MySQL数据库的一些语法

安装 MySQL 驱动程序
Python 需要 MySQL 驱动程序来访问 MySQL 数据库。我们将使用驱动程序 MySQL Connector,执行如下语句安装:
  1. python -m pip install mysql-connector
复制代码
如果我们要测试是否安装成功,则可以通过在python代码中导入MySQL connector

  1. import mysql.connector
复制代码
若代码没有报错则安装成功

创建连接
首先创建与数据库的连接。
使用 MySQL 数据库中的用户名和密码:
  1. import mysql.connector

  2. mydb = mysql.connector.connect(
  3.   host="localhost",
  4.   user="myusername",
  5.   passwd="mypassword"
  6. )
  7. print(mydb)
复制代码
创建数据库
要在 MongoDB 中创建数据库,首先要创建 MongoClient 对象,然后使用正确的 IP 地址和要创建的数据库的名称指定连接 URL。如果数据库不存在,MongoDB 将创建数据库并建立连接。
实例:
创建名为 "mydatabase" 的数据库:

  1. import pymongo
  2. myclient = pymongo.MongoClient("mongodb://localhost:27017/")
  3. mydb = myclient["mydatabase"]
复制代码
重要说明:在 MongoDB 中,数据库在获取内容之前不会创建!
在实际创建数据库(和集合)之前,MongoDB 会一直等待您创建至少有一个文档(记录)的集合(表)。

接下来我们检查数据库是否存在
  1. import pymongo
  2. myclient = pymongo.MongoClient('mongodb://localhost:27017/')
  3. print(myclient.list_database_names())
复制代码

这样说明创建成功!
也可以按名称检查特定数据库:
  1. import pymongo
  2. myclient = pymongo.MongoClient('mongodb://localhost:27017/')
  3. dblist = myclient.list_database_names()
  4. if "mydatabase" in dblist:
  5.   print("The database exists.")
复制代码

这样也说明数据库存在
创建表
如需在 MySQL 中创建表,请使用 "CREATE TABLE" 语句。,我们要确保在创建连接时定义数据库的名称。
实例:
创建表 "customers":
  1. import mysql.connector
  2. mydb = mysql.connector.connect(
  3.   host="localhost",
  4.   user="yourusername",
  5.   passwd="yourpassword",
  6.   database="mydatabase"
  7. )
  8. mycursor = mydb.cursor()
  9. mycursor.execute("CREATE TABLE customers (name VARCHAR(255), address VARCHAR(255))")
复制代码
我们可以通过show database查看表是否存在

  1. import mysql.connector
  2. mydb = mysql.connector.connect(
  3.   host="localhost",
  4.   user="myusername",
  5.   passwd="mypassword",
  6.   database="mydatabase"
  7. )
  8. mycursor = mydb.cursor()
  9. mycursor.execute("SHOW TABLES")
  10. for x in mycursor:
  11.      print(x)
复制代码

这样我们可以看到,表已经创建成功!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-3-29 23:20:06 | 显示全部楼层
本帖最后由 only 于 2020-3-29 23:38 编辑

3月29日:
利用selenium实现自动模拟化登录QQ
如果我们要爬取QQ空间之类的页面信息的话,大多都要进行登录,研究QQ登录规则的话,得分析大量Javascript的加密解密,这个工程量是特别大的,但是有个工具帮我们很好的解决了这个问题——selenium,那么selenium到底是什么呢?
0×01selenium简介
Selenium是一个用于Web应用的功能自动化测试工具,Selenium 直接运行在浏览器中,就像真正的用户在操作一样。
由于这个性质,Selenium也是一个强大的网络数据采集工具,其可以让浏览器自动加载页面,获取需要的数据,甚至页面截图,或者是判断网站上某些动作是否发生。
Selenium自己不带浏览器,需要配合第三方浏览器来使用。支持的浏览器有Chrome、Firefox、IE、Phantomjs等。如果使用Chrome、FireFox或IE,我们可以看得到一个浏览器的窗口被打开、打开网站、然后执行代码中的操作。
0×02 selenium的安装
我们的python环境很早就已经配置好了,只需要在命令行输入
pip install selenium
如下图所示便是安装完成
其中我们有一个一定不能忘记,下载浏览器驱动
我用的是chrome浏览器
chrome的驱动可以在这个下载地址中下载:http://chromedriver.storage.googleapis.com/index.html
为了验证是否安装成功,我们先模拟打开百度测试:
  1. from selenium import webdriver
  2. from time import sleep
  3. # 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的
  4. driver = webdriver.Chrome(r'driver/chromedriver')
  5. # 用get打开百度页面
  6. driver.get("http://www.baidu.com")
  7. # 输入内容
  8. driver.find_element_by_id('kw').send_keys('ecjtu')
  9. # 点击 百度一下
  10. driver.find_element_by_id('su').click()
  11. # 暂停10秒
  12. sleep(10)
  13. # 关闭浏览器
  14. driver.quit()
复制代码

执行以上代码后,我们可以看见一个模拟浏览器小窗口,自动打开百度开始搜索“ecjtu”
同时也说明selenium安装成功
0×03 selenium实现QQ空间的登录
首先,我们要做的是检查QQ空间页面中的元素:例如账号框、密码框和登录按钮的id,才能确定代码要实现的功能,我们通过http://i.qq.com打开QQ空间网页
我们通过f12键打开控制台,来找到我们需要的id
用相同的方法我们可以找到其他id,接下来要做的就是代码实现
  1. import time
  2. # 导入selenium中的webdriver库
  3. from selenium import webdriver

  4. # 实例化出一个浏览器
  5. driver = webdriver.Chrome(r'driver/chromedriver')
  6. # 设置浏览器窗口的位置
  7. driver.set_window_position(20, 40)
  8. # 设置浏览器窗口的大小
  9. driver.set_window_size(1100, 700)
  10. # 访问QQ空间网页
  11. driver.get("http://i.qq.com")
  12. # 切换框架
  13. driver.switch_to.frame("login_frame")
  14. # 根据查看的id进行鼠标点击操作
  15. driver.find_element_by_id("switcher_plogin").click()
  16. # 睡眠1秒
  17. time.sleep(1)
  18. # 选择账号输入框并将其内容清空
  19. driver.find_element_by_id('u').clear()
  20. # 选择账号输入框并将QQ号模拟键盘输入到账号输入框
  21. driver.find_element_by_id('u').send_keys('369619498')
  22. time.sleep(2)
  23. driver.find_element_by_id('p').clear()
  24. # 密码
  25. driver.find_element_by_id('p').send_keys('密码')
  26. time.sleep(1)
  27. # 选择登录按钮出发鼠标点击事件
  28. driver.find_element_by_id('login_button').click()
  29. time.sleep(15)
  30. # 退出
  31. driver.quit()
复制代码
执行以上代码后,我们便可以看见有一个小窗口已经模拟化登录成功进入对应QQ空间了,而如果我们要爬取一些QQ好友的说说也可以从这而展开

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-3-30 23:09:40 | 显示全部楼层
本帖最后由 only 于 2020-3-30 23:20 编辑

3月30日:今天复习了burp suite的第一个模块Proxy,并借鉴公众号对其知识点进行总结
BurpSuite----Proxy模块(代理模块)
一、简介
Proxy代理模块作为BurpSuite的核心功能,拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,修改在两个方向上的原始数据流。
Burp 代理允许你通过监视和操纵应用程序传输的关键参数和其他数据来查找和探索应用程序的漏洞。通过以恶意的方式修改浏览器的请求,Burp 代理可以用来进行攻击,如:SQL 注入,cookie 欺骗,提升权限,会话劫持,目录遍历,缓冲区溢出。拦截的传输可以被修改成原始文本,也可以是包含参数或者消息头的表格,也可以十六进制形式,甚至可以操纵二进制形式的数据。在 Burp 代理可以呈现出包含 HTML 或者图像数据的响应消息。
二、模块说明
1.Intercept
用于显示和修改HTTP请求和响应,通过你的浏览器和Web服务器之间。在BurpProxy的选项中,您可以配置拦截规则来确定请求是什么和响应被拦截(例如,范围内的项目,与特定文件扩展名,项目要求与参数,等)。该面板还包含以下控制:

消息类型显示的四种格式

Action的一些操作功能

2.HTTP History
这个选项是来显示所有请求产生的细节,显示的有目标服务器和端口,HTTP 方法,URL,以及请求中是否包含参数或被人工修改,HTTP 的响应状态码,响应字节大小,响应的 MIME类型,请求资源的文件类型,HTML 页面的标题,是否使用 SSL,远程 IP 地址,服务器设置的 cookies,请求的时间。

双击某个请求即可打开详情,通过Previous/next可以快速切换请求,并且Action也可以将请求发送至其他模块

可以通过最左边的列里的下拉菜单来加亮单个选项:

在历史记录表里,右击一个或多个选项,就会显示一个上下文菜单让你执行一些操作,包括修改目标范围,把这些选项发送到其他 Burp 工具,或者删除这些项:

还可以通过配置过滤器来确定哪些顶层的数据项显示在表格里。有效应用程序包含了大量的内容,如图像,CSS 等,这些有利于从视图上隐藏的。AJAX 应用程序产生大量相似的异步请求,你可能会想把他们从视图上过滤出来来查看一些感兴趣的项。在这个历史记录表的顶部有一个过滤栏。单击会有一个弹出窗口,让你来精准地配置显示哪些内容在表格里:

3.WebSockets history
这个选项主要用于记录WebSockets的数据包,是HTML5中最强大的通信功能,定义了一个全双工的通信信道,只需Web上的一个 Socket即可进行通信,能减少不必要的网络流量并降低网络延迟。

4.Options
该选项主要用于设置代理监听、请求和响应,拦截反应,匹配和替换,ssl等,其中有八大选项roxy Listeners、Intercept Client Requests、Intercept Server Responses、Intercept WebSockets Messages、Response Modification、Match and replace、SSL Pass Through、Miscellaneous
选项1:Proxy Listeners

代理侦听器是侦听从您的浏览器传入的连接本地HTTP代理服务器。它允许您监视和拦截所有的请求和响应,并且位于BurpProxy的工作流的心脏。默认情况下,Burp默认监听12.0.0.1地址,端口8080。要使用这个监听器,你需要配置你的浏览器使用127.0.0.1:8080作为代理服务器。此默认监听器是必需的测试几乎所有的基于浏览器的所有Web应用程序。
1.add:添加一个新的代理地址。
   1.binding:新建一个代理,bind to port-绑定端口号 ,bind to address -绑定ip地址

2.request hadning:这些设置包括选项来控制是否BurpSuite重定向通过此侦听器接收到的请求:
            2.1.Redirect to host - 如果配置了这个选项,Burp会在每次请求转发到指定的主机,而不必受限于览器所请求的目标。需要注意的是,如果你正使用该选项,则可能需要配置匹配/替换规则重写的主机中的请求,如果服务器中,您重定向请求预期,不同于由浏览器发送一个主机头。
            2.2.Redirect to port - 如果配置了这个选项,Burp会在每次请求转发到指定的端口,而不必受限于浏览
            2.3.Force use of SSL - 如果配置了这个选项,Burp会使用HTTPS在所有向外的连接,即使传入的请求中使用普通的HTTP。您可以使用此选项,在与SSL相关的响应修改选项结合,开展sslstrip般的攻击使用Burp,其中,强制执行HTTPS的应用程序可以降级为普通的HTTP的受害用户的流量在不知不觉中通过BurpProxy代理。

3.Certificate:这些设置控制呈现给客户端的SSL服务器的SSL证书。
3.1.Generate CA-signed per-host certificate-这是默认选项。安装后,BurpSuite创造了一个独特的自签名的证书颁发机构(CA)证书,并将此计算机上使用,每次BurpSuite运行。当你的浏览器发出SSL连接到指定的主机,Burp产生该主机,通过CA证书签名的SSL证书。您可以安装BurpSuite的CA证书作为在浏览器中受信任的根,从而使每个主机的证书被接受,没有任何警报。您还可以导出其他工具或Burp的其他实例使用CA证书。
3.2.Generate a CA-signed certificate with a specific hostname---||这类似于前面的选项;然而,Burp会产生一个单一的主机证书与每一个SSL连接使用,使用您指定的主机名。在进行无形的代理时,此选项有时是必要的,因为客户端没有发送连接请求,因此Burp不能确定SSL协议所需的主机名。你也可以安装BurpSuite的CA证书作为受信任的根。
3.3.Use a custom certificate---||-此选项使您可以加载一个特定的证书(在PKCS#12格式)呈现给你的浏览器。如果应用程序使用它需要特定的服务器证书(例如一个给定序列号或证书链)的客户端应该使用这个选项。

2.edit:编辑选中的代理地址。
3.remove:删除选中代理地址。
选项2:Intercept Client Requests
配置拦截规则,设置拦截的匹配规则。 当Intercept request based on the following rules为选中状态时,burpsuite会配置列表中的规则进行拦截或转发。
注意:如果该复选框未选中,那么即使Intercept is on也无法截取数据包。
规则可以通过Enabled列中的复选框选择开启或关闭。
规则可以是域名, IP地址,协议, HTTP方法, URL,文件扩展名,参数,cookie ,头/主体内容,状态代码,MIME类型, HTML页面标题等。
规则按顺序处理,并且使用布尔运算符AND和OR组合。
选项3:Intercept Server Responses
配置拦截规则,设置拦截的匹配规则,不过这个选项是基于服务端拦截,当选小的Intercept request based on the following rules为选中状态时,burpsuite会匹配响应包。
选项4:Intercept WebSockets Messages
选项5:Response Modification

选项6:Match and replace
用于自动替换请求和响应通过代理的部分。对于每一个HTTP消息,已启用的匹配和替换规则依次执行,选择适用的规则进行匹配执行。
规则可以分别被定义为请求和响应,对于消息头和身体,并且还特别为只请求的第一行。每个规则可以指定一个文字字符串或正则表达式来匹配,和一个字符串来替换它。对于邮件头,如果匹配条件,整个头和替换字符串匹配留空,然后头被删除。如果指定一个空的匹配表达式,然后替换字符串将被添加为一个新的头。有可协助常见任务的各种缺省规则 - 这些都是默认为禁用。 匹配多行区域。您可以使用标准的正则表达式语法来匹配邮件正文的多行区域。
选项7:SSL Pass Through

选项8:Miscellaneous




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-3-31 23:09:27 | 显示全部楼层
本帖最后由 only 于 2020-3-31 23:13 编辑

3月31日:
ctf小练之隐写题

看到社区上传了那么多ctf赛题后,我已经跃跃欲试了,零基础入门从较为简单的隐写题开始,首先我先准备了几个需要用到的软件:Stegsolve和notepad++
第一题为下雨天,题目为一张图片

原谅我看到题目的时候只知道是一道隐写题缺不晓得如何下手,没关系,跟着writeup慢慢学
我们将图片保存之后,用notepad++打开


我们可以看出图片的格式不为jpg而是GIF,于是在更改图片格式后,我用stegsolve打开
接着用Frame Browser对图片进行分解,得到flag!


第二题为女神,题目内容为女神的头发里好像有东西!还附有一张图片


notepad++打开在最下面发现flag

总结:对于一些图片隐写类的ctf题,我们要善于利用工具,可以通过notepad对其转化从而获取flag!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-1 20:06:17 | 显示全部楼层
本帖最后由 only 于 2020-4-1 20:34 编辑

4月1日:
初识web安全

今天开始正式学习web安全相关的知识,在学习开始之前,我们得先对web有一个了解,那么什么是web呢?经过百度,给出了如下解释:
web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。
web的运行结构大概是:我们通过在浏览器中输入url链接,浏览器向服务器发送一个request请求,之后服务器再对请求做出反应向浏览器发送一个response。当然,有时候我们会需要用到数据库,于是我们多了一个流程,服务器向数据库发送执行语句,之后数据库再返回结果到服务器上。

而一次完整的网页请求大概包括以下几个方面:
1.浏览器输入url如 www.baiduc.om
2.域名解析获得该域名IP地址(DNS解析原理)
3.与该域名建立TCP连接通过三次握手(三次握手原理)
4.封装HTTP请求,向服务器发起HTTP请求(request)
5.服务器获取HTTP请求中相应资源
6.资源获取完成后web服务器做出应答(response),浏览器获得服务器返回html(什么是html)
7.断开TCP连接通过四次握手(四次握手原理)
8.浏览器渲染呈现给用户
其中,三个握手原理流程大概如下图所示:

每次握手(发送数据请求或应答)时,发送的数据为TCP报文,TCP段包含了源/目的地址,端口号,初始序号,滑动窗口大小,窗口 扩大因子,最大报文段长度等。还有一些标志位:
(1)SYN:同步序号
(2)ACK:应答回复
(3)RST:复位连接,消除旧有的同步序号
(4)PSH:尽可能的将数据送往接收进程
(5)FIN:发送方完成数据发送
(6)URG
从图中,可以看出三次握手的基本步骤是:
第一次握手:客户端向服务器端发送连接请求包SYN(syn=j),等待服务器回应;
第二次握手:服务器端收到客户端连接请求包SYN(syn=j)后,将客户端的请求包SYN(syn=j)放入到自己的未连接队列,此时服务器需要发送两个包给客户端;
  (1)向客户端发送确认自己收到其连接请求的确认包ACK(ack=j+1),向客户端表明已知道了其连接请求
  (2)向客户端发送连接询问请求包SYN(syn=k),询问客户端是否已经准备好建立连接,进行数据通信;
  即在第二次握手时服务器向客户端发送ACK(ack=j+1)和SYN(syn=k)包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的ACK(ack=j+1)和SYN(syn=k)包后,知道了服务器同意建立连接,此时需要发送连接已建立的消息给服务器;
  向服务器发送连接建立的确认包ACK(ack=k+1),回应服务器的SYN(syn=k)告诉服务器,我们之间已经建立了连接,可以进行数据通信。
  ACK(ack=k+1)包发送完毕,服务器收到后,此时服务器与客户端进入ESTABLISHED状态,开始进行数据传送

(我对三次握手虽然有个大概的了解了,但是理解不是很深入)

接下来来了解一下什么是HTTP协议:
HTTP协议既超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。它是一个客户端和服务器端请求和应答的标准(TCP)
HTTP协议是基于TCP协议的应用层协议,而TCP/IP协议分为4层分别是链路层,网络层,传输层,应用层
  1. Network interfacae为链路层:传输方式数据帧
  2. ARP,IP,RARP等为网络层:传输方式数据包
  3. TCP,UDP,ICMP等为传输层:传输方式数据段
  4. HTTP,FTP,SNMP等为应用层:传输方式数据流
复制代码
HTTP请求报文:
请求方法大概有:GET,POST,HEAD,PUT,DELETE,OPTIONS,TRACE,CONNECT
  1. GET: 向特定资源发出请求(请求指定页面信息,并返回实体主体)
  2. POST:向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建立或原有资源的修改
  3. HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
  4. PUT:从客户端向服务器传送的数据取代指定的文档的内容
  5. DELETE:请求服务器删除指定的页面
  6. OPTIONS:允许客户端查看服务器的性能
  7. TRACE:回显服务器收到的请求,主要用于测试或诊断
  8. CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
复制代码
注:区别POST和GET:GET请求时参数可以在URL中获取如GET /test.php?id=1&username=xxx,而POST请求传输过程中数据是在data域,在URL中无法获取
请求头:
  1. Host:请求的服务器域名地址或IP地址
  2. User-Agent:向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识
  3. Accept:表示浏览器端可以接受的媒体类型
  4. Accept-Language:浏览器申明自己接收的语言
  5. Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)
  6. Referer:代表请求来自哪个页面
  7. Content-Type:代表客户端发送的实体数据的数据类型(如:text/html : HTML格式等)更多类型
  8. Content-Length:发送给HTTP服务器数据的长度
  9. Cookie:最重要的header, 将cookie的值发送给HTTP 服务器
  10. Connection:keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
  11. close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接
复制代码
HTTP响应报文:
状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类如下所示:
  1. 1xx:表示服务器已接收了客户端请求,客户端可继续发送请求;
  2. 2xx:表示服务器已成功接收到请求并进行处理;
  3. 3xx:表示服务器要求客户端重定向;
  4. 4xx:表示客户端的请求有非法内容;
  5. 5xx:表示服务器未能正常处理客户端的请求而出现意外错误;
复制代码
常用的状态码和状态消息
  1. 200 OK #客户端请求成功
  2.     400 Bad Request #客户端请求有语法错误,不能被服务器所理解
  3.     401 Unauthorized #请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
  4.     403 Forbidden #服务器收到请求,但是拒绝提供服务
  5.     404 Not Found #请求资源不存在
  6.     500 Internal Server Error #服务器发生不可预期的错误
  7.     503 Server Unavailable #服务器当前不能处理客户端的请求,一段时间后可能恢复正常
复制代码
响应头:
  1. Cache-Control:指定了请求和响应遵循的缓存机制
  2. Content-Type:服务器向客户端返回内容类型,类型与请求头相同
  3. Vary:告诉缓存服务器使用什么判断一个请求的资源是fresh还是stale的
  4. Server:服务器处理请求的软件版本
  5. X-AspNet-Version:这个是服务器使用的.NET版本信息
  6. Set-Cookie:服务器设置客户端的cookie值
  7. X-Powered-By:网站是用何种语言或框架编写的,这里是ASP.NET
  8. Date:时间
  9. Connection:连接状态与请求报文相同
  10. Content-Length:长度
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-2 23:26:54 | 显示全部楼层
本帖最后由 only 于 2020-4-4 22:07 编辑

4月2日:

今天主要学习了和爆破相关的知识,主要借助了一个叫“皮卡丘”的靶场来完成,首先我们要准备好的环境是xampp+burpsuite,然后成功安装好我们所需要的”皮卡丘“,下载地址为:https://github.com/zhuifengshaonianhanlu/pikachu.
首先,第一个是表单爆破,在之前的学习中我已经接触到了这个,操作起来也十分简单,只需要用bp抓包导入字典即可爆破。
但是今天,我居然第一个爆破就栽了,一个很神奇的事情发生了,我的bp居然抓不到包???
我尝试用bp先抓其他包试试看

明明可以啊,问题出在哪了呢?
经过一次又一次的尝试,结果一次又一次的失败,我觉得操作很明显没问题,于是查找资料发现一个我一直都不知道的问题,我用bp抓本地的包,一般是会出问题的
127.0.0.1是本地回环地址,有时候抓这个地址的包会有问题,所以我们应该使用另外一个地址,网卡地址192.168.xx.xx,在修改了地址之后,终于我成功抓到了这个包,导入字典便爆破了
第二个是验证码绕过(on-client)问题
首先我们得先判断是否可以爆破,当我输入任意用户名和验证码并点击login时发现:

显示输入验证码,于是我输入正确的验证码后发现

显示用户名或密码不存在,于是我们知道这显然可以爆破
当我查看页面源码时,我发现了一个问题

这个验证码是写在一段js代码中的前端代码,为了验证该验证码是否有效,我们先抓取这个包放到repeater里面跑再跑一次

我们可以看到将验证码修改之后,重新跑一边,回显居然也是用户名或密码不存在,可见,该验证码为无效验证码
于是我对抓到的包开始爆破,导入字典后,爆破成功!
小结:
1.当我们要抓取本地的包时,不要忘记讲地址改为196*****
2.当验证码写在前端代码里时是无效的,因此,一般的验证码都会写在PHP代码里面


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-3 21:50:54 | 显示全部楼层
本帖最后由 only 于 2020-4-4 22:07 编辑

4月3日:
今天的学习任务主要是继续学习暴力破解,我们知道,如果将验证码写在了前端代码里面,一般我们是可以绕过验证码,对其进行爆破的,但其实很多写在后端的验证码也是不安全的。

常见的不安全验证码问题一般有:
1.验证码在后台不过期,导致可以被长期使用
2.验证码的校验不严格,逻辑出现问题
3.验证码的设计太过简单和有规律,容易被猜解
上面说的三种情况,一般也是我们可以爆破的

今天主要通过一个实例对这个有一个更深的理解,

和昨天一样,输入任意的用户名和密码,并输入正确的验证码后我们对其进行抓包,并把抓到的包放到repeater里面跑
首先我们修改验证码来判断验证码是不是被写在后台

我们可以发现,输入错误验证码后,后台回显“验证码输入错误”,由此可见,的确是一段后端代码,接下来我们来判断该验证码是否可以长期使用

我们可以发现,当我将密码修改之后,并输入正确验证码,显示都是“用户名或密码不存在”,很显然,该验证码可以被重复使用,于是我们可以直接进行爆破,爆破成功!
那么我们应该如何放爆破呢?
其实很显然,就是使用验证码,而且应该是一个安全的验证码。
而其中有一个问题,在很多开发人员看来,token是可以防爆破的,那么到底可不可以防爆破呢?
他们一般的做法是:将token以“type=‘ hidden’ ”的形式输出在表单中,在提交认证的时候一起提交,并在后台对其进行校验
我利用皮卡丘平台的token对其进行验证首先打开控制台

可以在我们提交的form表单模块可以看见有一个隐藏的token标签,而后面的一串数字,也就是session每次都会变更,他的作用就是当我们每次提交账号密码时后台会对账号密码和这个session一起进行验证
在外面查看源码后,我们知道,token方法其实是无效的,因为每次生成的session其实都可以在我们html的form表单中可以查看到的,所以攻击者只需要写一个工具在每次提交认证之前,获取session的值并填入字典里,就还是可以通过爆破来实现登录


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 02:39 , Processed in 0.022150 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表