参数获取也有判断需要NEWARGSEX标签提供参数
if has_tag(obj, tags.NEWARGSEX):
args, kwargs = obj[tags.NEWARGSEX]
由于args, kwargs = obj[tags.NEWARGSEX],由于args为一个列表所以要列表包裹,又因为要返回俩个值args, kwargs,所以第二个参数要为空满足条件
而tuple源码中也是从列表中取值所以whoami也要用列表包裹
构造payload:"py/newargsex":["py/set":["whoami"],""]
整体payload如下
{"py/object":"nt.system","py/newargsex":["py/set":["whoami"],""]}
当然如果相加参数需要用字典包裹
{"py/object":"nt.system","py/newargsex":[{"py/set":["type"],"py/set":["2.py"]},""]}
经过调试后面便是system类的创建然后成功执行命令!下面就只需要绕过tuple标签
接 /网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
if has_tag(obj, tags.NEWARGSEX):
args, kwargs = obj[tags.NEWARGSEX]
由于args, kwargs = obj[tags.NEWARGSEX],由于args为一个列表所以要列表包裹,又因为要返回俩个值args, kwargs,所以第二个参数要为空满足条件
而tuple源码中也是从列表中取值所以whoami也要用列表包裹
构造payload:"py/newargsex":["py/set":["whoami"],""]
整体payload如下
{"py/object":"nt.system","py/newargsex":["py/set":["whoami"],""]}
当然如果相加参数需要用字典包裹
{"py/object":"nt.system","py/newargsex":[{"py/set":["type"],"py/set":["2.py"]},""]}
经过调试后面便是system类的创建然后成功执行命令!下面就只需要绕过tuple标签
接 /网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
在 Python 中,所有类都可以定义 new 方法,以下是一些常见的内置类型和对象,它们通常会重载或使用 new 方法:
object: 所有类的基类,其 new 方法负责创建一个新实例。
type: 用于创建新的类,其 new 方法在元类中起作用。
int, float, complex: 数值类型的类,用于创建数值对象。
str, bytes, bytearray: 字符串和字节序列类型的类,用于创建字符串或字节序列对象。
list, tuple, set, frozenset, dict: 容器类型的类,用于创建相应的容器对象。
比如我们可以用map类可以满足条件,又由于loadclass函数里面通过import一个moudle来找到一个方法,我们可以这样来引入命令执行函数builtins.eval以及一些内置类
接 /网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
object: 所有类的基类,其 new 方法负责创建一个新实例。
type: 用于创建新的类,其 new 方法在元类中起作用。
int, float, complex: 数值类型的类,用于创建数值对象。
str, bytes, bytearray: 字符串和字节序列类型的类,用于创建字符串或字节序列对象。
list, tuple, set, frozenset, dict: 容器类型的类,用于创建相应的容器对象。
比如我们可以用map类可以满足条件,又由于loadclass函数里面通过import一个moudle来找到一个方法,我们可以这样来引入命令执行函数builtins.eval以及一些内置类
接 /网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
file后接着具体的文件名 要考虑目录穿越问题
一般后端这样写都是直接通过 os.path.join 直接拼接存在任意文件读取
尝试直接读取当前程序的启动命令查看当前Web应用的绝对路径
直接读取 app.py
发现存在/shell路由可以实现Jinja2模板渲染
考察常见的SSTI注入
经过测试发现 环境不出网不可以写文件
PS:实际上是出网可以通过python反弹shell 环境没有curl,ping命令判断有误呜呜
用户权限是 nobody tmp目录也做了权限限制
导致我们写入回显命令的幻想破灭
这里就要考虑重新寻找基于wsgi的内存马或者Response请求头外带
接 /网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
一般后端这样写都是直接通过 os.path.join 直接拼接存在任意文件读取
尝试直接读取当前程序的启动命令查看当前Web应用的绝对路径
直接读取 app.py
发现存在/shell路由可以实现Jinja2模板渲染
考察常见的SSTI注入
经过测试发现 环境不出网不可以写文件
PS:实际上是出网可以通过python反弹shell 环境没有curl,ping命令判断有误呜呜
用户权限是 nobody tmp目录也做了权限限制
导致我们写入回显命令的幻想破灭
这里就要考虑重新寻找基于wsgi的内存马或者Response请求头外带
接 /网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
写入Server
黑名单过滤
blacklist_patterns = [r'.*length.*', r'.*count.*', r'.*[0-9].*', r'.*\..*', r'.*soft.*', r'.*%.*']
这里过滤了soft 但是过滤直接拼接就是
对于属性和方法的获取通过[]和|attr()过滤器代替
{{lipsum['globals']['builtins']['setattr']((((lipsum|attr('spec'))|attr('init')|attr('globals'))['sys']|attr('modules'))['wsgiref']|attr('simple_server')|attr('ServerHandler'),'server_so''ftware',lipsum['globals']['builtins']['import']('os')['popen']('/readflag')['read']())}}
写入http_version
可以知道 类ServerHandler是基于SimpleHandler而SimpleHandle的父类就是BaseHandler
简单查看发现是在send_preamble实现响应头的写入
因此我们不仅可以控制server_software还可以控制http_version,我们实现了在http_version中回显结果
接 /网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
黑名单过滤
blacklist_patterns = [r'.*length.*', r'.*count.*', r'.*[0-9].*', r'.*\..*', r'.*soft.*', r'.*%.*']
这里过滤了soft 但是过滤直接拼接就是
对于属性和方法的获取通过[]和|attr()过滤器代替
{{lipsum['globals']['builtins']['setattr']((((lipsum|attr('spec'))|attr('init')|attr('globals'))['sys']|attr('modules'))['wsgiref']|attr('simple_server')|attr('ServerHandler'),'server_so''ftware',lipsum['globals']['builtins']['import']('os')['popen']('/readflag')['read']())}}
写入http_version
可以知道 类ServerHandler是基于SimpleHandler而SimpleHandle的父类就是BaseHandler
简单查看发现是在send_preamble实现响应头的写入
因此我们不仅可以控制server_software还可以控制http_version,我们实现了在http_version中回显结果
接 /网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
把010Editor.exe拖进x64dbg,按F9到达主程序入口,发现很多jmp指令,按Shift+D搜索字符串“Evaluation”(上面截图里有),发现有4行可能是注册成功的提示,
任选一个注册成功的地址双击进入代码,发现它们位于同一子程序。拉到上面找到子程序第一句(图里选中了第4句,其实没差别),下个断点然后运行,提示注册信息的界面果然没有弹出来,这说明这段程序就是验证软件是否注册的。选中cmp ebx,DB指令,按Shift+C复制指令码,然后在当前模块按“匹配特征”进行搜索,把十六进制指令码粘贴进去
接 /网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
任选一个注册成功的地址双击进入代码,发现它们位于同一子程序。拉到上面找到子程序第一句(图里选中了第4句,其实没差别),下个断点然后运行,提示注册信息的界面果然没有弹出来,这说明这段程序就是验证软件是否注册的。选中cmp ebx,DB指令,按Shift+C复制指令码,然后在当前模块按“匹配特征”进行搜索,把十六进制指令码粘贴进去
接 /网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
phpmyadmin<4.8.3 XSS挖掘
前言
最近在审计phpmyadmin的时候发现了一个XSS漏洞,后来发现在版本大于4.8.3以后该漏洞被修复了。看了下之前公布的CVE,有个CVE和此漏洞很相似但没有漏洞细节,于是乎便有了这篇文章。
准备
需要的环境
phpmyadmin 4.8.2
phpstorm
phpstudy(xdebug)
配置xdebug
首先下载xdebug,将phpinfo信息复制到在线向导中,根据提示下载dll文件, php.ini开启xdebug的配置如下。
xdebug.remote_enable=1 # 开启远程调试
xdebug.idekey='PHPSTORM' # sessionkey
xdebug.remote_port=9001 # 远程调试通信端口
zend_extension = D:\phpStudy\PHPTutorial\php\php-7.2.1-nts\ext\php_xdebug-2.9.4-7.2-vc15-nts.dll
漏洞细节
先决条件
在审计phpmyadmin时,我比较关注$GLOBALS全局变量,该变量存储了本次请求的信息、phpmyadmin基本设置信息和phpmyadmin配置文件信息等。先看看/libraries/classes/Server/Privileges.php::3977的以下代码。
foreach ($row as $key => $value) {
$GLOBALS[$key] = $value;
}
很明显,该处是$GLOBALS的赋值操作,而$row来自于对mysql.user表的查询结果,且$user_host_condition可控,
/libraries/classes/Server/Privileges.php::3966行
既然上述代码会将mysql.user中符合条件的行的列名和值写入$GLOBALS中,我们便可通过添加mysql.user的列来往$GLOBALS中写入任意键值。清楚思路后,我们看看哪里调用了Privileges.php的getDataForChangeOrCopyUser函数,发现在server_privileges.php::178中对该函数有调用。
接 /网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
前言
最近在审计phpmyadmin的时候发现了一个XSS漏洞,后来发现在版本大于4.8.3以后该漏洞被修复了。看了下之前公布的CVE,有个CVE和此漏洞很相似但没有漏洞细节,于是乎便有了这篇文章。
准备
需要的环境
phpmyadmin 4.8.2
phpstorm
phpstudy(xdebug)
配置xdebug
首先下载xdebug,将phpinfo信息复制到在线向导中,根据提示下载dll文件, php.ini开启xdebug的配置如下。
xdebug.remote_enable=1 # 开启远程调试
xdebug.idekey='PHPSTORM' # sessionkey
xdebug.remote_port=9001 # 远程调试通信端口
zend_extension = D:\phpStudy\PHPTutorial\php\php-7.2.1-nts\ext\php_xdebug-2.9.4-7.2-vc15-nts.dll
漏洞细节
先决条件
在审计phpmyadmin时,我比较关注$GLOBALS全局变量,该变量存储了本次请求的信息、phpmyadmin基本设置信息和phpmyadmin配置文件信息等。先看看/libraries/classes/Server/Privileges.php::3977的以下代码。
foreach ($row as $key => $value) {
$GLOBALS[$key] = $value;
}
很明显,该处是$GLOBALS的赋值操作,而$row来自于对mysql.user表的查询结果,且$user_host_condition可控,
/libraries/classes/Server/Privileges.php::3966行
既然上述代码会将mysql.user中符合条件的行的列名和值写入$GLOBALS中,我们便可通过添加mysql.user的列来往$GLOBALS中写入任意键值。清楚思路后,我们看看哪里调用了Privileges.php的getDataForChangeOrCopyUser函数,发现在server_privileges.php::178中对该函数有调用。
接 /网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke