Webhacking.kr old-30

Challenge

Understand database connection hijacking through upload configuration.

分析通过上传配置劫持数据库连接的机制。

1
http://webhacking.kr:10003/

Analysis

入口每次请求都会分配一个会话专属目录,并把上传的表单指向它:

1
2
Your personal directory is ./upload/<random>/
./upload/<random>/index.php?view_source=1

该目录里预置的 index.php 源码(实测):

1
2
3
4
5
6
7
8
9
<?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):

1
php_value auto_prepend_file /flag

然后请求会话目录的 index.php:

1
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?}