3《Web应用开发与安全防护》-Web安全与防护_第1页
3《Web应用开发与安全防护》-Web安全与防护_第2页
3《Web应用开发与安全防护》-Web安全与防护_第3页
3《Web应用开发与安全防护》-Web安全与防护_第4页
3《Web应用开发与安全防护》-Web安全与防护_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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:

print

("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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论