文章目录
1. 命令注入
1.1 产生原因
在使用常用系统命令执行函数时,未对特殊字符过滤,导致攻击者可以通过构造恶意字符达到执行其他系统命令语句的功能
此类命令执行函数依赖PHP配置文件的设置,如果配置选项 safe_mode 设置为 off,此类命令不可执行,必须设置为 On 的情况下,才可执行。PHP 默认是关闭的。 在安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。这个目录可以在php.ini文件中用 safe_mode_exec_dir指令,或在编译PHP是加上–with-exec-dir选项来指定,默认是/usr/local/php /bin。
PHP程序里面能够执行命令的函数包含:
- exec() 函数
- system() 函数
- passthru() 函数
- popen() 函数
- backtick operator php反引号(``)
- shell_exec() 函数
1.2 防御方法
1、尽量避免使用此类上述函数
2、因其危险性,执行命令的参数不要使用外部获取,防止用户构造。
3、设置 PHP.ini 配置文件中 safe_mode = On 选项。默认为( off );
4、使用自定义函数或函数库来替代外部命令的功能
5、结合使用escapeshellarg、escapeshellcmd函数来处理命令参数
6、使用safe_mode_exec_dir指定可执行文件的路径
esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号“’”,替换成“\’”,双引号“"”,替换成“"”,分号“;”替换成“;” 用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内 safe_mode = On safe_mode_exec_di r= /usr/local/php/bi
参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义。
7、perl、java、python等其他语言如果没有预定义函数的话,自定义函数实现参考php的esacpeshellarg和escapeshellcmd函数;
http://php.net/manual/zh/function.escapeshellarg.php(语义保证不被注入)
2. sql注入
2.1 产生原因
漏洞成因可以归结为以下两个原因叠加造成的:
-
程序编写者在处理应用程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
-
未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。
2.2 防御方法
1、使用自带的预编译进行处理输入参数
2、使用参数检查的方式,针对不同种类的入参位置进行参数过滤
字符型:单引号、双引号,php可使用运用 addslashes函数。
整型:入参后做整型校验 php可使用intval等。
字段名:查询时,先查询该字段是否存在,或者过滤除下划线以外所有特殊符号。
3.在参数即将进入数据库执行之前,对SQL语句的语义进行完整性检查,确认语义没有发生变化
4.在出现SQL注入漏洞时,要在出现问题的参数拼接进SQL语句前进行过滤或者校验,不要依赖程序最开始处防护代码
5.定期审计数据库执行日志,查看是否存在应用程序正常逻辑之外的SQL语句执行
推荐使用1,若采用2的方式进行防范需注意遗漏的情况。
3. XXE攻击
3.1 产生原因
直接获取的用户传递过来的XML内容,没有经过任何处理,最后将其echo出来
3.2 防御方法
-
常见的XML解析方法有:DOMDocument、SimpleXML、XMLReader,这三者都基于 libxml 库解析 XML,所以均受影响,xml_parse 函数则基于 expact 解析器,默认不载入外部 DTD ,不受影响。可以在php解析xml文件之前使用libxml_disable_entity_loader(true)来禁止加载外部实体(对上述三种 XML 解析组件都有效),并使用libxml_use_internal_errors()禁止报错;
-
对用户的输入做过滤,如<、>、’、"、&等
3、升级php至新版本
4. 代码执行漏洞
4.1 产生原因
未对输入的参数过滤,导致攻击者可以构造恶意代码,直接执行预期以外的功能
1、PHP程序里面包含如下能够执行代码的函数:
eval() 函数
assert() 函数
preg_repace() 函数
create_function() 函数
2、其他语言
Python:exec;
Vbscript: Execute、Eval 等等
4.2 防御方法
1、始终对变量初始化。
2、能使用json保存数组、对象就使用json,不要将php对象保存成字符串,否则读取的时候需要使用eval。
3、对于必须使用eval的情况,一定要保证用户不能轻易接触eval的参数(或用正则严格判断输入的数据格式)。对于字符串,一定要使用单引号包裹可控代码,并再插入前进行addslashes:
d
a
t
a
=
a
d
d
s
l
a
s
h
e
s
(
data = addslashes(
data=addslashes(data);
eval("$data = deal(’$data’);");
4、放弃使用preg_replace的e修饰符,而换用preg_replace_callback替代。
5、如果非要使用preg_replace的e模式的话,请保证第二个参数中,对于正则匹配出的对象,用单引号包裹。
5. CSRF
5.1 产生原因
错把“经过认证的浏览器发起的请求”当成“经过认证的用户发起的请求”,当已认证的用户点击攻击者构造的恶意链接后就“被”执行了相应的操作。
防御方法
1.referer校验
检测HTTP header中的referer字段。服务器可以查看referer是否为自己的站点,如果不是,则拒绝服务。
2.token校验
在重要请求中的每一个URL和所有的表单中添加token
3.COR安全设置
6. 文件上传漏洞
6.1 产生原因
服务器端未对上传的文件格式做合理的校验
6.2 防御方法
通过以上的攻击例子,我们就可以进行安全编码,阻止攻击者进行上传非法文件。我们采取以下方法进行防范:
1、使用 PHP 的 getimagesize() 函数验证图片类型,其他开发语言可使用类似可读取图片某个特征属性的参数进行图片类型验证。。
2、验证 上传文件的扩展名,以白名单、黑名单方式,最好使用白名单。
3、当用户上传文件到服务器保存时,一定使用随机文件名进行存储,并保证所存储的扩展名合法。保证文件名的冲突性,也保证了存储的安全,防止上传文件非法扩展进行解析。
4、如果条件允许的情况下,建议上传到非web的指定目录以及单独的文件服务器上。
7. 文件包含
7.1 产生原因
php代码中使用了一些特殊的函数,并且没有对用户输入的参数做过滤。 可引发文件包含的函数为:
include()
include_once()
require()
require_once()
spl_autoload() (PHP 5 >= 5.1.2)
其他开发语言中若存在类似功能的函数,若输入参数用户可控,则可能存在文件包含风险。(相对出现的很少)
7.2 防御方法
1、保证参数不可构造性。
2、使用 basename() 函数处理参数。
3、对所有的变量初始化
PHP文件包含漏洞总结:http://drops.wooyun.org/tips/3827
8. SSRF
8.1 产生原因
常见于参数中涉及ip、url地址以及后端有通信功能的业务场景。如:
1)分享:通过URL地址分享网页内容
2)转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3)在线翻译:通过URL地址翻译对应文本的内容。
4)图片加载与下载:通过URL地址加载或下载图片。
5)图片、文章收藏功能
8.2 防御方法
1、过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2、统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3、限制请求的端口为http常用的端口,比如80,443,8080,8090。
4、禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///, gopher:// , ftp:// 等引起的问题。
5、过滤内网ip,限制访问内网
9. XSS
9.1 产生原因
造成XSS漏洞的原因就是,攻击者的输入没有经过严格的控制,最终显示给来访的用户,攻击者通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java, VBScript, ActiveX, Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、个人网页内容、会话和cookie等各种内容。
1、非持久型
通过 GET、POST、referer 等参数未加处理直接输出到页面执行。该类型是最为常见的,攻击者主要利用此类型通过email、热度非常大的论坛、或者有针对性的某一用户发送一个隐藏性的链接,让受害者进行点击触发。
2、持久型
由攻击者输入恶意数据保存在数据库,再由服务器脚本程序从数据库中读取数据,然后显示在公共显示的固定页面上,那么所有浏览该页面的用户都会被攻击。该类型攻击性非常大,危险也非常大。
3、DOM型
由Javascript 脚本动态创建、输出到页面造成的。该类型不容易发现,具有隐藏性的特点,必需手工去发现。
4、浏览器漏洞造成
在某个浏览器版本造成的漏洞,由浏览于用户浏览历史、页面交互等方式,未加处理,所造成的。该漏洞攻击危害非常大,一旦存在,基本可以实现跨域操作,严重者可以以本地权限执行 javascript 脚本,访问读取本地文件。
常见场景: 1.回帖,评论,用户输入在页面直接进行显示,没有进行过滤。
2.用户反馈,客服提问,输入的恶意脚本在后台进行了执行,窃取后台管理员cookie等信息。
3.搜索展示搜索结果的时候直接展示用户输入。
9.2 防御方法
1. 使用转义函数
常用php转义函数
1、htmlspecialchars() 函数。
用于转义处理在页面上显示的文本。
2、htmlentities() 函数。
用于转义处理在页面上显示的文本。
3、strip_tags() 函数。
过滤掉输入、输出里面的恶意标签。
4、header() 函数。
使用header(“Content-type: application/json”); 用于控制 json 数据的头部,不用于浏览。
5、urlencode() 函数。
用于输出处理 字符型参数带入页面 链接中。
6、intval() 函数
用于处理数值型参数输出页面中。
7、自定义函数。
在大多情况下,要使用一些常用的 html 标签,以美化页面显示,如留言、小纸条。那么在这样的情况下,要采用白名单的方法使用合法的标签显示,过滤掉非法的字符。
基于黑名单和白名单过滤
基于黑名单的过滤和基于白名单的过滤。后者的防御效果往往更好,对于用户在白名单之外的输入,可以直接忽略。在构造白名单的过程中需要保证在不影响用户体验的同时,尽可能杜绝一切不必要的输入内容。
Flash XSS的修复需要对相应的flash进行修改或升级替换。
增加HttpOnly
在cookie中加入httponly属性可以在一定程度上保护用户的cookie,减少出现XSS时损失。
但是如果页面功能中存在使用javascript调用cookie的情况,该属性会拒绝上述操作导致功能无法使用。