一些基础理论的总结

信息安全/网络安全  面试知识点javascript

本身总结,总有不足,欢迎留言,不胜感激。php

 

面试总得来讲分红四个大部分,即计算机网络,网络编程,WEB安全技术,Linux系统html

 

1、计算机网络前端

 

网络七层协议?java

 

从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层python

 

 

 

三次握手?linux

TCP在传输以前会进行三次沟通,通常称为“三次握手”,传完数据断开的时候要进行四次沟通,通常称为“四次挥手”。git

两个序号和三个标志位:web

  (1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
  (2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
  (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义以下:
  (A)URG:紧急指针(urgent pointer)有效。
  (B)ACK:确认序号有效。
  (C)PSH:接收方应该尽快将这个报文交给应用层。
  (D)RST:重置链接。
  (E)SYN:发起一个新链接。
  (F)FIN:释放一个链接。

 须要注意的是:
  (A)不要将确认序号ack与标志位中的ACK搞混了。
  (B)确认方ack=发起方req+1,两端配对。
面试

在第一次消息发送中,A随机选取一个序列号做为本身的初始序号发送给B;第二次消息B使用ack对A的数据包进行确认,

由于已经收到了序列号为x的数据包,准备接收序列号为x+1的包,因此ack=x+1,同时B告诉A本身的初始序列号,就是seq=y;

第三条消息A告诉B收到了B的确认消息并准备创建链接,A本身此条消息的序列号是x+1,因此seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。

四次挥手:

因为TCP链接时全双工的,所以,每一个方向都必需要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的链接,

收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,可是在这个TCP链接上仍然可以发送数据,直到这一方向也发送了FIN。

首先进行关闭的一方将执行主动关闭,而另外一方则执行被动关闭,上图描述的便是如此。
 (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
 (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

(1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。
(2)为何创建链接是三次握手,而关闭链接倒是四次挥手呢?
  这是由于服务端在LISTEN状态下,收到创建链接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭链接时,收到对方的FIN报文时,

仅仅表示对方再也不发送数据了可是还能接收数据,己方也未必所有数据都发送给对方了,因此己方能够当即close,也能够发送一些数据给对方后,

再发送FIN报文给对方来表示赞成如今关闭链接,所以,己方ACK和FIN通常都会分开发送。

为何TIME_WAIT状态须要通过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

不该该是为了防止B发送的FIN=1的包的丢失,由于若是A没有收到来自B的释放链接请求,是不会进入TIME-WAIT状态的。

因此正确的解释是:A发送的确认释放链接信息B没有收到,这时候B会再次发送一个FIN=1的释放链接请求,而这个时候A还处于TIME-WAIT,因此能够再次发送确认信息

 

 

标准Http协议支持六种请求方法

一、GET       GET能够说是最多见的了,它本质就是发送一个请求来取得服务器上的某一资源。资源经过一组HTTP头和呈现据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。

二、POST      向服务器提交数据。这个方法用途普遍,几乎目前全部的提交操做都是靠这个完成。

三、PUT      这个方法比较少见。HTML表单也不支持这个。本质上来说, PUT和POST极为类似,都是向服务器发送数据,但它们之间有一个重要区别,PUT一般指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器本身决定。

四、Delete    删除某一个资源。基本上这个也不多见,不过仍是有一些地方好比amazon的S3云服务里面就用的这个方法来删除资源。

五、HEAD    HEAD和GET本质是同样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能以为这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,咱们一般使用GET,但这里用HEAD则意义更加明确。

六、Options    它用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。

 

 

http请求头

通常状况:

Accept
Accept-Encoding
Accept-Language
Connection
Cookie
Host
Referer
User-Agent

 

 

socket原理
       Socket链接,至少须要一对套接字,分为clientSocket,serverSocket.链接分为3个步骤:
服务器监听:服务器并不定位具体客户端的套接字,而是时刻处于监听状态.
客户端请求:客户端的套接字要描述它要链接的服务器的套接字.提供地址和端口号,而后向服务器套接字提出链接请求.
链接确认:当服务器套接字收到客户端套接字发来的请求后,就响应客户端套接字的请求,并创建一个新的线程,把服务器端的套接字的描述发给客户端,一旦客户端确认了此描述,就正式创建链接.而服务器套接字继续处于监听状态,继续接收其余客户端套接字的链接请求.

 客户端:

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)      #定义socket类型,网络通讯,TCP
s.connect((HOST,PORT))       #要链接的IP与端口

 

 

TCP与UDP的区别
1.基于链接与无链接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

 

 

 

WEB安全技术

SQL注入漏洞

SQL注入漏洞的造成缘由:用户输入的数据被SQL解释器执行

SQL的注入类型有如下5种:

  1. Boolean-based blind SQL injection(布尔型注入)
  2. Error-based SQL injection(报错型注入)
  3. UNION query SQL injection(可联合查询注入)
  4. Stacked queries SQL injection(可多语句查询注入)
  5. Time-based blind SQL injection(基于时间延迟注入)

Boolean-based blind SQL injection(布尔型注入)


经过判断页面返回状况得到想要的信息。

以下SQL注入: http://hello.com/view?id=1 and substring(version(),1,1)=5

若是服务端MySQL版本是5.X的话,那么页面返回的内容就会跟正常请求同样。攻击者就能够经过这种方式获取到MySQL的各种信息。

Error-based SQL injection(报错型注入)


若是页面可以输出SQL报错信息,则能够从报错信息中得到想要的信息。

典型的就是利用group by的duplicate entry错误。关于这个错误,貌似是MySQL存在的 bug

以下SQL注入: http://hello.com/view?id=1%20AND%20(SELECT%207506%20FROM(SELECT%20COUNT(*),CONCAT(0x717a707a71,(SELECT%20MID((IFNULL(CAST(schema_name%20AS%20CHAR),0x20)),1,54)%20FROM%20INFORMATION_SCHEMA.SCHEMATA%20LIMIT%202,1),0x7178786271,FLOOR(RAND(0)*2))x%20FROM%20INFORMATION_SCHEMA.CHARACTER_SETS%20GROUP%20BY%20x)a)

在抛出的SQL错误中会包含这样的信息: Duplicate entry 'qzpzqttqxxbq1' for key 'group_key',其中qzpzq和qxxbq分别是0x717a707a71和0x7178786271,用这两个字符串包住了tt(即数据库名),是为了方便sql注入程序从返回的错误内容中提取出信息。

UNION query SQL injection(可联合查询注入)


最快捷的方法,经过UNION查询获取到全部想要的数据,前提是请求返回后能输出SQL执行后查询到的全部内容。

以下SQL注入:http://hello.com/view?id=1 UNION ALL SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME FROM INFORMATION_SCHEMA.SCHEMATA

Stacked queries SQL injection(可多语句查询注入)


即可以执行多条查询语句,很是危险,由于这意味着可以对数据库直接作更新操做。

以下SQL注入:http://hello.com/view?id=1;update t1 set content = 'aaaaaaaaa'

在第二次请求 http://hello.com/view?id=1时,会发现全部的content都被设置为aaaaaaaaa了。

Time-based blind SQL injection(基于时间延迟注入)


页面不会返回错误信息,不会输出UNION注入所查出来的泄露的信息。相似搜索这类请求,boolean注入也无能为力,由于搜索返回空也属于正常的,这时就得采用time-based的注入了,即判断请求响应的时间,但该类型注入获取信息的速度很是慢。

以下SQL注入:http://hello.com/view?q=abc' AND (SELECT * FROM (SELECT(SLEEP(5)))VCVe) OR 1 = '

该请求会使MySQL的查询睡眠5S,攻击者能够经过添加条件判断到SQL中,好比IF(substring(version(),1,1)=5, sleep(5), ‘t’) AS value就能作到相似boolean注入的效果,若是睡眠了5s,那么说明MySQL版本为5,不然不是,但这种方式获取信息的速度就会很慢了,由于要作很是多的判断,而且须要花时间等待,不断地去测试出相应的值出来。

 

SQL注入解决方案
解决SQL注入问题的关键是对全部可能来自用户输入的数据进行严格的检查、对数据库配置使用最小权限原则。
常用的方案有:
全部的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎全部的数据库系统都提供了参数化SQL语句执行接口,使用此接口能够很是有效的防止SQL注入攻击。
对进入数据库的特殊字符('"\<>&*;等)进行转义处理,或编码转换。特殊符号过滤或转义处理。以PHP为例,一般是采用 addslashes() 函数,它会在指定的预约义字符前添加反斜杠转义,这些预约义的字符是:单引号 (') 双引号 (") 反斜杠 (\) NULL。
确认每种数据的类型,好比数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。
数据长度应该严格规定,能在必定程度上防止比较长的SQL注入语句没法正确执行。
网站每一个数据层的编码统一,建议所有使用UTF-8编码,上下层编码不一致有可能致使一些过滤模型被绕过。(MYSQL用GBK的编码时,宽字节注入:输入%df’时通过addslashes转义变成 %dF%5C%27 在经过GBK编码后变成 運’)严格限制网站用户的数据库的操做权限,给此用户提供可以知足其工做的权限,从而最大限度的减小注入攻击对数据库的危害。
避免网站显示SQL错误信息,好比类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
在网站发布以前建议使用一些专业的SQL注入检测工具进行检测,及时修补这些SQL注入漏洞。

 

这里咱们看一下通常的CMS是怎么过滤的,通常会写一个函数,用的时候直接调用,我之前审计过的一篇文章(http://www.cnblogs.com/Oran9e/p/7944859.html)

xdcms_3.0.0 存在SQL注入漏洞,过滤的话是把所过滤的关键字都写在一个函数 safe_html ()函数

function safe_html($str){
    if(empty($str)){return;}
    $str=preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file
|outfile/','',$str);
    return htmlspecialchars($str);
}

分析一下这个过滤函数,只是简单的把上面看到的 select ,insert,update 等等替换成了空 。

在 safe_html 处虽然过了个SQL注入的敏感词,还过滤了=和*,可是没有考虑SQL注入敏感词的大小写,这里只过滤了小写,那么咱们用大写绕过,这里过滤的=和*,咱们可使用不带*和=的常规保存SQL注入语句

这里利用报错注入来进行测试,bestorange' or updatexml(1,concat(0x7e,(selEct concat(username,0x23,password) frOm c_admin),0x7e),1) #&password=bestorange

payload:username=bestorange' or updatexml(1,concat(0x7e,(selEct concat(username,0x23,password) frOm c_admin),0x7e),1) #&password=bestorange&password2=bestorange&fields%5Btruename%5D=bestorange&fields%5Bemail%5D=bestorange&submit=+%E6%B3%A8+%E5%86%8C+

 

 

 

 

XSS漏洞

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。 xss分为存储型的xss和反射型xss, 基于DOM的跨站脚本XSS。

反射型:

一些经常使用的payload:

"/><script>confirm(1234)</script>
'><style/onl<meta>oad=alert(/orange/)%2b'
</textarea> <svg/onload="alert(1)">
<img src="javascript:alert('XSS')">
"><img src=hi onerror=alert(1)>
<svg onload=alert(1)>
<svg onload=alert(document.cookie)>
<IFRAME src=javascript:alert('52')></IFRAME>

 

存储型:

反射型XSS与DOM型XSS都必须依靠用户手动去触发,而存储型XSS却不须要。

 

基于DOM的跨站脚本XSS:经过访问document.URL 或者document.location执行一些客户端逻辑的javascript代码。不依赖发送给服务器的数据。

DOM包含一个对象叫document,document里面有个URL属性,这个属性里填充着当前页面的URL。当解析器到达javascript代码,它会执行它而且修改你的HTML页面。假若代码中引用了document.URL,那么,这部分字符串将会在解析时嵌入到HTML中,而后当即解析,同时,javascript代码会找到(alert(…))而且在同一个页面执行它,这就产生了xss的条件。IE6下没有转换<和>

<HTML>
<TITLE>Welcome!</TITLE>
Hi
<SCRIPT>
var pos=document.URL.indexOf("name=")+5;
document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
<BR>
Welcome to our system
…
</HTML>

 

 

DOM型XSS是前端代码中存在了漏洞,而反射型是后端代码中存在了漏洞。反射型和存储型xss是服务器端代码漏洞形成的

存储型XSS其实和反射型XSS差很少,只是存储型把数据保存到服务端,而反射型只是让XSS游走在客户端上

XSS防护的整体思路是:对输入(和URL参数)进行过滤,对输出进行编码

也就是对提交的全部内容进行过滤,对url中的参数进行过滤,过滤掉会致使脚本执行的相关内容;而后对动态输出到页面的内容进行html编码,使脚本没法在浏览器中执行。虽然对输入过滤能够被绕过,可是也仍是会拦截很大一部分的XSS攻击

XSS 通常读取用户浏览器中的Cookie,而若是在服务器端对 Cookie 设置了HttpOnly 属性,那么就不能读取到cookie

在输出数据以前对潜在的威胁的字符进行编码、转义是防护XSS攻击十分有效的措施。经常使用 htmlspecialchars()函数进行编码。

对于输入,处理使用XSS filter以外,对于每个输入,在客户端和服务器端还要进行各类验证,验证是否合法字符,长度是否合法,格式是否正确。在客户端和服务端都要进行验证,由于客户端的验证很容易被绕过。其实这种验证也分为了黑名单和白名单。黑名单的验证就是不能出现某些字符,白名单的验证就是只能出现某些字符。尽可能使用白名单。

 
 
 
文件上传漏洞
截断上传:截断的核心,就是chr(0)这个字符,这个字符不为空(Null),也不是空字符("")。
当程序在输出含有chr(0)变量时,chr(0)后面的数据会被中止,换句话说,就是误把它当成结束符,后面的数据直接忽略,这就致使漏洞产生
 

文件上传应该是最经常使用的漏洞了,上传函数就那一个 move_uploaded_file();通常来讲找这个漏洞就是直接ctrl+f 直接开搜。遇到没有过滤的直接传个一句话的webshell上去。

上传的漏洞比较多,Apache配置,iis解析漏洞等等。在php中通常都是黑白名单过滤,或者是文件头,content-type等等。通常来找上传的过滤函数进行分析就行。

(1) 未过滤或本地过滤:服务器端未过滤,直接上传PHP格式的文件便可利用。

(2) 黑名单扩展名过滤:限制不够全面:IIS默认支持解析.asp,.cdx, .asa,.cer等。不被容许的文件格式.php,可是咱们能够上传文件名为1.php (注意后面有一个空格)

(3) 文件头 content-type验证绕过:getimagesize()函数:验证文件头只要为GIF89a,就会返回真。限制$_FILES["file"]["type"]的值 就是人为限制content-type为可控变量。

(4)过滤不严或被绕过:好比大小写问题,网站只验证是不是小写,咱们就能够把后缀名改为大写。

(5)文件解析漏洞:好比 Windows 系统会涉及到这种状况:文件名为1.php;.jpg,IIS 6.0 可能会认为它是jpg文件,可是执行的时候会以php文件来执行。咱们就能够利用这个解析漏洞来上传。再好比 Linux 中有一些未知的后缀,好比a.php.xxx。因为 Linux 不认识这个后缀名,它就可能放行了,攻击者再执行这个文件,网站就有可能被控制。

(6)路径截断:就是在上传的文件中使用一些特殊的符号,使文件在上传时被截断。好比a.php%00.jpg,这样在网站中验证的时候,会认为后缀是jpg,可是保存到硬盘的时候会被截断为a.php,这样就是直接的php文件了。经常使用来截断路径的字符是:\0  , ?  ,  %00  ,   也能够超长的文件路径形成截断。

文件上传修复建议:文件上传的目录设置为不可执行,使用随机数改写文件名和文件路径:一个是上传后没法访问;再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将由于重命名而没法攻击。判断文件类型:强烈推荐白名单方式。
 

 

 

文件包含

 PHP的文件包含能够直接执行包含文件的代码,包含的文件格式是不受限制的,只要能正常执行便可。

文件包含有这么两种:本地包含(LFI)和远程包含(RFI)。,顾名思义就能理解它们的区别在哪。

审计的时候函数都是同样的,这个四个包含函数: include() ; include_once() ; require();require_once().include 和 require 语句是相同的,除了错误处理方面:require 会生成致命错误(E_COMPILE_ERROR)并中止脚本,include 只生成警告(E_WARNING),而且脚本会继续。

先说一下本地包含,本地包含就指的是只能包含本机文件的漏洞,通常要配合上传,或者是已控的数据库来进行使用。

再来看一下远程文件包含

当服务器的php配置中选项allow_url_fopen与allow_url_include为开启状态时,服务器会容许包含远程服务器上的文件。若是对文件来源没有检查的话,就容易致使任意远程代码执行。allow_url_include在默认状况下是关闭的,若是想要实验测试的话,能够去打开,可是真实环境中建议关闭。

漏洞修复建议:1.PHP中可使用open_basedir配置限制访问限制在指定的区域。2.对文件路径参数过滤./ \等字符。3.禁止服务器远程文件包含。

 

 

任意文件上传/下载/删除 漏洞

因为对用户上传的文件未进行严格过滤,用户能够把包含某些代码的脚本文件上传到服务器,从而获取WebShell。经过使用WebShell,攻击者能够控制服务器的文件系统,操做数据库,执行系统命令等,从而给目标服务器带来不可逆转的损失。

攻击者经过任意文件下载漏洞能够遍历目标服务器的文件系统,得到某些敏感配置文件或源代码文件的内容。

因为未对用户删除的文件作严格的权限控制或缺少判断,攻击者经过遍历能够删除网站服务器上的其它文件,从而致使网站中止服务或丢失数据。

1.攻击者能够经过上传漏洞获取WebSell从而控制目标服务器。

2.攻击者经过任意文件下载漏洞能够获取服务器上的敏感配置文件或源码文件内容。
3.攻击者经过任意文件删除漏洞能够干扰网站的正常运行致使网站中止服务和丢失数据。

漏洞修复建议:1.对于文件上传能够采用白名单的形式限制上传后缀,同时采用从新随机命名的方式进行重命名。并且应当限制上传目录不可执行源码脚本或程序。

2.对于任意文件下载或删除漏洞能够过滤用户输入参数中的./\等字符,限定可操做的文件在容许的目录范围内。

 

 

目录遍历漏洞

目录遍历漏洞是指经过在URL或参数中构造“../”,或“../”和相似的跨父目录字符串的ASCII编码、unicode编码等,完成目录跳转,读取操做系统特殊目录下的文件列表或文件内容。

目录遍历漏洞容许恶意攻击者突破Web应用程序的安全控制,直接访问攻击者想要的敏感数据。包括配置文件、日志、源代码、文件列表等,配合其它漏洞的综合利用,攻击者能够轻易的获取更高的权限。

漏洞修复建议:1.对网站用户提交过来的文件名进行硬编码或者统一编码,对文件后缀进行白名单控制,对包含了恶意的符号或者空字节进行拒绝。

2.Web应用程序可使用chrooted环境访问包含被访问文件的目录,或者使用绝对路径+参数来控制访问目录,使其即便是越权或者跨越目录也是在指定的目录下。

 

 

非受权访问

能够理解为须要安全配置或权限认证的受权页面能够直接访问。

1.重要权限可被操做。
2.重要信息泄露。

漏洞修复建议:涉及用户操做的功能增强权限验证。

 

 

代码执行

代码执行审计和sql漏洞审计很类似,sql注入是想sql语句注入在数据库中,代码执行是将可执行代码注入到webservice 。这些容易致使代码执行的函数有如下这些:eval(), asset() , preg_replace(),call_user_func(),call_user_func_array(),array_map()其中preg_replace()须要/e参数。

代码执行注入就是 在php里面有些函数中输入的字符串参数会当作PHP代码执行。

Eval函数在PHP手册里面的意思是:将输入的字符串编程PHP代码

 

 命令执行

代码执行说的是可执行的php脚本代码,命令执行就是能够执行系统命令(cmd)或者是应用指令(bash),这个漏洞也是由于传参过滤不严格致使的,

通常咱们说的php可执行命令的函数有这些:system();exec();shell_exec();passthru();pcntl_exec();popen();proc_open();

反引号也是能够执行的,由于他调用了shell_exec这个函数。

漏洞修复建议:1.对用户输入的参数进行转义和过滤。2.对于PHP尽可能少用可能形成代码或命令执行的函数,并在disable_functions中禁用。

 

 

 

CSRF 漏洞
csrf 和 xss 常常做为比较(实例分析:http://www.cnblogs.com/Oran9e/p/8667212.html)

XSS: 经过客户端脚本语言(最多见如:JavaScript),在一个论坛发帖中发布一段恶意的JavaScript代码就是脚本注入,若是这个代码内容有请求外部服务器,那么就叫作XSS!

CSRF:冒充用户发起请求(在用户不知情的状况下),完成一些违背用户意愿的请求(如恶意发帖,删帖,改密码,发邮件等)。

一个论坛,通过个人屡次抓包分析(着重分析请求返回头,请求返回体)了解到这个论坛的删帖操做是触发 csdnblog.com/bbs/delete_article.php?id=“X" 那么,我只须要在论坛中发一帖,包含一连接:www.csdnblog.com/bbs/delete_article.php?id=“X" ,只要有用户点击了这个连接,那么ID为X的这一篇文章就被删掉了,并且是用户彻底不知情的状况(敲黑板状:此处我可没有写XSS脚本哦,我纯粹是发一个url地址出来而已,既然删除操做能够伪造,那么只要我细细分析,其余操做(发帖,更名字,发私信,只要是这个论坛具备的功能)我均可以伪造咯!
漏洞修复建议: 一、 经过token或者session来判断当前用户身份。二、 敏感操做须要验证码,更改密码须要验证老密码。
 
 
 
SSRF 漏洞

SSRF漏洞是如何产生的?

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造造成由服务端发起请求的一个安全漏洞。通常状况下,SSRF攻击的目标是从外网没法访问的内部系统。(正是由于它是由服务端发起的,因此它可以请求到与它相连而与外网隔离的内部系统)

SSRF 造成的缘由大都是因为服务端提供了从其余服务器应用获取数据的功能且没有对目标地址作过滤与限制。好比从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。

目标网站接受请求后在服务器端验证请求是否合法

攻击者利用SSRF能够实现的攻击主要有3种:

一、获取web应用可达服务器服务的banner信息以及收集内网web应用的指纹识别,如开放的端口,中间件版本信息等。

二、攻击运行在内网的系统或应用程序,获取内网各系统弱口令进行内网漫游、对有漏洞的内网web应用实施攻击获取webshell,如st2命令执行、discuz ssrf经过redis实施getshell等。

三、利用有脆弱性的组件结合ftp://,file:///,gopher://,dict://等协议实施攻击。如FFmpeg任意文件读取,xxe攻击等。

生的缘由:服务器端的验证并无对其请求获取图片的参数(image=)作出严格的过滤以及限制,致使能够从其余服务器的获取必定量的数据 

SSRF漏洞就是经过篡改获取资源的请求发送给服务器,可是服务器并无发如今这个请求是合法的,而后服务器以他的身份来访问其余服务器的资源。

 file_get_contents() fsockopen() curl_exec()以上三个函数使用不当会形成SSRF漏洞
 漏洞修复建议:限制协议为HTTP、HTTPS,禁止30x跳转,设置URL白名单或者限制内网IP
 

 

CSRF 和 XSS 和 XXE 有什么区别,以及修复方式?

XSS是跨站脚本攻击,用户提交的数据中能够构造代码来执行,从而实现窃取用户信息等攻击。修复方式:对字符实体进行转义、使用HTTP Only来禁止JavaScript读取Cookie值、输入时校验、浏览器与Web应用端采用相同的字符编码。

CSRF是跨站请求伪造攻击,XSS是实现CSRF的诸多手段中的一种,是因为没有在关键操做执行时进行是否由用户自愿发起的确认。修复方式:筛选出须要防范CSRF的页面而后嵌入Token、再次输入密码、检验Referer 
XXE是XML外部实体注入攻击,XML中能够经过调用实体来请求本地或者远程内容,和远程文件保护相似,会引起相关安全问题,例如敏感文件读取。修复方式:XML解析库在调用时严格禁止对外部实体的解析。

 

 

CSRF、SSRF和重放攻击有什么区别?

CSRF是跨站请求伪造攻击,由客户端发起 
SSRF是服务器端请求伪造,由服务器发起 
重放攻击是将截获的数据包进行重放,达到身份认证等目的
 

 

 

Linux系统 

Linux如何查看端口

netstat -tunlp |grep 端口号,用于查看指定的端口号的进程状况,如查看8000端口的状况,netstat -tunlp |grep 8000

ps -aux /  ps aux |more

netstat -an | more

 

linux查找文件

find / -name httpd.conf

根据部分文件名查找方法:find /etc -name '*srm*'    find /etc -name '*.html'

find / -amin -10 # 查找在系统中最后10分钟访问的文件

find / -atime -2 # 查找在系统中最后48小时访问的文件

find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件

r:4    w:2    x:1   

rwx=7

 

 linux 日志分析

日志的主要用途是系统审计、监测追踪和分析统计。

/var/log/wtmp    该日志文件永久记录每一个用户登陆、注销及系统的启动、停机的事件。所以随着系统正常运行时间的增长该文件的大小也会愈来愈大增长的速度取决于系统用户登陆的次数。该日志文件能够用来查看用户的登陆记录last命令就经过访问这个文件得到这些信息并以反序从后向前显示用户的登陆记录last也能根据用户、终端 tty或时间显示相应的记录。

/var/run/utmp    该日志文件记录有关当前登陆的每一个用户的信息。

/var/log/lastlog    是日志子系统的关键文件都记录了用户登陆的状况。

 

find”程序能够查找到这些隐含文件。例如:

    # find  / -name ".. *" -print –xdev

    # find  / -name "…*" -print -xdev | cat -v

 同时也要注意象.xx”和“.mail”这样的文件名的。

 

 

linux查看防火墙状态:service iptables status

开启防火墙:service iptables start

关闭防火墙:service iptables stop

 

 

 

网络编程


python,php

代码渣渣。。。

 就贴上写过的python小脚本吧。

 

百度搜索引擎爬取子域名的代码

 

#coding=utf-8
import re
import requests
sites = []
for i in range(0,10):   #10页为例
    i = i*10
    url = 'http://www.baidu.com/s?wd=site:qq.com&pn=%s' %i     #设定url请求
    response = requests.get(url).content   #get请求,content获取返回包正文
    baidudomain = re.findall('style="text-decoration:none;">(.*?)/',response)
    sites += list(baidudomain)
site = list(set(sites))  #set()实现去重
print site
print "\nThe number of sites is %d" %len(site)
for i in site:
    print i

 

 

 

爬虫--edusrc的礼品

# -*-coding:utf-8-*-  
import re
import requests
from bs4 import BeautifulSoup
import urllib
headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"}##浏览器请求头
all_url = 'https://src.edu-info.edu.cn/gift/'   ##开始的URL地址
start_htm = requests.get(all_url,headers=headers)##reques中的get方法来得到all_url
start_html = start_htm.content
#start_html = start_html.text.encode('GB18030')  ##编码
Soup = BeautifulSoup(start_html,'lxml')   ##使用BeautifulSoup来解析咱们获取的网页(‘lxml’是指指点的解析器)
##li_list = Soup.find_all('li')  ##使用BeautifulSoup解析网页事后就能够找标签(‘find_all’是指查找指定网页的全部标签的意思,find_all返回的是一个列表。))
#all_a = Soup.find('span',class_='pic-caption come-left').find_all('a')
#p=re.compile(r"/gift/.*?/")
#all_a=Soup.find_all('a',attrs={'href':p})
#for a in all_a:
#	title = a.get_text()
#	print(title)

print("----------------------------")
all_a = Soup.find_all('span',class_='pic-caption come-left')
for a in all_a:
	print("----------")
	b = a.contents
	for c in b:
		print c.string
##for li in li_list:
##	print(li)
##print(start_html)

 

 

 

产生随机密码

#!/usr/bin/env python
from random import choice
import string
def GenPasswd(length=8, chars=string.letters+string.digits):
        return ''.join([ choice(chars) for i in range(length)])

 

 

 

 

python简单的一些实用

>>> import base64
>>> base64.b64encode('orange')
'b3Jhbmdl'
>>> base64.b64decode('b3Jhbmdl')
'orange'

 

 

>>> import md5
>>> m=md5.new()
>>> m.update("orange")
>>> md5value=m.hexdigest()
>>> print md5value
fe01d67a002dfa0f3ac084298142eccd

 

//append() 方法用于在列表末尾添加新的对象。

>>> list=[1,2,3,4]
>>> list.append(5)
>>> print list
[1, 2, 3, 4, 5]

 

利用函数把 seq 变成x?
seq= [0, 1, 2, 3, 4, 5]
x = ['1', '2', '3', '4', '5']

 

s=[]
seq=[0,1,2,3,4]
for i in seq:
    s=s+list(str(i))
print s

 

x=[str(i) for i in seq]

 

map(str,range(1,6))  //map迭代

相关文章
相关标签/搜索