Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
PyxYuYu opened this issue Mar 4, 2016 · 0 comments
Open

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

PyxYuYu opened this issue Mar 4, 2016 · 0 comments

Comments

@PyxYuYu
Copy link
Owner

PyxYuYu commented Mar 4, 2016

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant