PyxYuYu/MyBlog

Python学习记录(三):正则表达式&网络爬虫

PyxYuYu opened this issue · 0 comments

Every blessing ignored becomes a curse.

0x01 Wooyun

  • Java 反序列化命令执行
    • CMD 命令
      • whoami
    • arp -a
    • net view
    • cmd /c dir D:\
    • weblogic 反序列化(Linux 下)
      • 利用 Zenmap 工具扫描,发现部署的 weblogic
    • CMD 命令
      • whoami
      • ifconfig
  • 任意文件遍历
    • SSRF
      • //newscrawl/newscrawl/pic.do?picPath=file://///etc/hosts 可进行文件读取
  • Struts2 漏洞
  • CSRF
  • XSS
  • 弱口令
    • weblogic / 12345678
  • 商城支付系统
    • 购物信息会生成一个md5签名信息,提交付款处抓包修改支付价格支付后,会生成一个新的支付md5信息,两个签名信息不同,服务端的购物状态是不会改变的
0x02 正则表达式

  • 正则表达式只能匹配字符串,不能匹配整个数(如12344),所以只能匹配 0-9 这些字符
  • \b 元字符,代表单词的开头或结尾,也就是单词的分界处,不匹配空格,标点符号或换行,只匹配一个位置,即单词边界,单词是被定义为 Unidcode 的字母数字或下划线字符,即包裹一个独立的整个单词
    • \bpyx\b 可以匹配 sss pyx ss中的 pyx,无法匹配 sss pyxss
  • . 元字符,匹配除了换行符(\nASCII 编码为 10,十六进制 0x0A)以外的任意字符,注:通过设置 re.DOTALL 可以使 . 匹配任何字符(包括换行符)
  • * 元字符,代表的不是字符,不是位置,而是数量,匹配前面的子表达式零次或多次,等价{0,}
    • .* 代表任意数量的不包含换行的字符,包括0个
  • \d 元字符,匹配数字
    • 对于 Unicode ( str 类型)模式:匹配任何一个数字,包括[0-9]和其他数字字符,如果开启了re.ASCII,就只匹配[0-9]
    • 对于8位(bytes 类型)模式:匹配[0-9]中任何一个数字
    • P.s.补充说明 UnicodeUTF-8 的区别
  • - 匹配它本身 -- 连字符
  • \w 元字符,匹配字母、数字、下划线或汉字
    • 对于 Unicode ( str 类型)模式:匹配任何 Unicode的单词字符,基本上所有语言的字符都可以匹配,当然也包括数字额下划线,如果开启了re.ASCII,就只匹配[a-zA-Z0-9]
    • 对于8位(bytes 类型)模式:匹配ASCII中定义的字母数字,即[a-zA-Z0-9]
  • \s 元字符,匹配任意的空白符
    • 对于 Unicode ( str 类型)模式:匹配 Unicode 的空白字符(包括[\t\n\r\f\v]以及其他空白字符),如果开启了 re.ASCII,就只匹配[\t\n\r\f\v]
    • 对于8位(bytes 类型)模式:匹配ASCII中定义的空白字符,即[\t\n\r\f\v]
  • ^ 元字符,匹配字符串的开始
    • (脱字符)匹配输入字符串的开始位置
    • 如果设置了re.MULTILINE,也可以匹配换行符之后的位置
  • $ 元字符,匹配字符串的结束
    • 如果设置了re.MULTILINE,也可以匹配换行符之前的位置
  • 字符转义:如果查找元字符本身的话,需要用 \ 来进行转义
  • 重复:
    • * 匹配前面的子表达式零次或多次,等价与{0,}
    • + 匹配前面的子表达式一次或多次,等价与{1,}
    • ? 匹配前面的子表达式零次或一次,等价于{0,1}
    • {n} 匹配前面的子表达式n次
    • {n,} 匹配前面的子表达式n次或更多次
    • {n,m} 匹配前面的子表达式n到m次,其中n <= m
  • [...] 字符类,匹配所包含的任意一个字符,[- ]表示连字符或者空格,需要转义的元字符,比如\*也可以用[*]表示
    • 注1:连字符 - 如果出现在字符串中间表示字符范围描述,如果出现在首位则仅作为普通字符
    • 注2:特殊字符仅有反斜杠\保存特殊含义,用于转义字符,其他特殊字符如 *+ 等都作为普通字符匹配
    • 注3:脱字符 ^ 如果出现在首位表示匹配不包含其中的任意字符,如果出现在字符串中间仅作为普通字符匹配
  • | 分枝条件,将不同的规则分隔开,表示匹配正则表达式左边一个或者右边一个,总是先匹配左边的表达式,一旦匹配成功则跳过匹配右边的表达式。如果|没有被包括在()中,则它的范围是整个正则表达式
  • (...) 匹配圆括号中的正则表达式,或者指定一个子组(子表达式)的开始和结束位置,也就是分组,可以利用(...){n}指定这个子表达式的重复n次。
    • 注:子组的内容可以在匹配之后被 \数字 再次引用
  • 反义:查找除了这些以外的任意字符的情况
    • \W 匹配任意不是字母、数字、下划线、汉子的字符
    • \S 匹配任意不是空白符的字符
    • \D 匹配任意非数字的字符
    • \B 匹配不是单词开头或结束的位置,就是如果放在前面,那么前面就是有连接,同样不匹配空格、标点符号、换行
      • pyx\B会匹配 pyxaa,而不会匹配 pyx.
    • [^xs] 匹配除了 x、s 这2个字母以外的任意字符
  • 后向引用:\序号 用于重复搜索前面某个分组匹配的文本
    • 反向引用基础
    • 序号代表第几个分组,\0表示整个表达式,\1表示从左到右第一个分组
    • 先进行正则匹配,匹配到后放入内存空间中,然后通过反向引用,继续引用内存空间中的这个值,一般用于捕获重复的单词
  • 零宽断言:查找在某些内容(但并不包括这些内容)之前后之后的东西,也就是说它们像\b^$那样用于指定一个位置
    • (?=exp) 匹配exp前面的位置
    • (?<=exp) 匹配exp后面的位置
    • (?!exp) 匹配后面跟的不是exp的位置
    • (?<!exp) 匹配前面不是exp的位置
    • 最能体现零宽断言的表达式:(?<=<(\w+)>).*(?=<\/\1>) 匹配不包含属性的简单HTML标签内的内容.
    • 注意:在 PythonPerl 中两个零宽断言的表达式只允许使用定长文本,如果正则表达式写成:(?<=<(\w+)>+).*(?=<\/\1>),解释器会报错:error: look-behind requires fixed-width pattern
  • 注释:小括号的另一种用途是通过语法(?#comment)来包含注释,如果要加空白符的话,需要启用忽略模式里的空白符选项(.NET中的选项)
  • 贪婪与懒惰:
    • 当正则表达式中能接受重复的限定符时,通常的行为是(在试整个表达式能得到匹配的前提下)匹配尽可能多的字符,这就是贪婪匹配。
    • 如果匹配尽可能少的字符,就称为懒惰匹配,即在给出的限定符后面加上一个问号?
    • *? 重复任意次,但尽可能少重复
    • +? 重复1次或更多次,但尽可能少重复
    • ?? 重复0次或1次,但尽可能少重复
    • {n,}? 重复n次或以上,但尽可能少重复
#!/usr/bin/env python
# coding=utf-8

import re

a = re.search(r'(.+)\1', 'pyx pyx ')
print a.span(), a.group()
#pyx放入内存中存储,\1继续反向引用这个pyx
a = re.search(r'(.+) \1', 'pyx pyx')
print a.span(), a.group()
#pyx后面需要跟字符
a = re.search(r'pyx\B', 'pyxaa')
print a.span(), a.group()
x = '1234567890'
#贪婪模式,\d后面跟3个\d(不包括前面的\d),重复1次或更多次
a = re.search(r'((?<=\d)\d{3})+\b', x)
print a.span(), a.group()
#匹配后面不能出现abc,\b又规定了单词边界,sabc sss这样就可以匹配
a = re.search(r'\b((?!abc)\w)+\b', 'sbcsss')
print a.span(), a.group()</pre>
(0, 8) pyx pyx  #这里有个空格
(0, 7) pyx pyx
(0, 3) pyx
(1, 10) 234567890
(5, 8) sss
0x03 爬虫实战一

  • 爬虫目标:BeeBeeto 网站
  • 爬虫思路:
    • 先爬取公开POC页面,然后爬取每个POC具体内容
    • 应该采用多线程机制
0x04 一天总结

  • 正则表达式需要多熟练记忆
  • 爬虫实战一目前实现爬取公开POC页面,获得指定POC名称和URL