1.SQL注入
1.1 定义
SQL注入是攻击者通过把SQL命令插入到WEB表单后提交到服务器,最终达到让后台数据库执行恶意的SQL命令的目的,并根据程序返回的结果获得某些攻击者想得知的数据。
其条件有二:
(1)使用用户提交的参数拼接了SQL语句;
(2)拼接后的语句被数据库执行了
select * from user where id='$_GET['x']';
x = 1' or 1 = '1
1.2 危害
- 管理员账户泄露
- 直接被写入webshell
- 用户信息泄露
1.3 类型
- 可显注入
- 报错注入
- 盲注
1.4 常见的SQL注入方式
常规注入、宽字节注入、Base64编码注入、二次编码注入
1.5 防范思路
- PDO参数绑定
$stmt = $dbh->prepare("Insert INTO REGISTRY(name,value) VALUES (:name,:value)");
$stmt->bindParam(':name',$name);
$stmt->bindParam(':value',$value);
- 函数
(1)intval()
当你可以明确参数的类型时,可以使用intval把接收的参数转换一下类型,防止出现非法的参数类型。
$id = intval($)GET['id']);
(2)转义函数
addslashes()、mysql_escape_string()、mysql_real_escape_string()
- 参数规则验证:检查用户输入的合法性(客户端+服务端)、限制表单或者字符串输入的长度。
- 屏蔽错误信息:链接数据库时行首加上@符号
- 权限控制:限制不同账户可以执行的操作。
2.XSS漏洞
2.1 定义
XSS又叫跨站脚本攻击(Cross Site Script,XSS),它指的是攻击者往WEB页面里插入恶意HTML代码,当用户浏览该页面时,嵌入WEB里面的HTML代码会执行,从而达到恶意的目的。
2.2 危害
盗取用户的cookie、盗取管理员账号或者cookie、挂马、发送广告或者垃圾信息
2.3 分类
反射型、存储型、DOM型
2.4 防范思路
- 特殊字符HTML实体转换 htmlspecialchars()
- 标签事件属性黑白名单
- http-only:如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取ckkie内容,这样久增加了cookie的安全性。
- code review
3.CSRF漏洞
3.1 定义
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者“Session Riding,是一种对网站的恶意利用,与XSS不同的是,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。CSRF不大流行合难以防范,所以被认为比XSS更具危险性。
3.2 危害
利用目标用户的合法身份,以目标用户的名义去执行某些非法操作。
3.3 场景
<img src="http://x.com/del.php?id=1">
- 非静态操作
- 没有验证cookie
- 没有验证referer
3.4 防范思路
- Tokie验证:Tokie即”标志“,在计算机认证领域叫令牌,它的作用是在页面或者是cookie里加一个不可预测的字符串,服务器在验证下这个字符串是不是上次访问时留下的,就可以判断是不是可信要求。
- 验证码验证:敏感功能添加验证码操作
4.文件上传
4.1 定义
攻击者可以上传一个可执行的文件到服务器,然后通过某种方式执行,上传的文件可以时木马、病毒、恶意脚本或者Webshell等,这些攻击方式带来的危害时最直接的,且文件上传漏洞的利用门槛也比较低,是一种较广泛且高危的漏洞。
4.2 危害
后门、命令执行、上传其他恶意文件、修改文件、操作数据库、获取网站数据。
4.3 上传检测手段及绕过
- 文件内容检查:content-type检查、文件头检查、getimagesize()检查、php_exif模块检查、imagecreatefromjpeg二次渲染
- 白名单验证:MIME绕过(Content-type验证)、00截断、配合解析漏洞、大小写
- 黑名单验证:中间件特性、操作系统特性、代码不严谨、语言特性
- 解析漏洞
4.4 防范思路
- 文件上传目录设置为不可执行
- 综合利用各种检测手段【客户端+服务端】
- 使用随机数改写文件名和文件路径
- 定期检查系统日志和服务器日志
- 使用软WAF
5.文件包含漏洞
5.1 定义
将包含的文件设置为变量,用来进行动态调用,若客户端可以调用一个恶意文件,就会造成文件包含漏洞。
5.2 危害
- 读取系统中的敏感文件、源代码文件等。
- 导致执行任意代码
5.3 漏洞成因
- 包含函数通过动态变量的方式引入需要包含的文件
只要使用前四个函数包含一个新文件时,只要文件内容符合PHP语法规范,任何拓展名都可以被PHP解析。后两个函数会造成敏感文件被读取。
include():找不到包含的文件会产生警告(E_WARNING),脚本继续执行
include_once():和include函数类似,唯一区别就是如果该文件的代码已经被包含,则不会再次被包含。
require():找不到包含的文件会产生警告(E_WARNING_ERROR),脚本停止执行。
require_once():和require函数类似,唯一区别就是如果该文件的代码已经被包含,则不会再次被包含。
fopen()
readfile()
- 攻击者能够控制变量
5.4 防范思路
- 严格判断包含中的参数是否被外部可控,因为文件包含漏洞利用成功与否关键点在于被包含的文件是否能被外部控制。
- 路径限制:限制被包含的文件只能在某一文件夹内,一定要禁止目录跳转字符,如../
- 包含文件验证:验证被包含的文件是否时白名单中的一员。
- 尽量不要使用动态包含,可以在需要的页面固定写好,如:include("head.php")
6.文件操作漏洞
6.1 定义
很多网站由于业务需求,往往会提供文件下载或删除的功能块,但是,恶意用户如果利用这种方式下载服务器的敏感文件或删除相关文件,就会对服务器造成威胁。
6.2 危害
下载敏感文件、删除文件
6.3 漏洞成因
使用了相关的危险函数
6.4 防范思路
- 路径限制:限制被包含的文件只能在某一文件夹内,一定要禁止目录跳转字符,如../
- 严格判断参数是否应当被用户所控
- php.ini配置open_basedir限定文件访问范围
7.代码执行漏洞
7.1 定义
指应用程序本身过滤不严,用户可以通过请求将代码注入到应用中,其实SQL注入漏洞也是一种代码执行漏洞。侧重去讲PHP的代码执行漏洞是把代码注入应用中最终到web服务器去执行,相当于一个web后门的存在。
7.2 危害
用函数执行代码,可以被当成webshell来使用
7.3 漏洞成因
- 函数:eval()、assert()、preg_replace()、call_use_func()、array_map()
- 参数可控
7.4 防范思路
用正则表达式来进行白名单限制,以此来限制传入的参数
8.命令执行漏洞
8.1 定义
代码执行漏洞是执行PHP脚本代码,而命令执行漏洞是系统或者应用命令(如cmd或bash命令)。危害性相当大。
8.2 危害
- 继承WebServer的用户权限,一般具有写入权限
- 执行系统命令
8.3 漏洞成因
- 函数:system()、exec()、shell_exec()、passthru()、pcntl_exec()、popen()、proc_open()
- 函数的参数过滤不严
8.4 防范思路
- escapeshellcmd()函数:对字符串中可能会欺骗shell命令执行任意命令得字符进行转义。此函数保护用户输入得数据在传送到exec()或sysytem()函数,或者执行操作符之前进行转义。
- 对传入的参数做白名单限制
9.变量覆盖漏洞
9.1 定义
变量覆盖漏洞值得是用自定义的参数值替换程序原有的变量,变量覆盖漏洞通常需要结合程序的其他功能来完成完整攻击,一般单体作用很小,并不能造成很大危害,但是与其他应用代码或漏洞结合后,其造成的危害可能是无法估量的。
9.2 危害
取决于与哪些功能点结合。
9.2 漏洞成因
①函数使用不当
extract()函数:从数组中将变量导入到当前的符号表
parse_str()函数:解析字符串并且注册成变量
import_request_variable()函数:把GET,POST,COOKIE的参数注册成变量
②由$$变量赋值引发的覆盖
9.3 防范思路
- 在审计的时候要注意$$的赋值语句,使用恰当的方式防止变量覆盖漏洞的发生。
- registerglobals设置为off
- 更加谨慎的设置函数
10.密码逻辑漏洞
10.1 定义
为了防止网站用户遗忘密码造成无法登录,几乎所有提供注册功能的网站都有找回密码的功能。常见的找回密码流程是,填写用户名,验证本人身份,通过修改密码链接或者验证码方式修改密码。这个看似简单的过程中也会发生安全隐患。
10.2 危害
用户信息泄露、管理员密码修改、财产损失
10.3 防范思路
悉知并且了解该功能点可以出现的各种问题,然后从代码层面去避免。