CSRF(跨站请求伪造)
通过伪装成受信任用户的请求,欺骗浏览器去执行攻击者预设的操作,如转账、修改邮箱地址、修改密码等。如果受害者拥有管理员权限,CSRF攻击甚至可能危及整个网站的安全。
成因
Web身份验证机制的固有弱点:浏览器会自动、无声地将用户的认证凭证(如Cookie、HTTP Basic Auth等)附加到每一个发往对应站点的请求中。
挖掘
用户资料修改(邮箱、密码)
资金转账(金融类应用)
内容发布/删除(博客、社交媒体、后台系统)
购买商品(电商平台)
任何其他需要权限才能执行的操作
利用方式
GET请求型CSRF
这是最简单的一种,通常利用<img>, <iframe>, <script>, <link> 等标签的src属性,或者<a>链接,自动发起GET请求。
<!-- 假设银行转账接口是GET请求 --> |
用户只要访问这个页面,浏览器就会尝试加载图片,从而无声地发送转账请求。
POST请求型CSRF
对于使用POST请求的操作,攻击者需要构造一个表单,并用JavaScript自动提交。
<body onload="document.forms[0].submit()"> |
SSRF(服务器端请求伪造)
攻击者诱使服务器向其指定的内部或外部网络资源发起一个非本意的HTTP请求。
成因
应用提供了“让服务器代发请求”的功能,但未对用户传入的目标地址做严格限制,导致攻击者可以操纵服务器向任意地址(包括内部系统)发起请求。
挖掘
远程图片加载/下载:头像设置、文章插图、通过URL上传图片。
网页抓取/预览:SEO分析工具、网址安全检测、第三方分享预览。
文件处理:Office在线预览(会下载链接的文件)、PDF生成器(会获取链接的内容渲染到PDF里)。
API集成/Webhook:在设置中填写一个Webhook回调地址,测试服务器是否会向该地址发送测试请求。
从URL导入数据: RSS订阅、邮件客户端添加订阅、数据迁移工具。
SSO/OAuth认证:有时在认证流程中,服务器会向认证服务器发起请求。
利用
常见协议:file:// , dict:// , gopher://
进行端口探测:?url=dict://127.0.0.1:1234
?url=dict://127.0.0.1:3306
读取本地文件:
?url=file://C:\Windows\system32\drivers\etc\hosts
内网web应用指纹识别 :识别内网应用使用的框架,平台,模块以及cms 可以为后续的渗透测试提供很多帮助。大多 数web 应用框架都有一些独特的文件和目录。通过这些文件可以识别出应用的类型,甚至详 细的版本。根据这些信息就可以针对性的搜集漏 进 攻击。比如可以通过访问下列 文件来 判断phpMyAdmin是否安装以及详细版本。 ?url=http://localhost/phpmyadmin/README
配合redis实现写入webshell
相关函数
php中
file_get_contenes()
fsockopen()
curl_exec()
fopen()
危害
端口扫描
内网Web应用指纹识别
攻击内网Web应用
读取本地文件
防御
白名单校验域名和协议;
禁用不必要的协议(如file://, gopher://);
统一出口网络并严格过滤;
不要返回原始响应给客户端。
XSS与CSRF的区别
XSS是跨站脚本攻击,主要核心成因是JavaScript代码能做的事XSS都能做,可以实现传播不当舆情、打开摄像头、截图等危险操作
CSRF是什么
多用于攻击受害者非本意的操作,修改密码、重启设备等操作
文件包含(例如:将文件当做php文件执行)
文件包含漏洞是指应用程序在通过动态包含函数(如PHP中的 include, require, include_once, require_once)引入文件时,由于未对用户传入的文件名参数进行严格的校验,使得攻击者能够操控包含的文件路径,从而读取敏感文件或执行任意代码的安全漏洞。
相关函数
include() 多次包含
include_once() 次包含
require() 多次包含
require_once() 次包含
本地文件包含
攻击者能够包含并读取服务器本地的任意文件。
危害
敏感信息泄露: 读取系统敏感文件,如密码文件、应用程序源码、配置文件等。
配合文件上传getshell: 如果网站存在文件上传功能,攻击者可以上传一个包含恶意代码的图片马,然后通过LFI去包含这个图片马,从而执行其中的代码。
读取源码辅助审计: 读取PHP等源码文件,进行代码审计,寻找其他漏洞。
利用伪协议: 配合PHP封装协议(如 php://filter)来读取源码,而不是直接执行。
读取etc目录下的passwd文件 |
上传图片马:图片马内写有一句话木马
通过LFI包含图片马文件,攻击者可传入参数然后执行木马 |
远程文件包含
攻击者可以包含一个远程服务器上的文件(通常是恶意脚本)并执行。
但需要PHP配置满足以下条件:
allow_url_fopen = On
allow_url_include = On
危害
直接执行任意代码: 攻击者可以直接在服务器上执行命令,完全控制服务器。
webshell: 直接获取一个交互式的Webshell。
文件读取
目的是获取文件的内容数据,通常作为字符串或二进制流来处理。程序不会主动执行这些内容。
相关函数
fopen()
file_get_contents()
任意文件下载
存在读取文件的函数
读取文件的路径客户端可控
没有对文件类型进行校验或者校验不严
没有对文件路径进行校验或者校验不严
输出了文件的内容
1、演示csrf漏洞配合存储型XSS修改其他用户密码
本次测试是在dvwa靶场的low等级
首先登录 dvwa 靶场的 admin 用户,然后修改密码为123456

接着复制修改密码的url
http://192.168.142.144/dvwa-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change# |
到存储型XSS界面添加一条留言,内容是
<img src="http://192.168.142.144/dvwa-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#" border="8" style="display:none;" /> |
接下来切换用户 1337 原登录密码是 charley,使用 1337 用户访问存储型XSS的页面,这时候 1337 的用户密码已经被修改了

重新登陆尝试,登录失败

从数据库中查看用户名密码情况,发现admin用户和1337用户密码相同,说明1337用户密码被修改

2、使用ssrf漏洞读取操作系统敏感文件
首先观察pikachu靶场的SSRF_CURL页面,发现页面通过url访问了一个本地文件
http://192.168.142.144/pikachu-master/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu-master/vul/ssrf/ssrf_info/info1.php |

删掉后续的路径,尝试访问一下mysql的3306端口
http://192.168.142.144/pikachu-master/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1:3306 |
查看后端代码,发现使用curl_exec进行请求,但是这个函数还支持其他协议有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
if(isset($_GET['url']) && $_GET['url'] != null){ |
那么这里尝试使用file协议去读取服务器的 hosts 文件
http://192.168.142.144/pikachu-master/vul/ssrf/ssrf_curl.php?url=file://C:\Windows\system32\drivers\etc\hosts |

3、演示文件包含漏洞配合图片木马的使用过程
首先进行图片马的制作
使用Windows命令行(CMD)
copy picture.jpg/b+ma.php/a yjhmm.jpg |

查看yjhmm.jpg文件,发现能够正常查看

使用010editor工具
使用010editor工具打开图片文件,然后在文件末尾添加一句话木马

2.png,也能够正常查看

上传含有木马的图片文件,能够正常显示

首先将文件放在pikachu靶场的目录中

在pikachu靶场使用本地文件包含

使用远程文件包含
要求
在php的配置文件中打开 allow_url_include = On

首先在另一台Windows10虚拟机开启phpstudy,然后将图片马复制到根目录下,然后使用pikachu靶场的远程文件包含

4、演示文件包含和文件读取的区别
文件读取
目的是获取文件的内容数据,通常作为字符串或二进制流来处理。程序不会主动执行这些内容。
常用函数
PHP: file_get_contents(), fread(), fopen() + fgets()
Python: open().read()
Java: FileInputStream, BufferedReader
Node.js: fs.readFile()
以PHP语言的 fopen() 函数为例
首先写一个 txt 文件,内容是
phpinfo(); |

编写另一个php文件
<meta charset="utf-8"> |
输出

文件读取是将文件中的内容当做数据来处理而不是当做代码来处理
文件包含
目的是将另一个文件的代码合并到当前文件中执行,是为了代码复用和模块化。
以pikachu靶场为例,在靶场中文件包含是将文件当做php代码来执行,当使用图片马时连jpg后缀的文件都被当做php文件执行然后执行了jpg文件中的PHP代码。

