XSS攻击,通常指黑客在网页中插入恶意脚本,从而用户在浏览网页时,控制用户浏览器的一种攻击方式。
XSS根据效果不同可以分为:1、反射性XSS。2、存储型XSS(恶意脚本保存在服务器端)3、DOM型XSS(修改页面DOM节点)
XSS危害:cookie劫持,通过javascript构造GET,POST请求,XSS钓鱼,识别用户浏览器,识别用户安装的软件,获取用户真实ip地址,XSS蠕虫
XSS构造技巧:利用字符编码,绕过长度限制,使用不常用标签(例如
XSS的防御:HttpOnly(cookie劫持问题),输入检查(XSS Filter),输出检查(变量输出到HTML页面时,把代码编码或转义),处理富文本(白名单),
CSRF攻击是一种挟制用户在当前已登录(认证)的Web应用程序上执行非本意的操作的攻击方法。攻击成功本质原因:重要操作的参数都可以被攻击者猜测到
攻击者伪造的请求能被服务器通过,是因为用户浏览器成功发送了Cookie
浏览器的两种Cookie:”Session Cookie“(临时Cookie),“Third-party Cookie”(本地Ckookie)
P3P头(The Platform for Privacy Preferences)允许跨域访问隐私数据
CSRF的防御:验证码,Referer Check(请求是否来自合法"源"),Anit CSRF Token(攻击者无法猜测出Token,构造出完整URL)
注入攻击的本质:用户输入数据当作代码执行。两个关键条件:1、用户能控制输入。2、程序要执行的代码,拼接了用户输入的数据
SQL注入:盲注(页面是否变化),Timing Attack
数据库攻击技巧:命令执行,利用UDF(User-Defined Functions,用户自定义函数)执行命令。攻击存储过程。编码问题(基于字符集的注入攻击)。SQL Column Truncation
SQL注入的防御:使用预编译语句(绑定变量),使用安全的存储过程(将SQL语句定义在数据库中,存储过程中也可能会存在注入问题),检查数据类型(限制输入),使用安全函数,最小权限原则(避免Web应用使用高权限账号直接连接数据库)
其他注入攻击:XML注入,代码注入,CRLF注入
文件上传漏洞,用户上传了一个可执行的脚本文件,并通过脚本文件获得了执行服务器端命令的能力。
绕过文件上传检查:利用%00字符截断,伪造合法文件头(绕过检验文件头),Apache文件解析问题(从后往前解析),IIS文件解析问题(;字符截断文件名),PHP CGI路径解析问题(递归查询路径确认文件合法性)
如何设计安全的文件上传功能:1、文件上传的目录设置为不可执行。2、判断文件类型(MIME Type 后缀检查)3、使用随机数改写文件名和文件路径(用户访问不到文件)4、单独设置文件服务器的域名(同源同域策略)
命令执行漏洞,服务器没有对执行的命令进行过滤,用户可以随意执行系统命令。
漏洞危害:继承Web服务器程序的权限,去执行系统命令或读写文件。反弹shell。控制整个网站,甚至控制整个服务器。
漏洞成因:1、没有对用户输入进行过滤或过滤不严(例如&,&&,|,||等连接符)2、系统漏洞造成的命令执行。3、调用的第三方组件存在代码执行漏洞
常见危险函数
PHP相关:eval(),assert(),preg_replace,call_user_func(),call_user_func_array(),create_function,array_map()
系统命令执行相关:system(),passthru(),exec(),pcntl_exec(),shell_exec(),popen(),proc_open(),`(反单引号),ob_start()
防御措施:1、在PHP下禁用高危系统函数。2、参数的值尽量使用引号包括,并在拼接前调用addslashes进行转义。3、不执行外部的应用程序或命令。4、使用escapeshellarg函数处理相关参数。5、使用safe_mode_exec_dir指定可执行的文件路径
]]>快速排序是对冒泡排序的一种改进,由C. A. R. Hoare在1960年提出。它采用了“分治法”的策略来进行排序。
快速排序基本思想:
1、从数列中选取一个基准数p
2、小于等于p的放到它的左边,大于p的放到它的右边
3、对被分割开的左右两部分重复以上步骤,直到左右两部分中都只有一个元素
算法实现:
import random
def quicksort(lists):
if len(lists) < 2:
return lists #左右两部分完成排序后结束递归
else:
pivot = lists[0] #选择列表第一个数作为基准值
left = [i for i in lists[1:] if i <= pivot] #把小于等于基准值的数换到其左边
right = [j for j in lists[1:] if j > pivot] #把大于基准值的数换到其右边
return quicksort(left)+[pivot]+quicksort(right) #返回排序完毕的列表
if __name__=="__main__":
lists= [2,5,4,1,6,7,4,9,1]
random.shuffle(lists) #打乱列表,防止出现极端情况
print(lists) #输出排序前列表
print(quicksort(lists)) #输出排序后列表
输出示例:
[4, 7, 1, 5, 2, 9, 6, 1, 4]
[1, 1, 2, 4, 4, 5, 6, 7, 9]
快速排序时间复杂度:
最优情况:每一次的p都能恰好平分数组,此时时间复杂度为O(nlogn)
最差情况:每一次的p都刚好是最大或最小的数,此时时间复杂度为 O(n^2)
平均情况:时间复杂度为O(nlogn)
]]> TCP_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
TCP_socket.settimeout(1)
TCP_socket.connect((host,port))
新建一个TCP socket,并尝试对给定的(host,port)进行TCP连接。为了防止在一个连接上等待太久,将socket的连接超时时间设置为1s。
因为这是一个I/O操作,为了处理可能出现的异常,用try...except模块来进行异常处理。我们希望在连接成功时能够输出该次连接开放的端口,并将开放的端口总数+1,在连接失败时不采取任何操作。
global OpenPortNum
try:
TCP_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
TCP_socket.settimeout(1)
TCP_socket.connect((host,port))
lock.acquire()
OpenPortNum+=1
print('port %d : open'%port)
lock.release()
TCP_socket.close()
except:
pass
因为每个线程不能同时修改OpenPortNum,所以先使用lock.acquire()获得一个锁,只有有锁的线程能够修改OpenPortNum,操作完后再使用lock.release()释放锁,其他的线程才能继续修改OpenPortNum。
for p in range(1,65535):
t = threading.Thread(target=scan,args=('192.168.109.1',p))
threads.append(t)
t.start()
for t in threads:
t.join
扫描过程如下
1、取出一个端口
2、新建一条线程
3、利用scan函数对该(host,port)进行扫描
4、调用thread.start()方法使扫描的子线程开始工作
5、调用thread.join()方法使主线程阻塞,等子线程死亡后再执行。
完整代码如下
import socket
import threading
lock = threading.Lock()
threads = []
OpenPortNum = 0
def scan(host,port):
global OpenPortNum
try:
TCP_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
TCP_socket.settimeout(1)
TCP_socket.connect((host,port))
lock.acquire()
OpenPortNum+=1
print('port %d : open'%port)
lock.release()
TCP_socket.close()
except:
pass
def main():
for p in range(1,65535):
t = threading.Thread(target=scan,args=('192.168.109.1',p))
threads.append(t)
t.start()
for t in threads:
t.join
print('A total of %d port are opend'%(OpenPortNum))
if __name__ == '__main__':
main()
参考链接:
https://zhuanlan.zhihu.com/p/26419543
https://blog.51cto.com/jackor/2093385
]]>