Challenge
Understand database connection hijacking through upload configuration.
分析通过上传配置劫持数据库连接的机制。
http://webhacking.kr:10003/Analysis
入口每次请求都会分配一个会话专属目录,并把上传的表单指向它:
Your personal directory is ./upload/<random>/./upload/<random>/index.php?view_source=1该目录里预置的 index.php 源码(实测):
<?php if($_GET['view_source']) highlight_file(__FILE__); $db = mysqli_connect() or die(); mysqli_select_db($db,"chall30") or die(); $result = mysqli_fetch_array(mysqli_query($db,"select flag from chall30_answer")) or die(); if($result[0]){ include "/flag"; }?>无参数 mysqli_connect() 会读取 mysqli.default_host / default_port / default_user / default_pw。原意是用上传的配置覆盖这些值,把连接指向自建 MySQL,让 chall30_answer.flag 非空,从而走进 include "/flag"。
上传行为实测:内容里的 < 会被剥掉,所以落不了带 PHP 标签的 webshell;.php 会被当 PHP 执行但没标签也没用;.htaccess 能上传成功(直接 GET 是 403)。
Solution
不必自建 MySQL:.htaccess 的 php_value 就能改 PHP 配置,其中 auto_prepend_file 会在目录内每个脚本执行前先包含一个文件。把它指向 /flag,该目录的 index.php 一执行就先把 /flag 的内容打出来,mysqli_connect() 成不成功都不影响。
向入口上传 .htaccess(表单字段 upfile,action=index.php):
php_value auto_prepend_file /flag然后请求会话目录的 index.php:
GET /upload/<dir>/index.php -> FLAG{uhoh-db-connection-hijacking?}判据:php_value auto_prepend_file /flag 单独放 .htaccess 即可生效;换成 auto_append_file 不生效(脚本在 mysqli_connect() or die() 处就结束了);把 .htaccess 覆盖成注释后 flag 消失,说明确实是 .htaccess 在起作用。
FLAG{uhoh-db-connection-hijacking?}