第一关: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=https://cloud.tencent.com/developer/article/x27;www.python.orghttps://cloud.tencent.com/developer/article/x27;
trueIp =re.search(https://cloud.tencent.com/developer/article/x27;pythonhttps://cloud.tencent.com/developer/article/x27;,line)
print(trueIp)
输出: www.python.org
<_sre.SRE_Match object; span=(0, 11), match=https://cloud.tencent.com/developer/article/x27;192.168.1.1https://cloud.tencent.com/developer/article/x27;>
编程要求
根据提示,在右侧编辑器 begin-end 内补充代码,使用 re.search
匹配出 IP
地址。
测试说明
平台会对你编写的代码进行测试: 代码请写在 Evidence
函数里,path
为存放 IP
的文件路径,文件内容为:192.168.1.1
请读取出文件内容,并用 re.search
匹配并输出结果;
预期输出: <re.Match object; span=(0, 11), match=https://cloud.tencent.com/developer/article/x27;192.168.1.1https://cloud.tencent.com/developer/article/x27;>
import re
def Evidence(path):
with open(path, https://cloud.tencent.com/developer/article/x27;rhttps://cloud.tencent.com/developer/article/x27;) as file:
content = file.read()
ip_pattern = rhttps://cloud.tencent.com/developer/article/x27;d{1,3}.d{1,3}.d{1,3}.d{1,3}https://cloud.tencent.com/developer/article/x27;
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 = 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包的使用
任务描述
本关任务:编写一个能从 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(https://cloud.tencent.com/developer/article/x27;匹配XSS攻击的正则表达式https://cloud.tencent.com/developer/article/x27;, flags=re.)
result_list = pattern.findall(data)
for https://cloud.tencent.com/developer/article/x in result_list:
print (https://cloud.tencent.com/developer/article/x27;恶意攻击序号:https://cloud.tencent.com/developer/article/x27; str(count_bad))
print (https://cloud.tencent.com/developer/article/x27;检测到XSS(跨站脚本攻击)!https://cloud.tencent.com/developer/article/x27;)
print (data)
编程要求
有一个 pcap
文件 src/step3/1.pcap
,需要检测其中的恶意流量。 请对其进行检测并按返回测试说明的格式返回。检测到一次攻击将记录一次序号,先检测 XSS
再检测 SQL
注入。 测试数据由评测系统读取并传递给 Evidence
函数,期间产生的输出将会与规定的输出进行比较,详细要求请见测试说明。 提示: 其中 XSS
攻击使用的 payload
有:
<script>alert(1)</script>
<iMg src=https://cloud.tencent.com/developer/article/x onError=Alert(1) />
其中 SQL
注入使用的 payload
有:
adminhttps://cloud.tencent.com/developer/article/x27; union select user,password from users--
-3 uNion SeleCt user(),database(),3,4```
同时在 pcap
解析出的数据中,特殊符号是经过浏览器 url
编码的,如:
"<"号会变成<
adminhttps://cloud.tencent.com/developer/article/x27; union select user,password from users-- 会变成
admin' union select user,password from users--+
测试说明
测试输入:无; 预期输出: 恶意攻击序号:1
检测到XSS(跨站脚本攻击)!
username=&password=123&Login=Login
恶意攻击序号:2
检测到SQL注入攻击!
username=-3 uNion SeleCt user(),database(),3,4&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 https://cloud.tencent.com/developer/article/x27;TCPhttps://cloud.tencent.com/developer/article/x27; in packet:
datas = str(packet[https://cloud.tencent.com/developer/article/x27;TCPhttps://cloud.tencent.com/developer/article/x27;].payload).split(https://cloud.tencent.com/developer/article/x27;rnhttps://cloud.tencent.com/developer/article/x27;)
for data in datas:
# 检测XSS onerror/**/= onerror=
pattern = re.compile(https://cloud.tencent.com/developer/article/x27;(\<|<)(body|layer|div|meta|style|base|object|input|img|a|iframe|svg|tehttps://cloud.tencent.com/developer/article/xtarea)(.*?)(onmouseover|onerror|onload|onfocus)(\=|=)|(\<|<)script(\>|>)(javascript:|alert|confirm|prompt|autofocus)(\(|())https://cloud.tencent.com/developer/article/x27;, flags=re.IGNORECASE)
result_list = pattern.findall(data)
for https://cloud.tencent.com/developer/article/x in result_list:
count_bad = 1
print(https://cloud.tencent.com/developer/article/x27;恶意攻击序号:https://cloud.tencent.com/developer/article/x27; str(count_bad))
print(https://cloud.tencent.com/developer/article/x27;检测到XSS(跨站脚本攻击)!https://cloud.tencent.com/developer/article/x27;)
print(data)
# 检测SQL注入
pattern = re.compile(https://cloud.tencent.com/developer/article/x27;(?:(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)https://cloud.tencent.com/developer/article/x27;, flags=re.IGNORECASE)
result_list = pattern.findall(data)
for https://cloud.tencent.com/developer/article/x in result_list:
count_bad = 1
print(https://cloud.tencent.com/developer/article/x27;恶意攻击序号:https://cloud.tencent.com/developer/article/x27; str(count_bad))
print(https://cloud.tencent.com/developer/article/x27;检测到SQL注入攻击!https://cloud.tencent.com/developer/article/x27;)
print(data)
# ********** End **********#