一个帮助你PHP反序列化的python工具
终于是写的差不多了,目前先来简单介绍一下项目的整体概况吧
测试版本啦,没有输入的啦,直接在main.py里面放入想分析的php文件即可
EVIL_FUNCTION_PHP=["system","这里写目标危险函数"]
START_METHODS_PHP=["__destruct","__wakeup","这里写整个反序列化链子触法函数"]
FUNC_TO_CALL=[[["函数调用列表"],"对应的魔术方法"]]#这个部分是给以后的代码用的,现在先不用管
这个是解析后的class
[
{
"name": "A",
"methods": [
{
"name": "__construct",
"modifiers": "",
"funcs": [],
"methods": [],
"params": []
},
{
"name": "__destruct",
"modifiers": "",
"funcs": [],
"methods": [
{
"name": "action",
"variable": [
"$this",
"target"
]
}
],
"params": []
}
],
"variables": [
{
"name": "$target",
"modifiers": [
"public"
],
"initial": null
}
],
"calls": null,
"evils": []
},
{
"name": "B",
"methods": [
{
"name": "action",
"modifiers": "",
"funcs": [],
"methods": [],
"params": []
}
],
"variables": [],
"calls": null,
"evils": []
},
{
"name": "C",
"methods": [
{
"name": "action",
"modifiers": "",
"funcs": [
{
"name": "eval",
"params": [
"test",
"$this"
]
}
],
"methods": [],
"params": []
}
],
"variables": [
{
"name": "$test",
"modifiers": [
"public"
],
"initial": null
}
],
"calls": null,
"evils": [
"action"
]
}
]
这个是chains的结构
[
[['A', '__destruct'], ['C', 'action']],
[['类A', '方法A'], ['类B', '方法B']]
]
- 先解析class处理成上面的格式
- 对于每个类都遍历获取到START_METHODS_PHP,这部分写在config中,作为反序列化初始链,每个都存入到chains属性中
- 只要chains属性不为空就遍历,每次pop出一个链子,然后按如下方式分析
- 首先分析这个对应的方法中是否有危险方法,有的话直接把当前的链子压入final_chains
- 然后遍历这个方法中的所有methodcall,看能不能走到别的类的方法中去,如果可以就给链子添加新节点并压入final_chains
- 哦对了需要先分析chains是否存在多次loop,有的话直接弹掉链子(这部分还没实现)
- 直到chains属性为空就可以打印出来最后分析出的chains了
很多东西写着写着觉得太麻烦就简化了,包括部分语法树解析肯定还是有缺陷的,比如目前还没有办法解析include调用,也没办法处理魔术方法的自动调用,后面会一点点更新的
目前就写了这么多,后面会一点点补充功能的,希望师傅们多提issue啊~~~
康桑阿米达~~~
- 解析所有方法调用,echo,include,eval等
- 解析魔术方法自动调用
- loop处理防止死循环
- 针对变量处理(争取完全自动化)
- 针对特殊版本特殊绕过内置