21,464
社区成员
发帖
与我相关
我的任务
分享我用Python摸爬滚打的网络安全实战录从脚本小子到防御者的自白
大家好,我是老王,一个从脚本小子转型的安全工程师。今天想和大家聊聊这些年我用Python在网络安全领域摸爬滚打的血泪史。文章会包含端口扫描、漏洞利用、流量分析和防御加固四大核心技能,中间穿插不少我踩过的坑和实战代码。如果你也想像我一样从"只知道import requests的黑客电影模仿者"成长为能写出企业级防御系统的工程师,这篇万字长文可能会让你少走几年弯路。
从零开始的端口扫描术
刚入行时,我理解的扫描就是nmap一把梭。直到有次业务系统被我扫崩,才发现自己连最基本的socket编程都不懂。
python
import socket
from concurrent.futures import ThreadPoolExecutor
def scanport(target, port):
with socket.socket(socket.AFINET, socket.SOCKSTREAM) as s:
s.settimeout(1)
try:
s.connect((target, port))
print(f"[+] port/tcp open")
return True
except:
return False
多线程优化示例
def fastscan(target, ports):
with ThreadPoolExecutor(maxworkers=100) as executor:
results = executor.map(lambda p: scanport(target, p), ports)
return [p for p, r in zip(ports, results) if r]
记得第一次写这段代码时,我傻乎乎地没用线程池,扫描C段足足花了三小时。现在看这个版本虽然简陋,但包含了端口扫描的核心TCP三次握手检测。后来在导师要求下,我给扫描器加上了banner抓取功能
python
def grabbanner(target, port):
try:
s = socket.socket()
s.connect((target, port))
s.send(b'GET / HTTP/1.1\r\n\r\n')
return s.recv(1024).decode().strip()
except Exception as e:
return str(e)
当我在公司内网扫描出redis未授权访问时,那个暴露的"redisversion:5.0.7"让我真正理解了banner信息的重要性。不过要提醒新手的是,未经授权的扫描可能违法,我现在都随身带着领导签字的授权书。
SQL注入攻防博弈记
测试系统时,我发现某个登录框有古怪。随手输入' or 1=1 --居然直接进后台了!兴奋过后我意识到这是个危险的开始注入演示切勿用于非法用途
python
import requests
def naivesqli(url, param):
payloads = ["' or 1=1 --", "' admin' --", "' union select 1,2,3 --"]
for p in payloads:
r = requests.get(url, params=param: p)
if "welcome admin" in r.text:
print(f"漏洞存在!有效载荷: p")
return p
return None
这种简单检测在实战中远远不够。后来我用sqlmap源码改写出更智能的检测模块
python
def advanceddetect(url):
from bs4 import BeautifulSoup
自动识别表单
soup = BeautifulSoup(requests.get(url).text, '.parser')
forms = soup.findall('form')
for form in forms:
inputs = form.findall('input')
data = i.get('name'): f"1' AND 1=CONVERT(int,version)--"
for i in inputs if i.get('type') != 'submit'
if "SQL Server" in requests.post(url, data=data).text:
print("SQL Server版本泄露漏洞")
转防御角色后,我为公司Web系统写的参数化查询组件成功拦截了多次注入尝试
python
安全查询示例
def safequery(query, params):
conn = psycopg2.connect(DATABASEURI)
cur = conn.cursor()
cur.execute(query, params) 参数化关键在这里
return cur.fetchall()
真实案例去年我们有个重要客户被sql注入拖库,调查发现开发竟然在代码里用字符串拼接SQL!这让我连夜给全员做了ORM安全使用培训。
流量分析中的暗战
做流量监控时,我发现传统WAF根本拦不住定制化攻击。于是用Scapy写出了自己的流量指纹系统
python
from scapy.all import
def packethandler(pkt):
if pkt.haslayer(TCP) and pkt[TCP].dport == 80:
payload = str(pkt[TCP].payload)
检测经典XSS尝试
if any(tag in payload for tag in ['