本关任务:编写一个能正则匹配出 ip 地址的小程序。
为了完成本关任务,你需要掌握:
常用的功能函数包括: compile、search、match、split、findall(finditer)、sub(subn)。
re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern, string, flags=0)函数参数说明:
参数 | 含义 |
|---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
import reline='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 re
def 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)本关任务:编写一个能读取 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 = 0
count_received = 0
for packet in packets:
if IP in packet:
if packet[IP].src == src_ip:
count_sent += 1
if packet[IP].dst == src_ip:
count_received += 1
print(f"IP:{src_ip}发了{count_sent}次包,接收了{count_received}次包")本关任务:编写一个能从 pcap 包检测 XSS 和 SQL 注入攻击的小程序。
为了完成本关任务,你需要掌握:1.re库的使用,2.pcap包的读取。
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 编码的,如:
"<"号会变成%3Cadmin' 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 re
def 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 += 1
print('恶意攻击序号:' + 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 += 1
print('恶意攻击序号:' + str(count_bad))
print('检测到SQL注入攻击!')
print(data)
# ********** End **********#