文章目录
- 1、输入验证和输出显示
- 2、命令注入(Command Injection)
- 3、eval 注入(Eval Injection)
- 4、跨网站脚本攻击(Cross Site Scripting, XSS)
- 5、SQL 注入攻击(SQL injection)
- 6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)
- 7、Session 会话劫持(Session Hijacking)
- 8、Session 固定攻击(Session Fixation)
- 9、HTTP 响应拆分攻击(HTTP Response Splitting)
- 10、文件上传漏洞(File Upload Attack)
- 11、目录穿越漏洞(Directory Traversal)
- 12、远程文件包含攻击(Remote Inclusion)
- 13、动态函数注入攻击(Dynamic Variable Evaluation)
- 14、URL 攻击(URL attack)
- 15、表单提交欺骗攻击(Spoofed Form Submissions)
- 16、HTTP 请求欺骗攻击(Spoofed HTTP Requests)
1、输入验证和输出显示
大多数漏洞的形成原因主要都是未对输入数据进行安全验证或对输出数据未经过安全处
理,比较严格的数据验证方式为:
对数据进行精确匹配
接受白名单的数据
拒绝黑名单的数据
对匹配黑名单的数据进行编码
在 PHP 中可由用户输入的变量列表如下,我们应该对这些输入变量进行检查:
$_SERVER
$_GET
$_POST
$_COOKIE
$_REQUEST
$_FILES
$_ENV
$_HTTP_COOKIE_VARS
$_HTTP_ENV_VARS
$_HTTP_GET_VARS
$_HTTP_POST_FILES
$_HTTP_POST_VARS
$_HTTP_SERVER_VARS
2、命令注入(Command Injection)
PHP 中可以使用下列 5 个函数来执行外部的应用程序或函数
system、exec、passthru、shell_exec、(与 shell_exec 功能相同)
使用方式
string system(string command, int &return_var)
command 要执行的命令
return_var 存放执行命令的执行后的状态值
string exec (string command, array &output, int &return_var)
command 要执行的命令
output 获得执行命令输出的每一行字符串
return_var 存放执行命令后的状态值
void passthru (string command, int &return_var)
command 要执行的命令
return_var 存放执行命令后的状态值
案例
将下面代码放在服务器,我们在浏览器访问
//ex1
<?php
$ip = $_GET["ip"];
if (isset($ip))
{
echo "<pre>";
system("ping ".$ip);
echo "</pre>";
}
?>
可以看到执行了ping命令
由于它没有对 ip 参数进行任何验证或过滤,恶意用户可以通过在 URL 中添加特殊字符来执行任意命令
3、eval 注入(Eval Injection)
eval 函数将输入的字符串参数当作 PHP 程序代码来执行
将下面代码放在服务器,我们在浏览器访问
//ex2
<?php
$var = "var";
if (isset($_GET["arg"]))
{
$arg = $_GET["arg"];
eval("\$var = $arg;");
echo "\$var =".$var;
}
?>
当我们把传递的参数值改为phpinfo的时候,漏洞就产生了
防范方法
1、尽量不要执行外部命令
2、使用自定义函数或函数库来替代外部命令的功能
3、使用 escapeshellarg 函数来处理命令参数
4、使用 safe_mode_exec_dir 指定可执行文件的路径
esacpeshellarg 函数会将任何引起参数或命令结束的字符转义,单引号“’”,替换成“\’”,双引号““”,替
换成“””,分号“;”替换成“;”
用 safe_mode_exec_dir 指定可执行文件的路径,可以把会使用的命令提前放入此路径内
4、跨网站脚本攻击(Cross Site Scripting, XSS)
反射型跨站常常出现在用户提交的变量接受以后经过处理,直接输出显示给客户端;存储
型跨站常常出现在用户提交的变量接受过经过处理后,存储在数据库里,然后又从数据库中读取
到此信息输出到客户端。输出函数经常使用:echo、print、printf、vprintf、<%=$test%>
这里用pikachu的存储型代码进行分析
这段代码它没有对用户输入的留言进行任何验证或过滤,因此可能会受到存储型跨站脚本攻击(Stored XSS Attack)的威胁。存储型跨站脚本攻击是一种常见的网络攻击方式,攻击者通过在网页中插入恶意脚本,来窃取用户信息或破坏网页内容1
5、SQL 注入攻击(SQL injection)
SQL 注入攻击(SQL Injection),是攻击者在表单中提交精心构造的 sql 语句,改动原来的 sql 语句,如
果 web 程序没有对提交的数据经过检查,那么就会造成 sql 注入攻击。
1、攻击者访问有 SQL 注入漏洞的站点,寻找注入点
2、攻击者构造注入语句,注入语句和程序中的 SQL 语句结合生成新的 sql 语句
3、新的 sql 语句被提交到数据库中执行 处理
4、数据库执行了新的 SQL 语句,引发 SQL 注入攻击
SQL 注入因为要操作数据库,所以一般会查找SQL 语句关键字:
insert、delete、update、 select
查看传递的变量参数是否用户可控制,有无做过安全处理,可以使用参数化查询防范
6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)
跨站请求伪造攻击,是攻击者伪造一个恶意请求链接,通过各种方式让正常用户访问后,
会以用户的身份执行这些恶意的请求。我们应该对比较重要的程序模块,比如修改用户密码,添 加用户的功能进行审查,检查有无使用一次性令牌防御
csrf 攻击。
7、Session 会话劫持(Session Hijacking)
会话劫持是指攻击者利用各种手段来获取目标用户的 session id。一旦获取到 session id,那么攻击者可以利用目标用户的身份来登录网站,获取目标用户的操作权限。
服务端和客户端之间是通过 session(会话)来连接沟通。当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session。
每个用户的 session 都是独立的,并且由服务器来维护。 每个用户的 session是由一个独特的字符串来识别,成为session id。用户发出请求时,所发送的 http 表头内包含 session id 的值。
服务器使用 http 表头内的session id 来识别时哪个用户提交的请求。
session 保存的是每个用户的个人数据,一般的 web 应用程序会使用session 来保存通过验证的用户 账号和密码。在转换不同的网页时,如果需要验证用户身份,就是用 session内所保存的账号和密码来比较。
session 的生命周期从用户连上服务器后开始,在用户关掉浏览器或是注销时用户session_destroy 函数删除 session 数据时结束。如果用户在 20 分钟内没有使用计算机的动作,session也会自动结束。
8、Session 固定攻击(Session Fixation)
如果当权限级别改变时(例如核实用户名和密码后,普通用户提升到管理员),我们就应该
修改即将重新生成的会话 ID,否则程序会面临会话固定攻击的风险。
9、HTTP 响应拆分攻击(HTTP Response Splitting)
HTTP 响应拆分是由于攻击者经过精心设计利用电子邮件或者链接,让目标用户利用一个请求产生两个响应,前一个响应是服务器的响应,而后一个则是攻击者设计的响应。此攻击之所以会发生,是因为 WEB程序将使用者的数据置于 HTTP 响应表头中,这些使用者的数据是有攻击者精心设计的。
可能遭受 HTTP 请求响应拆分的函数包括以下几个:
header(); setcookie(); session_id(); setrawcookie();
注意
PHP 的高版本会禁止 HTTP 表头中出现换行字符,这类可以直接跳过本测试
10、文件上传漏洞(File Upload Attack)
PHP 文件上传通常会使用 move_uploaded_file,也可以找到文件上传的程序进行具体分析
防范方式:
使用白名单方式检测文件后缀
上传之后按时间能算法生成文件名称
上传目录脚本文件不可执行
注意%00截断