系统的讲解-PHP-WEB-安全防御

42次阅读

共计 4131 个字符,预计需要花费 11 分钟才能阅读完成。

常见漏洞

看到上图的漏洞是不是特别熟悉,如果不进行及时防御,就会产生蝴蝶效应。

往下看,可能会找到你要的答案。

SQL 注入攻击

定义

SQL 注入攻击是通过 WEB 表单提交,在 URL 参数提交或 Cookie 参数提交,将怀有恶意的“字符串”,提交给后台数据库,欺骗服务器执行恶意的 SQL 语句。

案例

// 以用户登录为例,当验证用户名和密码是否正确时
$sql = "SELECT * FROM user WHERE 
        username = '".$_GET['username']."' AND 
        password = '".$_GET['password']."'";

用户恶意输入:

$_GET['username'] = "'or 1=1 --'";
$_GET['password'] = "123456";

注入后的 Sql 语句:

$sql = "SELECT * FROM user WHERE username ='' 
        or 1=1 -- ''AND password ='123456'";

执行注入后的 Sql 语句,可以返回 user 表的全部数据。

平时我们可以进行自测,比如使用单引号、双引号,如果是数字进行 + 1 或 -1。

SQL 注入的危害很大,利用 SQL 注入可以进行,拖库 删库 删表 UDF 提权 读取文件

推荐一个开源的自动化的 SQL 注入工具。

SQLmap:http://sqlmap.org/

  • 支持各种数据库管理系统(MySql、Oracle、SQL Server、SQLite …)。
  • 支持自动识别密码哈希格式并通过字典破解密码哈希。
  • 支持枚举用户、密码、哈希、权限、角色、数据库、数据表和列。
  • 支持完全地下载某个数据库中的某个表、某个列。
  • 支持在数据库管理系统中搜索指定的数据库名、表名或列名。
  • 支持下载或上传文件。
  • 支持执行任意命令并回现标准输出。
  • 支持布尔型盲注、时间型盲注、基于错误信息的注入、联合查询注入和堆查询注入。

尝试着利用工具,注入自己的项目,发现问题,然后解决问题。

SQL 注入的危害,远比我们想象的要大!

防御

推荐解决方案是使用 PDOMySQLi 的数据库扩展。

PHP 官方文档中介绍,MySQL 扩展自 PHP 5.5.0 起已废弃,并在自 PHP7.0.0 开始被移除。

如果已经在用 MySQL 扩展了,可以对传入的每个参数做验证,并使用框架的 ORM 进行查询。

另外:addslashes 和 mysql_real_escape_string 这种转义是不安全的!

XSS 攻击

定义

XSS 攻击是一种经常出现在 WEB 应用中的计算机安全漏洞,通过 WEB 表单提交或在 URL 参数提交将代码植入在用户的使用页面上。

分类

存储型

注入的恶意代码存储在服务器上(常用于留言板、论坛帖子、CRM),受害者请求服务器获取信息的时候,这些恶意代码就被浏览器成功执行。

反射型

注入的恶意代码没有存储在服务器上,通过引诱用户点击一个链接到目标网站进行实施攻击。

DOM 型

注入的恶意代码并未显式的包含在 web 服务器的响应页面中,但会被页面中的 js 脚本以变量的形式来访问到的方式来进行实施攻击。

案例

存储型:论坛帖子界面 input 输入框中,输入 /><script>alert("xss")</script> 进行提交。

反射型:在浏览器输入框中,输入 /xxx.php?name=<script>alert(/xss/)</script>

//DOM 型,代码举例
<script>
var temp = document.URL;
var temp_new = temp+'test'
document.write(decodeURI(temp_new));
</script>

XSS 的危害有很多,包括盗号,挂马,控制受害者机器想其他网站发起攻击 …

自测的方法,看见输入框就输入:/><script>alert("xss")</script> 进行提交。

推荐一个专门针对浏览器攻击的框架。

BeEF:https://beefproject.com/

防御

简单的防御可以对 style、script、image、src、a 等等不安全的因素进行过滤或转义。

可以自己封装一个方法,也可以使用框架的自带方法,比如 xss_clean。

可以利用一些模板引擎避免 XSS 攻击,比如 Laravel 框架使用的 Blade,还有 twig,Smarty 等。

可以利用 HTTP-only,将 cookie 设置成 HTTP-only 防止 XSS 攻击。

// 设置 Cookie
setcookie($name, $value, $expire, $path, $domain, $secure, $httponly); 

// 然后服务端通过使用 $_COOKIE 进行验证。

可以使用 Content Security Policy,它的实质就是白名单制度。

入门教程请参考:http://www.ruanyifeng.com/blo…

SSRF 攻击

定义

SSRF(Server-Side Request Forgery:服务器端请求伪造)是攻击者伪造服务器端发起的请求,虽然攻击者无法从外网访问内网的系统,但是它通过注入恶意代码从服务端发起,通过服务端就再访问内网的系统,然后获取不该获取的数据。

案例

漏洞主要产生在包含这些方法的代码中,比如 curl、file_get_contents、fsockopen。

// 代码片段
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);

请求地址:http://www.xxx.com/demo.php?u…

将 url 参数修改成,file:///etc/passwd,可以获取敏感文件的信息。

将 url 参数修改成,dict://127.0.0.1:3306/info,可以获取目标主机 3306 端口运行的应用。

除了 file 协议,dict 协议,还可以利用 gopher 协议 和 http/https 协议进行攻击。

可以攻击 redis,memcache,内网应用,还可以查看一下敏感文件的信息 等等。

防御

对 curl、file_get_contents、fsockopen 这些方法中的参数进行严格验证!

限制协议只能为 HTTP 或 HTTPS,禁止进行跳转。

如果有白名单,解析参数中的 URL,判断是否在白名单内。

如果没有白名单,解析参数中的 URL,判断是否为内网 IP。

CSRF 攻击

定义

CSRF(Cross-site request forgery:跨站请求伪造)是攻击者通过伪装成受信任的用户,盗用受信任用户的身份,用受信任用户的身份发送恶意请求。

从上图看出,完成一次 CSRF 攻击,需要完成两个步骤:

1. 登录受信任网站 A,本地生成网站 A 的 Cookie。

2. 未退出网站 A 的情况下,访问危险网站 B。

危害

具体危害要看受信任网站是做什么的,如果是社交网站可以操控发广告,如果是电商网站可以操控购物,如果是银行网站甚至还可以操控转账,……

这样危害会造成个人信息的泄露和财产的损失。

防御

Cookie Hashing,表单提交或 Ajax 提交,必须使用 csrf token。

对于不确定是否有 csrf 风险的请求,可以使用验证码(尽管体验会变差)。

对于一些重要的操作(修改密码、修改邮箱),必须使用二次验证。

文件上传漏洞

定义

文件上传漏洞是攻击者上传了一个可执行的文件到服务器上执行。

可执行文件包括有病毒、木马、恶意脚本等。

危害

文件上传漏洞与 SQL 注入或 XSS 相比,其风险更大,如果存在上传漏洞攻击者甚至可以直接上传一个 webshell 脚本到服务器上。

防御

  • 文件扩展名检测
  • 文件 MIME 验证
  • 文件重命名
  • 文件目录设置不可执行权限
  • 设置单独域名的文件服务器

信息泄露

定义

信息泄露主要指用户的手机号、邮箱、密码、身份证、地址等敏感数据泄露,还有服务器上的文件和环境变量等敏感数据泄露,还包括将直接将企业源码上传到开发平台。

案例

比如开发接口时,接口返回明文的手机号。

比如调试代码时,代码中提交了一些调试信息,未进行删除。

……

防御

  • 敏感数据脱敏(比如手机号、身份证、邮箱、地址)。
  • 服务器上不允许提交包含打印 phpinfo、$_SERVER 和 调试信息等代码。
  • 定期从开发平台扫描关于企业相关的源码项目。

越权

定义

“超出了你自己所拥有的权限,干了你本来不可能干的事情。”

水平越权:用户 A 未授权可以访问用户 B 的数据。

垂直越权:未登录用户可以访问需要授权的应用。

举例,本来用户 A 只能查看自己的订单数据,但是他通过修改 URL 参数就能查看到用户 B 的订单数据。

未登录的用户,可以访问到后台模块并进行操作。

防御

对于所有涉及到用户数据的操作,必须严格判断当前用户的身份。

对于所有需要权限控制的位置,必须严格检验用户权限级别。

设计缺陷

返回信息过多

举例,登录时进行验证,当用户不存在时,返回“用户不存在”,当用户被禁用时,返回“用户已被禁用”。

避免攻击者进行恶意尝试,不应该返回过多的信息,可以统一返回“用户名或密码错误”。

短信接口被恶意攻击

举例,注册或登录时用户输入手机号码就可直接触发短信接口,这块最容易被攻击者进行短信轰炸。

应该进行增加接口调用限制:

  • 设置同一手机号短信发送间隔
  • 设置每个 IP 地址每日最大发送量
  • 设置每个手机号每日最大发送量
  • 升级验证码,采用滑动拼图、文字点选、图表点选 …
  • 升级短信接口的验证方法

小结

文章主要讲解了 SQL 注入攻击、XSS 攻击、SSRF 攻击、CSRF 攻击、文件上传漏洞、信息泄露、越权、设计缺陷等八大方面,通过这次的梳理,也使我自己对 PHP WEB 安全防御有了一个全面了解。

同时还要时刻保持警惕,所有用户输入的数据都是不值得信任的,接收到的数据必须经过校验和过滤。

也不要轻易相信从网络上发现的代码,在使用第三方类库或代码时抱有怀疑的态度,要多进行调试和验证,看起来没问题的代码可能隐藏了很多的安全隐患。

最后,推荐一款开源的漏洞演示平台,包含了 100 多个漏洞。

这个是安装在本地的,大家尝试注入恶意代码,同时也警醒自己不要犯这样的错误。

bWAPP:http://www.itsecgames.com/

本文欢迎转发,转发请注明作者和出处,谢谢!

正文完
 0