第一关:RE库的使用
任务描述
本关任务:编写一个能正则匹配出 ip
地址的小程序。
相关知识
为了完成本关任务,你需要掌握:
- re 的主要功能函数;
- re.search 函数;
- 例子。
re 的主要功能函数
常用的功能函数包括: compile
、search
、match
、split
、findall(finditer)
、sub(subn)
。
re.search 函数
re.search
扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern, string, flags=0)
函数参数说明:
参数 | 含义 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
例子
import re
line='www.python.org'
trueIp =re.search('python',line)
print(trueIp)
输出: www.python.org
<_sre.SRE_Match object; span=(0, 11), match='192.168.1.1'>
编程要求
根据提示,在右侧编辑器 begin-end 内补充代码,使用 re.search
匹配出 IP
地址。
测试说明
平台会对你编写的代码进行测试: 代码请写在 Evidence
函数里,path
为存放 IP
的文件路径,文件内容为:192.168.1.1
请读取出文件内容,并用 re.search
匹配并输出结果;
预期输出: <re.Match object; span=(0, 11), match='192.168.1.1'>
import redef Evidence(path):with open(path, 'r') as file:content = file.read()ip_pattern = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'ip_match = re.search(ip_pattern, content)print(ip_match)
第2关:pcap 包的读取
任务描述
本关任务:编写一个能读取 pcap
文件的程序
相关知识
为了完成本关任务,你需要掌握:如何读取 pcap
文件。
pcap
文件是常用的数据报存储格式,可以理解为就是一种文件格式,只不过里面的数据是按照特定格式存储的,所以我们想要解析里面的数据,也必须按照一定的格式。
编程要求
根据提示,在右侧编辑器 begin-end 内补充代码,读取 pcap
文件,并对其进行解析,输出要求的内容。
测试说明
要求输出以 192.168.8.130
为源地址和目标地址的包出现的次数; 预期输出: IP:192.168.8.130发了10次包,接收了9次包
from scapy.all import *
from scapy.layers.inet import *
from scapy.layers.l2 import *def Evidence(path):packets = rdpcap(path)src_ip = "192.168.8.130"count_sent = 0count_received = 0for packet in packets:if IP in packet:if packet[IP].src == src_ip:count_sent += 1if packet[IP].dst == src_ip:count_received += 1print(f"IP:{src_ip}发了{count_sent}次包,接收了{count_received}次包")
第三关:pcap包的使用
任务描述
本关任务:编写一个能从 pcap
包检测 XSS
和 SQL
注入攻击的小程序。
相关知识
为了完成本关任务,你需要掌握:1.re库的使用,2.pcap包的读取。
re.compile 函数
compile
函数用于编译正则表达式,生成一个正则表达式(Pattern
)对象,供 match()
和 search()
这两个函数使用。
语法格式为:
re.compile(pattern[, flags])
参数 | 含义 |
---|---|
pattern | 一个字符串形式的正则表达式 |
flags | 可选,表示匹配模式,比如忽略大小写,多行模式等 |
flag
具体参数为:
属性和方法 | 描述 |
---|---|
re.S(DOTALL) | 使.匹配包括换行在内的所有字符 |
re.I(IGNORECASE) | 使匹配对大小写不敏感 |
re.L(LOCALE) | 做本地化识别(locale-aware)匹配,法语等 |
re.M(MULTILINE) | 多行匹配,影响^和$ |
re.X(VERBOSE) | 该标志通过给予更灵活的格式以便将正则表达式写得更易于理解 |
re.U | 根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B |
例子
pattern = re.compile('匹配XSS攻击的正则表达式', flags=re.)
result_list = pattern.findall(data)
for x in result_list:
print ('恶意攻击序号:'+str(count_bad))
print ('检测到XSS(跨站脚本攻击)!')
print (data)
编程要求
有一个 pcap
文件 src/step3/1.pcap
,需要检测其中的恶意流量。 请对其进行检测并按返回测试说明的格式返回。检测到一次攻击将记录一次序号,先检测 XSS
再检测 SQL
注入。 测试数据由评测系统读取并传递给 Evidence
函数,期间产生的输出将会与规定的输出进行比较,详细要求请见测试说明。 提示: 其中 XSS
攻击使用的 payload
有:
<script>alert(1)</script>
<iMg src=x onError=Alert(1) />
其中 SQL
注入使用的 payload
有:
admin' union select user,password from users--+
-3 uNion SeleCt user(),database(),3,4\`\`\`
同时在 pcap
解析出的数据中,特殊符号是经过浏览器 url
编码的,如:
"<"号会变成%3C
admin' union select user,password from users--+会变成
admin%27+union+select+user%2Cpassword+from+users--%2B
测试说明
测试输入:无; 预期输出: 恶意攻击序号:1
检测到XSS(跨站脚本攻击)!
username=%3CiMg+src%3Dx+onError%3DAlert%281%29+%2F%3E&password=123&Login=Login
恶意攻击序号:2
检测到SQL注入攻击!
username=-3+uNion+SeleCt+user%28%29%2Cdatabase%28%29%2C3%2C4&password=123&Login=Login
from scapy.all import *
import redef Evidence(pcap_path):# 请在此添加实现代码 ## ********** Begin *********#datas = []count_bad = 0 # 检测到的攻击数量packets = rdpcap(pcap_path) # 读取pcap文件for packet in packets:if 'TCP' in packet:datas = str(packet['TCP'].payload).split('\r\n')for data in datas:# 检测XSS onerror/**/= onerror=pattern = re.compile('(\\%3C|<)(body|layer|div|meta|style|base|object|input|img|a|iframe|svg|textarea)(.*?)(onmouseover|onerror|onload|onfocus)(\\=|%3D)|(\\%3C|<)script(\\%3E|>)(javascript:|alert|confirm|prompt|autofocus)(\\%28|())', flags=re.IGNORECASE)result_list = pattern.findall(data)for x in result_list:count_bad += 1print('恶意攻击序号:' + str(count_bad))print('检测到XSS(跨站脚本攻击)!')print(data)# 检测SQL注入pattern = re.compile('(?:(union(.*?)select))|select.+(from|limit)|(?:from\\W+information_schema\\W)|(?:((?:current_)(user|database|schema|connection_id)))\\s*\$|into(\\s+)+(?:dump|out)file\\s*|group\\s+by.+\\(|sleep\\((\\s*)(\\d*)(\\s*)\$|(having|rongjitest)', flags=re.IGNORECASE)result_list = pattern.findall(data)for x in result_list:count_bad += 1print('恶意攻击序号:' + str(count_bad))print('检测到SQL注入攻击!')print(data)# ********** End **********#