版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Web应用开发与安全防护第三篇Web应用安全与防护Web安全概述统信UOS与Web安全Flask与Web安全用Flask实现Dos攻击用Flask实现SQL注入用Flask实现XSS攻击OpenSSL安装和配置在Flask中启用HTTPS支持统信UOS上防火墙配置【扩展】Web信息收集第4章Web应用安全概述:4.1常见的威胁及防护措施4.1.1常见的威胁1.拒绝服务攻击(DoS)和分布式拒绝服务攻击(DDoS)2.SQL注入攻击3.跨站脚本攻击(XSS)4.缓冲区溢出5.未及时更新软件和补丁第4章Web应用安全概述:4.1常见的威胁及防护措施4.1.2常见的防护措施1.使用Web应用防火墙(WAF)2.实施安全编码标准3.数据库安全配置4.安全意识培训5.物理安全6.结论Web安全概述统信UOS与Web安全Flask与Web安全用Flask实现Dos攻击用Flask实现SQL注入用Flask实现XSS攻击OpenSSL安装和配置在Flask中启用HTTPS支持统信UOS上防火墙配置【扩展】Web信息收集第4章Web应用安全概述:4.2统信UOS与Web安全一、系统安全更新二、应用安全【启动器/控制中心/更新】第4章Web应用安全概述:4.2统信UOS与Web安全三、防火墙与入侵检测四、HTTPS与SSL/TLS五、用户权限管理【启动器/安全中心/防火墙】第4章Web应用安全概述:4.2统信UOS与Web安全六、日志记录与监控七、安全意识与培训【启动器/日志收集工具】第4章Web应用安全概述:4.2统信UOS与Web安全八、备份与恢复【启动器/控制中心/备份还原】Web安全概述统信UOS与Web安全Flask与Web安全用Flask实现Dos攻击用Flask实现SQL注入用Flask实现XSS攻击OpenSSL安装和配置在Flask中启用HTTPS支持统信UOS上防火墙配置【扩展】Web信息收集第5章
FlaskWeb应用安全一、输入验证与过滤Flask-WTForms,Flask-SQLAlchemy二、会话管理Flask-Loginsession:Http-Only三、密码安全:哈希算法四、HTTPS五、依赖库与插件的安全六、错误处理与日志记录1.自定义状态代码【500.py】from
flask
import
Flask,
render_template
app
=
Flask(__name__)
@app.errorhandler(500)def
internal_server_error(e):
#
返回自定义的500页面
return
render_template('500.html'),
500
#
其他路由@app.route('/')def
index():
#
故意制造一个错误来触发500页面
1
/
0
#
这将引发一个ZeroDivisionError,导致500错误
return
'Hello,
World!'
if
__name__
==
'__main__':
app.run(debug=True)第5章
FlaskWeb应用安全:5.1Flask中的错误响应六、错误处理与日志记录2.自定义错误页面【500.html】<!DOCTYPE
html><html
lang="en"><head>
<meta
charset="UTF-8">
<title>500
Internal
Server
Error</title></head><body>
<h1>500
Internal
Server
Error</h1>
<p>Sorry,
something
went
wrong
on
our
server.</p></body></html>$
python3
500.pyif
__name__
==
'__main__':
app.run(debug
=
True)#False第5章
FlaskWeb应用安全:5.2Flask内容安全策略七、安全意识与培训八、其他安全措施:【CSP.py】from
flask
import
Flask,
Responseapp
=
Flask(__name__)@app.route('/')def
index():
resp
=
Response("Hello,
World!",
content_type='text/plain')
resp.headers['Content-Security-Policy']
=
"default-src
'self';
script-src
'self'
'unsafe-inline'"
return
respif
__name__
==
'__main__':
app.run(debug=True)$
cd
www/attack$
python3
CSP.pyWeb安全概述统信UOS与Web安全Flask与Web安全用Flask实现Dos攻击用Flask实现SQL注入用Flask实现XSS攻击OpenSSL安装和配置在Flask中启用HTTPS支持统信UOS上防火墙配置【扩展】Web信息收集第5章
FlaskWeb应用安全:5.3用Flask实现Dos攻击5.3.1DoS攻击【DoS.py】import
requestsimport
threadingimport
time
url
=
':5000/'def
send_request():
try:
response
=
requests.get(url)
print(f'Status
code:
{response.status_code}')
except
Exception
as
e:
print(f'Error:
{e}')
num_threads
=
10000
#
可以根据需要调整线程数量threads
=
[]for
_
in
range(num_threads):
thread
=
threading.Thread(target=send_request)
threads.append(thread)
thread.start()for
thread
in
threads:
thread.join()$
python3
app.py#启动目标Web应用$
cd
attack$
python3
DoS.py#启动DoS攻击第5章
FlaskWeb应用安全:5.3用Flask实现Dos攻击5.3.2基本防护措施【Limiter.py】from
flask
import
Flask,
jsonify,
requestfrom
flask_limiter
import
Limiterfrom
flask_limiter.util
import
get_remote_addressapp
=
Flask(__name__)limiter
=
Limiter(app,
key_func=get_remote_address,
#
使用远程地址(IP)作为限制键
default_limits=["200
per
day",
"50
per
hour"])
#
设置默认速率限制@app.route("/")@limiter.limit("5
per
minute")
#
为此视图设置特定的速率限制def
limited():
return
jsonify({"message":
"This
is
a
rate-limited
endpoint!"})from
flask_limiter
import
RateLimitExceeded@app.errorhandler(RateLimitExceeded)def
ratelimit_handler(e):
return
jsonify(error="rate
limit
exceeded
%s"
%
e.description),
429if
__name__
==
"__main__":
app.run()$
pip3
install
Flask-Limiter$
cd
www/attack$
python3
Limiter.pyWeb安全概述统信UOS与Web安全Flask与Web安全用Flask实现Dos攻击用Flask实现SQL注入用Flask实现XSS攻击OpenSSL安装和配置在Flask中启用HTTPS支持统信UOS上防火墙配置【扩展】Web信息收集第5章
FlaskWeb应用安全:5.4用Flask实现SQL注入攻击5.1不安全的示例【SQL.py】5.2防范SQL注入from
flask
import
Flask,
request,
jsonifyimport
sqlite3app
=
Flask(__name__)DATABASE
=
'SQL.db'def
init_db():
conn
=
sqlite3.connect(DATABASE)
c
=
conn.cursor()
c.execute('''CREATE
TABLE
IF
NOT
EXISTS
users
(id
INTEGER
PRIMARY
KEY,
username
TEXT,
username
TEXT)''')
mit()
conn.close()init_db()@app.route('/user',
methods=['GET'])def
get_user():
username
=
request.args.get('username')
conn
=
sqlite3.connect(DATABASE)
c
=
conn.cursor()
c.execute("SELECT
*
FROM
users
WHERE
username
=
+'"username"'"))
users
=
c.fetchall()
conn.close()
return
jsonify(users)if
__name__
==
'__main__':app.run(debug=True)$
python3
SQL.py:5000/user?username='
OR
'1'='1c.execute("SELECT
*
FROM
users
WHERE
username
=
?",
(username,))Web安全概述统信UOS与Web安全Flask与Web安全用Flask实现Dos攻击用Flask实现SQL注入用Flask实现XSS攻击OpenSSL安装和配置在Flask中启用HTTPS支持统信UOS上防火墙配置【扩展】Web信息收集第5章
FlaskWeb应用安全:5.5用Flask实现XSS攻击5.5.1XSS攻击示例【XSS.py】5.5.2修复XSS攻击漏洞from
flask
import
Flask,
request,
render_template_stringapp
=
Flask(__name__)
template
=
'''<!doctype
html><html>
<head><title>XSS
Demo</title></head>
<body>
<h1>Hello,
Flask!</h1>
<form
method="POST">
<label
for="message">Enter
a
message:</label>
<input
type="text"
id="message"
name="message">
<input
type="submit"
value="Submit">
</form>
{%
if
message
%}
<h2>You
entered:
{{
message
|
safe
}}</h2>
{%
endif
%}
</body></html>'''@app.route('/',
methods=['GET',
'POST'])def
index():
if
request.method
==
'POST':
#
这里没有对用户输入进行任何处理或转义,存在XSS漏洞
message
=
request.form['message']
return
render_template_string(template,
message=message)
return
render_template_string(template)if
__name__
==
'__main__':app.run(debug=True)$
python3
XSS.py<script>alert('AlertXSS!');</script><h2>You
entered:
{{
message
}}</h2>Web安全概述统信UOS与Web安全Flask与Web安全用Flask实现Dos攻击用Flask实现SQL注入用Flask实现XSS攻击OpenSSL安装和配置在Flask中启用HTTPS支持统信UOS上防火墙配置【扩展】Web信息收集第6章
Flask与HTTPS:6.1OpenSSL安装和配置一、安装OpenSSL1.更新包列表:2.安装OpenSSL:3.验证安装:二、配置OpenSSL1.生成私钥:2.生成证书签名请求(CSR):3.自签名证书(仅用于测试环境):4.配置服务器:$
sudo
apt
update$
sudo
apt
install
openssl
libssl-dev$
openssl
version$
openssl
genpkey
-algorithm
RSA
-out
private.key
-pkeyopt
rsa_keygen_bits:2048$
openssl
req
-new
-key
private.key
-out
csr.csr$
openssl
x509
-req
-days
365
-in
csr.csr
-signkey
private.key
-out
certificate.crtWeb安全概述统信UOS与Web安全Flask与Web安全用Flask实现Dos攻击用Flask实现SQL注入用Flask实现XSS攻击OpenSSL安装和配置在Flask中启用HTTPS支持统信UOS上防火墙配置【扩展】Web信息收集第6章
Flask与HTTPS:6.2在Flask中启用HTTPS支持一、获取SSL/TLS证书:【在第7章已获取】二、配置Web服务器:三、代理设置(如果适用)四、重定向HTTP到HTTPS【app.py】@app.before_requestdef
before_request():
if
not
request.is_secure:
url
=
request.url.replace('http://',
'https://',
1)
return
redirect(url,
code=301)第6章
Flask与HTTPS:6.2在Flask中启用HTTPS支持五、运行Flask应用【tornado_server_SSL.py】from
tornado.wsgi
import
WSGIContainerfrom
tornado.httpserver
import
HTTPServerfrom
tornado.ioloop
import
IOLoopfrom
app
import
app
ssl_certfile
=
'attack/certificate.crt'ssl_keyfile
=
'attack/private.key'
http_server
=
HTTPServer(WSGIContainer(app),
ssl_options={
"certfile":
ssl_certfile,
"keyfile":
ssl_keyfile,})http_server.listen(8000)IOLoop.instance().start()$
python3
tornado_server_SSL.py$
gunicorn
-c
gunicorn_config.py
app:app
--certfile=attack/certificate.crt
--keyfile=attack/private.key第6章
Flask与HTTPS:6.2在Flask中启用HTTPS支持六、测试HTTPS连接https://:8000/Web安全概述统信UOS与Web安全Flask与Web安全用Flask实现Dos攻击用Flask实现SQL注入用Flask实现XSS攻击OpenSSL安装和配置在Flask中启用HTTPS支持统信UOS上防火墙配置【扩展】Web信息收集第4章Web应用安全概述:4.3统信UOS上防火墙配置一、本地IP:本地IP用于指定哪些来自局域网内的数据包可以被防火墙接受或拒绝。二、本地端口:本地端口用于指定哪些来自特定应用程序或服务的数据包可以被防火墙接受或拒绝。三、远程IP:远程IP用于指定哪些来自特定IP地址的数据包可以被防火墙接受或拒绝。四、远程端口:远程端口用于指定哪些来自特定远程端口的数据包可以被防火墙接受或拒绝。五、注意事项【启动器/安全中心/防火墙】Web安全概述统信UOS与Web安全Flask与Web安全用Flask实现Dos攻击用Flask实现SQL注入用Flask实现XSS攻击OpenSSL安装和配置在Flask中启用HTTPS支持统信UOS上防火墙配置【扩展】Web信息收集【扩展】第7章
Web信息收集一、被动信息收集不直接与目标系统进行交互,而是通过公开渠道收集信息。二、主动信息收集直接与目标系统进行交互,通过扫描、探测等方式收集信息。三、信息收集的注意事项合法性,隐私保护,准确性,安全性。【扩展】第7章
Web信息收集:7.1被动信息收集7.1.1【被动】IP地址查询【ip1.py】import
socketdef
get_ip_address(hostname):
try:
#
使用
gethostbyname
方法根据主机名获取
IP
地址
ip_address
=
socket.gethostbyname(hostname)
print(f"The
IP
address
of
{hostname}
is
{ip_address}")
except
socket.gaierror
as
e:
#
捕获并处理可能的异常,例如主机名不存在
print(f"Error:
Unable
to
get
IP
address
for
{hostname}.
Reason:
{e}")#
示例用法hostname
=
""get_ip_address(hostname)$
python3
ip1.py【扩展】第7章
Web信息收集:7.1被动信息收集A、【被动】IP地址查询【ip2.py】$
python3
ip2.pyimport
socketdef
get_all_ip_addresses(hostname):
try:
#
使用
getaddrinfo
方法获取所有可能的
IP
地址
addresses
=
socket.getaddrinfo(hostname,
None)
ip_addresses
=
[addr[4][0]
for
addr
in
addresses
if
addr[4]]
#
过滤出
IPv4
地址
print(f"The
IP
addresses
of
{hostname}
are
{',
'.join(ip_addresses)}")
except
socket.gaierror
as
e:
print(f"Error:
Unable
to
get
IP
addresses
for
{hostname}.
Reason:
{e}")#
示例用法hostname
=
""get_all_ip_addresses(hostname)【扩展】第7章
Web信息收集:7.1被动信息收集7.1.2【被动】Whois查询【whois.py】$
python3
whois.pyfrom
whois
import
whois
#
要查询的域名domain
=
''
#
进行Whois查询domain_info
=
whois(domain)
#
打印查询结果print(domain_info)$
pip3
install
python-whois【扩展】第7章
Web信息收集:7.1被动信息收集7.1.3【被动】查询IP地址地理位置【ipinfo.py】$
python3
ipinfo.py$
pip3
install
requestsimport
requests
def
get_ip_info(ip):
try:
#
发送HTTP
GET请求到ipinfo.io
response
=
requests.get(f'https://ipinfo.io/{ip}/json')
response.raise_for_status()
#
如果请求失败,将抛出HTTPError异常
#
解析JSON响应
ip_info
=
response.json()
#
输出ip
地址的地理位置信息
print(f"IP:
{ip_info['ip']}")
print(f"City:
{ip_info['city']}")
print(f"Region:
{ip_info['region']}")
print(f"Country:
{ip_info['country']}")
print(f"Loc:
{ip_info['loc']}")
print(f"Organization:
{ip_info['org']}")
except
requests.exceptions.RequestException
as
e:
print(f"Error
occurred:
{e}")
#
示例:查询的ip
地址信息get_ip_info('')【扩展】第7章
Web信息收集:7.1被动信息收集7.1.4【被动】子域名挖掘【subdomain.py】$
python3
subdomain.py$
pip3
install
beautifulsoup4import
requestsfrom
bs4
import
BeautifulSoupfrom
urllib.parse
import
urlparseimport
sysdef
bing_search(site,
pages):
Subdomain
=
[]
headers
=
{'User-Agent':
'Mozilla/5.0
(X11;
Linux
x86_64;
rv:60.0)
Gecko/20100101
Firefox/60.0',
'Accept':
'*/*',
'Accept-Language':
'en-US,en;q=0.5',
'Accept-Encoding':
'gzip,deflate',
'referer':
"/search?q=email+site%3&qs=n&sp=-1&pq=emailsite%3&first=2&FORM=PERE1"
}
for
i
in
range(1,int(pages)+1):
url
=
"/search?q=site%3a"+site+"&go=Search&qs=ds&first="+
str((int(i)-1)*10)
+"&FORM=PERE"
conn
=
requests.session()
conn.get('',
headers=headers)
html
=
conn.get(url,
stream=True,
headers=headers,
timeout=8)
soup
=
BeautifulSoup(html.content,
'html.parser')
job_bt
=
soup.findAll('h2')
for
i
in
job_bt:
link
=
i.a.get('href')
domain
=
str(urlparse(link).scheme
+
"://"
+
urlparse(link).netloc)
if
domain
in
Subdomain:
pass
else:
Subdomain.append(domain)
print(domain)if
__name__
==
'__main__':
#
site=
if
len(sys.argv)
==
3:
site
=
sys.argv[1]
page
=
sys.argv[2]
else:
("usage:
%s
10"
%
sys.argv[0])
sys.exit(-1)
bing_search(site,
page)【扩展】第7章
Web信息收集:7.2主动信息收集7.2.1【主动】基于TCP、UDP的主机发现1.基于TCP的主机发现【tcp.py】import
socket
def
tcp_ping(host,
port):
try:
#
创建一个socket对象
s
=
socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
#
设置超时时间
s.settimeout(1)
#
尝试连接目标主机和端口
s.connect((host,
port))
print(f"TCP
Ping:
{host}
is
alive!")
s.close()
except
socket.error
as
e:
print(f"TCP
Ping:
{host}
is
down
or
port
{port}
is
closed.")
#
使用示例tcp_ping('',
80)$
python3
tcp.py【扩展】第7章
Web信息收集:7.2主动信息收集7.2.1【主动】基于TCP、UDP的主机发现2.基于UDP的主机发现【udp.py】3.注意事项权限,防火墙,端口$
python3
udp.pyimport
socket
def
udp_ping(host,
port):
try:
#
创建一个socket对象
s
=
socket.socket(socket.AF_INET,
socket.SOCK_DGRAM)
#
设置超时时间
s.settimeout(1)
#
发送一个空的UDP数据包
s.sendto(b'',
(host,
port))
#
接收响应(这里不期望有响应,只是看是否会抛出异常)
s.recvfrom(1024)
print(f"UDP
Ping:
{host}
is
alive!")
s.close()
except
socket.error
as
e:
print(f"UDP
Ping:
{host}
is
down
or
port
{port}
is
closed.")
#
使用示例udp_ping('',
123)【扩展】第7章
Web信息收集:7.2主动信息收集7.2.2【主动】端口探测【port.py】import
sysimport
socketimport
optparseimport
threadingimport
queue#
端口扫描类,继承threading.Threadclass
PortScaner(threading.Thread):
#
需要传入
端口队列
目标IP
探测超时时间
def
__init__(self,
portqueue,
ip,
timeout=3):
threading.Thread.__init__(self)
self._portqueue
=
portqueue
self._ip
=
ip
self._timeout
=
timeout
def
run(self):
while
True:
#
判断端口队列是否为空
if
self._portqueue.empty():
#
端口队列为空说明已经扫描完毕,跳出循环
break
#
从端口队列中取出端口,超时时间为1s
port
=
self._portqueue.get(timeout=0.5)
try:
s
=
socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
s.settimeout(self._timeout)
result_code
=
s.connect_ex((self._ip,
port))
#
sys.stdout.write("[%d]Scan\n"
%
port)
#
若端口开放则会返回0
if
result_code
==
0:
sys.stdout.write("[%d]
OPEN\n"
%
port)
except
Exception
as
e:
print(e)
finally:
s.close()def
StartScan(targetip,
port,
threadNum):
#
端口列表
portList
=
[]
portNumb
=
port
#
判断是单个端口还是端口范围
if
'-'
in
port:
for
i
in
range(int(port.split('-')[0]),
int(port.split('-')[1])+1):
portList.append(i)
else:
portList.append(int(port))
#
目标IP地址
ip
=
targetip
#
线程列表
threads
=
[]
#
线程数量
threadNumber
=
threadNum
#
端口队列
portQueue
=
queue.Queue()
#
生成端口,加入到端口队列
for
port
in
portList:
portQueue.put(port)
for
t
in
range(threadNumber):
threads.append(PortScaner(portQueue,
ip,
timeout=3))
#
启动线程
for
thread
in
threads:
thread.start()
#
阻塞线程
for
thread
in
threads:
thread.join()if
__name__
==
'__main__':
parser
=
optparse.OptionParser('Example:
python
%prog
-i
-p
80
\n
python
%prog
-i
-p
1-100\n')
#
目标IP参数-i
parser.add_option('-i',
'--ip',
dest='targetIP',default='',
type='string',help='target
IP')
#
添加端口参数-p
parser.add_option('-p',
'--port',
dest='port',
default='80',
type='string',
help='scann
port')
#
线程数量参数-t
parser.add_option('-t',
'--thread',
dest='threadNum',
default=100,
type='int',
help='scann
thread
number')
(options,
args)
=
parser.parse_args()
StartScan(options.targetIP,
options.port,
options.threadNum)$
python3
port.py
-i
192.168.1.1
-p
1-3500
-t
100【扩展】第7章
Web信息收集:7.2主动信息收集7.2.3【主动】操作系统识别【os.py】$
python3
os.py-ifrom
optparse
import
OptionParserimport
osimport
redef
ttl_scan(ip):
ttlstrmatch
=
re.compile(r'ttl=\d+')
ttlnummatch
=
re.compile(r'\d+')
result
=
os.popen("ping
-c
1
"+ip)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 一次通关2021民航招飞体检英语测试题及答案解析
- 2023年潍坊教育类优才计划笔试上岸经验贴+真题答案
- 2021年科研助理招聘考试历年真题+押题题库含完整答案
- 2026返贫监测信息员认证考前必刷10套卷 刷完稳拿证
- 2020年中国铁路南宁局招聘笔试全题型真题附答案
- 吉林长春市2025-2026学年第二学期八年级生物学科中考一模试卷(含解析)
- 耳鼻喉科手术后护理处理培训指南
- 中国体育运动精神
- 内科狼疮肾急症处理流程
- 脊髓损伤监测预防培训方案
- 某某某钼矿矿山地质环境保护与土地复垦方案(投标文件)
- T/CMES 15001-2023自行式自上料搅拌机通用技术要求
- T/CECS 10336-2023地面防滑性能分级及试验方法
- 客服外包合同协议书范本
- DBJ41T 189-2017 地下连续墙检测技术规程
- 小学语文命题能力培训
- 药物安全性监测-洞察分析
- 茶馆与棋牌室消防安全审核与应急预案
- 前列腺癌治疗现状
- 班组长晋升述职报告
- 3.1细胞膜的结构和功能+课件高一上学期生物人教版必修1
评论
0/150
提交评论