Python学习记录(三):正则表达式&网络爬虫
PyxYuYu opened this issue · 0 comments
PyxYuYu commented
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
- 案例1:163网易邮箱存储型XSS漏洞
- 利用
github
查到源码,进行审计
- 利用
- 案例1:163网易邮箱存储型XSS漏洞
- 弱口令
- weblogic / 12345678
- 商城支付系统
- 购物信息会生成一个md5签名信息,提交付款处抓包修改支付价格支付后,会生成一个新的支付md5信息,两个签名信息不同,服务端的购物状态是不会改变的
0x02 正则表达式
- 正则表达式只能匹配字符串,不能匹配整个数(如12344),所以只能匹配 0-9 这些字符
\b
元字符,代表单词的开头或结尾,也就是单词的分界处,不匹配空格,标点符号或换行,只匹配一个位置,即单词边界,单词是被定义为Unidcode
的字母数字或下划线字符,即包裹一个独立的整个单词\bpyx\b
可以匹配sss pyx ss
中的pyx
,无法匹配sss pyxss
.
元字符,匹配除了换行符(\n
,ASCII
编码为10
,十六进制0x0A
)以外的任意字符,注:通过设置re.DOTALL
可以使.
匹配任何字符(包括换行符)*
元字符,代表的不是字符,不是位置,而是数量,匹配前面的子表达式零次或多次,等价{0,}.*
代表任意数量的不包含换行的字符,包括0个
\d
元字符,匹配数字- 对于
Unicode
(str
类型)模式:匹配任何一个数字,包括[0-9]和其他数字字符,如果开启了re.ASCII
,就只匹配[0-9] - 对于8位(
bytes
类型)模式:匹配[0-9]中任何一个数字 P.s.
:补充说明Unicode
和UTF-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:脱字符
^
如果出现在首位表示匹配不包含其中的任意字符,如果出现在字符串中间仅作为普通字符匹配
- 注1:连字符
|
分枝条件,将不同的规则分隔开,表示匹配正则表达式左边一个或者右边一个,总是先匹配左边的表达式,一旦匹配成功则跳过匹配右边的表达式。如果|
没有被包括在()
中,则它的范围是整个正则表达式(...)
匹配圆括号中的正则表达式,或者指定一个子组(子表达式)的开始和结束位置,也就是分组,可以利用(...){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
标签内的内容. - 注意:在
Python
和Perl
中两个零宽断言的表达式只允许使用定长文本,如果正则表达式写成:(?<=<(\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